[ bobby63 @ 07.03.2010. 00:16 ] @
Nikako ne mogu da uradim, pretpostavljam, uzasno prostu stvar.

Imam array stringova koje hocu da odstampam na ekranu u vise redova uz pomoc Outtext. Ali nikako ne mogu da provalim kako da element string arraya nateram da se pojavi u Textout
Ovo npr radi:
Code:
wchar_t TxtMessage[]=_T("Ready");
TextOut(hdc, 5, 5 + 15*i, TxtMessage, _tcslen(TxtMessage));

a meni bi trebalo nesto kao:
Code:
wstring  my_string = strMessage[i];
wchar_t TxtMessage[] = my_string.c_str();

TextOut(hdc, 5, 5 + 15*i, TxtMessage, _tcslen(TxtMessage));

sto daje gresku:
Code:
Error    1    error C2440: 'initializing' : cannot convert from 'const wchar_t *' to 'wchar_t []'

Mora da bude unicode.

Probao sam sve kombinacije koje sam izguglao ali dobijam samo razlicite greske, sto ce reci da nesto fundamentalno ne razumem.

Poz svima i unapred hvala
[ Mihajlo Cvetanović @ 07.03.2010. 08:58 ] @
TxtMessage ti ne treba. Probaj TextOut(hdc, 5, 5 + 15*i, my_string.c_str(), my_string.size());

Inače, TxtMessage je trebalo da bude const wchar_t*, kakvog je i tipa funkcija wstring::c_str().
[ bobby63 @ 07.03.2010. 12:57 ] @
Hvala puno, Imas od mene pivo i cokoladu :)

Oba predloga rade a meni sada treba samo ova jedna linije
Code:
TextOut(hdc, 5, 5 + 15*i, strMessage[i].c_str(), strMessage[i].size());
[ bobby63 @ 18.03.2010. 13:52 ] @
Pozz svima.

Da ne postavljam novu temu.

Taman sam zavrsio program kada sam primetio da nemam nasa slova!
U medjuvrenu sam provalio da treba da koristim TextOutW.
Evo koda:
Code:
wstring test = L"šđčćž ŠĐČĆŽ";
TextOutW(hdc, 5, 5 + 15*i, test.c_str(), test.size());
a dobijam "||||| |||||"

U cemu gresim?

Unapred hvala.
[ Mihajlo Cvetanović @ 18.03.2010. 14:39 ] @
"Pismo" koji se koristi u programskom jeziku C++ ne sadrži slova van ASCII područja, a umesto njih moraš da koristiš C escape sekvence. Probaj s ovom linijom:

wstring test = L"\x0161\x0111\x010D\x0107\x017E \x0160\x0110\x010C\x0106\x017D";
[ bobby63 @ 19.03.2010. 11:03 ] @
Hvala na odgovoru mada moram da priznam da mi tek sada nista nije jasno :(

Na primer, ovo ne radi:
Code:
wstring test = L"\x0161\x0111\x010D\x0107\x017E \x0160\x0110\x010C\x0106\x017D"";
TextOutW(hdc, 5, 5 + 15*i, test.c_str(), test.size());
Izlaz je "||||| |||||"

Ali ako stavim ovako:
Code:
TextOutW(hdc, 5, 5 + 15*i, L" \x0161\x0111\x010D\x0107\x017E \x0160\x0110\x010C\x0106\x017D ", 18);
Onda je izlaz "|đčć| |ĐČĆ|".

Ako saljem neki text kontroli onda su nasi znaci OK ??????
Ovo npr. radi dobro, tj daje u tom dijalogu nase znake"
Code:
wstring Text;
Text = L"ŠĐČĆŽ šđčćž";
SetDlgItemText(hDlg, IDC_PORUKA, Text.c_str());


Voleo bih da mi je jasno, ali ne uspevam ovde da vidim neku logiku :(

Ostatak programa sam zavrsio i sve radi OK ali sam se potpuno zaglavio oko nasih znakova.
[ Mihajlo Cvetanović @ 19.03.2010. 11:46 ] @
Meni je misterija zašto prvi i drugi slučaj daju različite rezultate. Debaguj program korak po korak u prvom slučaju, i kad dođeš do TextOutW pogledaj sadržaj teksta. Da li debager lepo ispisuje tekst?

Moguć razlog zašto ima razlike između drugog i trećeg slučaja je font. Pre nego što hoćeš da ispisuješ tekst u neki HDC moraš da postaviš font, i taj font mora da podržava slova koja hoćeš da ispišeš. Default font verovatno ne podržava sva naša slova.
[ bobby63 @ 19.03.2010. 13:00 ] @
U debugeru je text super tj. svi nasi znaci su tu.

Problem je onda font.

Ovo mi je palo ranije na pamet ali nisam uzpeo da provalim niti da izguglam kako se setuje font za TextOut.
Skapirao sam kako se menja boja texta i pozadine.

Ali nemam predstavu kako da setujem neki unicode font za TextOut?

Aplikacija je Visual Studio 2008 c++ "win32 project" i sve ide preko winapi.

[ Mihajlo Cvetanović @ 19.03.2010. 14:39 ] @
Preko SelectObject se postavlja font, a font se pravi recimo sa CreateFontIndirect. Imaš i mogućnost da pobrojiš sve fontove sa traženim karakteristikama sa EnumFontFamiliesEx. Shell font (ili sistemski font) se vodi pod imenom "MS Shell Dlg 2", ali ne znam kako sve to zajedno radi, pogledaj u MSDN-u.
[ bobby63 @ 19.03.2010. 20:47 ] @
Probacu da nadjem nesto pa ako uspem postavljam ovde.

Slaba vajda os MSDN, ja barem nikad nisam nasao nista korisno tamo, ali pogledacu u svakom slucaju.

Hvala u svakom slucaju.
[ deerbeer @ 19.03.2010. 21:07 ] @
Code:


// Lucia Sans Unicode je unicode font . npr, mozes i ostale da pronadjes nije jedini 
//velicina je 14  

// uzasna LOGFONT struktura ..... 
LOGFONT LogFont ; 
HDC hDC = ::GetDC(NULL);
int nLogPixelsY = GetDeviceCaps(hDC, LOGPIXELSY);
::ReleaseDC( NULL, hDC );

LogFont.lfCharSet = DEFAULT_CHARSET ; 
LogFont.lfQuality = DEFAULT_QUALITY ; 
LogFont.lfClipPrecision = CLIP_DEFAULT_PRECIS ; 
LogFont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
LogFont.lfOutPrecision = OUT_DEFAULT_PRECIS ; 
LogFont.lfUnderline = FALSE ; 
LogFont.lfStrikeOut = FALSE ; 
LogFont.lfItalic = FALSE ; // ITALIC flag 
LogFont.lfWeight = FW_NORMAL ; //moze i FW_BOLD 
LogFont.lfOrientation = 0 ; 
LogFont.lfEscapement = 0 ; 
_tcsncpy (LogFont.lfFaceName,_T("Lucia Sans Unicode"), LF_FACESIZE);
LogFont.lfFaceName[LF_FACESIZE-1] = TEXT('\0');  // Ensure null termination
LogFont.lfHeight = 14 * nLogPixelsY / 72;; // 14 velicina fonta .. 
LogFont.lfWidth = 0; 

// kreiras font od LOGFONT strukture 
HFONT hFont =  ::CreateFontIndirect(&LogFont) ;  

// m_hWnd je handle od tvog prozora gde ispiusujes text  
hDC = ::GetDC(m_hWnd) ; 

//setujes font na device context i uzimas tekuci .. 
HFONT hOldFont = SelectObject (hDC , hFont) ; 

// inicijalizujes RECT za racunanje  okvira  texta 
RECT rc; SetRect (0,0,0,0) ; 

// racuna samo okvir texta . moze i bez ovoga ako unapred znas koliko text zauzima .
DrawText (hDC ,_T("Neki latinicni text") , -1 ,&rc,DT_CALCRECT) ;  

//ispisivanje left-align text pogledaj na msdnu ostale flagovce za poravnanje . 
DrawText (hDC,_T("Neki latinicni text") ,-1 .&rc, DT_LEFT ) ; 

// vracas stari selektovani font kad zavrsis sa ispisom texta 
SelectObject (hDC,hOldFont) ; 

//oslobadjanje device contexta 
ReleaseDC(m_hWnd,hDC) ; 

[ bobby63 @ 20.03.2010. 19:58 ] @
Hvala na ovom kodu, nisam jos uspeo da ga napravim da radi ali cu poraditi na tome.

U kontrolama imam sve naše znakove "šđčćž ŠĐČĆŽ"

U TextOut sa escape codovima dobijam "|đčć| |ĐČĆ|" tj fale šŠ i ŽŽ

Kada upisujem nesto u fajl (binary) takodje dobijam "|đčć| |ĐČĆ|" tj fale šŠ i ŽŽ

Pretpostavljam da jos nešto treba da se setuje da dobijem sve naše znakove ???????????
[ Mihajlo Cvetanović @ 20.03.2010. 20:28 ] @
I taj rezultat je misterija. Ranije fontovi nisu imali sva slova, pa je bilo situacija da se vide Š i Ž, ali da slova Č i Ć nema (slovo Đ je postojalo, ali đ je bilo neko uvrnuto). Ovo kod tebe je suprotna situacija. Ali mogli bismo da pođemo od problema sa fajlom. Kažeš da se problem javlja i kad upisuješ slova u fajl. Možda pogrešnim fontom prikazuješ slova koja su u fajlu. Promeni font u editoru.

Priloži ovde fajl u kome su pogrešna slova, pa da i mi to proverimo.
[ bobby63 @ 20.03.2010. 21:27 ] @
Moja glupost nevidjena!

Fajlove sam gledao u listeru total commandera.

U notepadu nemam novi red ali imam sva slova a u wordpadu je sve ok.

U programu sam pre upisa dodao ono:
Code:
wchar_t BOM = 0xFEFF;
out.write((char *) &BOM,sizeof(wchar_t));

Evo fajla.
[ Mihajlo Cvetanović @ 20.03.2010. 22:55 ] @
Fajl je u redu, UTF-16, to jest Unicode. Znači, verovatno je problem u fontu. Taj BOM (Byte Order Mark) je marker na početku fajla koji označava kog je Unicode formata fajl. Postoji samo 5 BOM-ova, za 5 tipova fajla: UTF-8, UTF-16BE, UTF-16LE, UTF-32BE, UTF-32LE. U Windowsu se najčešće koriste UTF-8 i UTF-16LE (što je default UTF-16 za Windows).