Newsgroup: it.comp.programmare.win32
Titolo: [API][GDI] Problemi con la versione Release

Ho una semplice applicazione Windows creata con le API e il Visual
Studio 2003. Si tratta di una semplice finestra client con del testo
visualizzato. Se compilo normalmente con la versione Debug tutto
funziona correttamente, se compilo in versione Release il testo viene
visualizzato correttamente ma appena provo a ridimensionare la
finestra il testo scompare, o se ne vede solo una parte o si "deforma"
tutto. Riduco a icona e riapro e tutto si rivede normale, ma appena
reingrandisco o ridimensiona la finestra ecco che ritornano i
problemi. Ho totato che se disegno del testo fisso (passando
TEXT("testo da visualizzare")) non accadono problemi, idem se passo
del normale testo contenuto in una static TCHAR szTesto [10].
Se pero' questa TCHAR la passo a una funzione che la elabora (la
funzione accetta TCHAR * szTesto) ritornano i problemi. Posto un po'
di codice utile. 
Sinceramente mi ero accorto di questo problema anche un po' di tempo
fa, ma poi ho lasciato stare. Ed era capitato anche con altri oggetti
GDI come pennelli e penne.
Grazie e mille per le informazioni utili su come risolvere il
problema.
Codice:
...
case WM_PAINT:
		hdc = BeginPaint (hwnd, &ps);
		CreateText (TEXT("PROGRAMMA BASE DI PROVA"), itop (50,
			50), RGB (0, 0, 255), RGB (255, 255, 255), 
			18, 200, 0, 0, 0, TEXT("Comic Sans MS"), hwnd,
			 hdc, FALSE);
		DoubleToString (timer.Time(), 0, tempo);
 //timer.Time() e' un valore double che varia al variare del tempo.
		CreateText (tempo, itop (230, 120), RGB (255, 0, 255),
			 RGB (255, 255, 255), 16, 0, 0, 0, 0,
			 TEXT("Times New Roman"), hwnd, hdc, FALSE);
		EndPaint (hwnd, &ps);
		return 0;	
...
Nota: le due funzioni sono di mia creazione... non sono un gran che'
ottimizzate ma fanno il loro lavoro.
//DOUBLETOSTRING
void DoubleToString (double value, int count, TCHAR * szString)
{
	//converte il double in una stringa. la virgola e' espressa
	// con il '.'
	int dec = 0, sign = 0, i = 0, l = 0, j = 0;
	char * szNum = NULL;
	lstrcpy (szString, TEXT("0.0"));
 
	if (value != 0) {
		szNum = _fcvt (value, count, &dec, &sign);
		l = (int) strlen (szNum) + 1;
		if (sign) {
			szString [0] = (TCHAR) '-';
			dec++;
			l++;
			i++;
		}
		sign = 0;
		for (i; i < l; i++) {
			if (i != dec)
				szString [i] = (TCHAR) szNum [j];
			else {
				if (count > 0) {
					szString [i] = (TCHAR) '.';
					i++;
				}
				sign = 1;
				szString [i] = (TCHAR) szNum [j];
			}
			if (sign != 0) sign++;
			j++;
		}
		if ((sign != 0) && (sign < dec))
			szString [i++] = (TCHAR) '0';
		szString [i++] = (TCHAR) 0x00;
	}
}
...
//CREATETEXT
BOOL CreateText (TCHAR * szText, POINT pos, COLORREF TextColor,
		 COLORREF TextSfondo, int Height, int Grassetto, int
		 Italic, int Underline, int StrikeOut, TCHAR *
		 szFontName, HWND hwnd, HDC hdc, int trunc) {
	//scrive il testo con le impostazioni date e ritorna true se 	
	//l'operazione finisce corretamente
	//trunc != 0 indica la posizione in pixel massima per scrivere
	// (dopodiche tronca la stringa)
	HFONT hFont;
	LOGFONT lf;
	SIZE size;
	TCHAR szTrunc [MAX_PATH] = TEXT("0");
	int dim = 0;
	//imposta il font logico
	lf.lfHeight = Height;
	lf.lfWeight = 0;
	lf.lfEscapement = 0;
	lf.lfOrientation = 0;
	lf.lfWeight = Grassetto;
	lf.lfItalic = Italic;
	lf.lfUnderline = Underline;
	lf.lfStrikeOut = StrikeOut;
	lf.lfCharSet = SHIFTJIS_CHARSET;
	lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;
	lf.lfQuality = 0;
	lf.lfPitchAndFamily = 0 | FW_DONTCARE;
	lstrcpy (lf.lfFaceName, szFontName);	
	hFont = CreateFontIndirect (&lf);
	SetTextColor (hdc, TextColor);
	SetBkColor (hdc, TextSfondo);
	SelectObject (hdc, hFont);
 
	//controlla per il troncamento della stringa
	lstrcpy (szTrunc, szText);
	dim = (int) lstrlen (szTrunc);
	if (trunc) {
		GetTextExtentPoint32 (hdc, szText, dim, &size);
		if (
size.cx
 >= trunc) {
			trunc = (int) (trunc * dim) / 
size.cx
;
			dim = trunc + 1;
			szTrunc [trunc] = (TCHAR) 0x00;
			szTrunc [trunc--] = (TCHAR) '.';
			szTrunc [trunc--] = (TCHAR) '.';
			szTrunc [trunc--] = (TCHAR) '.';
		}
	}
	//scrive il testo	
	TextOut (hdc, pos.x, pos.y, szTrunc, dim);
	//DeleteObject (hFont);
	DeleteObject (hFont);
	return TRUE;
}
-- 
Scritto da Gordon
E-mail: 
lordg...@despammed.com

 DeleteObject (hFont);
non so se è questo il problema,ma prima riseleziona il font originale del dc
ciao

non so se è questo il problema,ma prima riseleziona il font originale del dc
provero'.
cmq oggi ho fatto un po' di test e ho notato che il problema sta nella
funzione DoubleToString, esattamente nella gestione del TCHAR. Se non
uso la funzione tutto va bene. Non capisco pero' come si possa gestire
la cosa se non in quel modo.


"gordon" </*
cgo...@genie.com
*/> ha scritto nel messaggio
prova cosi:
LOGFONT lf={0};
non mi chiedre cosa cambia perchè non lo so :-)
ciao

non mi chiedre cosa cambia perchè non lo so :-)
e anche io fatico a capire questo mistero di Windows ;P
