TextOut wird nur einmal ausgeführt
-
Ich habe ein Problem, dass mir nun schon einiges Kopfzerbrechen bereitet hat.
Ich habe ein WinProg erstellt,mit dem man per TextOut eine Textausgabe in das Fenster erhält. Wenn sich nun die Variablen ändern, wird zunächst die ganze Fläche per Rechteck wieder weiss gefüllt und dann die Textausgabefunktion erneut aufgerufen. Soweit die Theorie.
Nun habe ich allerdings das Problem, dass, wenn die Fläche weiss gefüllt ist, die Textausgabe schlichtweg nicht mehr stattfindet, erst wenn WM_PAINT aufgerufen wird, funktioniert die Textfunktion wieder.
Ein kurzer Auszug aus beiden Funktionen:
Textfunktion:
PAINTSTRUCT ps; HDC hdc; hdc = BeginPaint (hwnd2, &ps); SetBkMode (hdc, TRANSPARENT); TextOut (hdc, 80, 20, "Nummer 1", 8); ... EndPaint (hwnd2, &ps) ; ReleaseDC (hwnd2, hdc);
Rechtecksfunktion:
HBRUSH hBrush ; RECT rc ; GetClientRect (hwnd2, &rc) ; hdc = GetDC (hwnd2) ; hBrush = CreateSolidBrush (RGB (255, 255, 255)) ; FillRect (hdc, &rc, hBrush) ; ReleaseDC (hwnd2, hdc) ; DeleteObject (hBrush) ;
Wo liegt nun mein Fehler?
-
Das
PAINTSTRUCT ps; und
BeginPaint und
EndPaint
sind für mich Hinweise, dass du das in WM_PAINT stehen hast und dann ist es ja logisch dass der Text immer nur bei WM_PAINT geschrieben wird.
-
Hi,
Nein, es wurde nicht bei WM_PAINT aufgerufen, sondern, falls eine Datei geladen wurde oder falls eine neue Datei angelegt wurde oder die bestehende Datei verändert wurde.
Ich hab es jetzt nach langem Hin und Her herausgefunden. Es war das PaintStruct, dass Probleme bereitet. Sobald ich den DC mit dem PaintStruct verknüpfte, funktionierte die Textausgabe ncith mehr richtig, sobald ich kein PaintStruct mehr verwendete, war zwar die Textausgabe in Ordnung, jedoch wurden PushButtons, die sich ebenfalls im HWND befanden, nicht mehr richtig dargestellt. Ich habe das Ganze nun so gelöst, dass ich zuerst die Textausgabe ohne das Paintstruct mache, dann jedoch dennoch noch einmal das Painstruct mit dem hdc verknüpfe, damit aber nichts anfange. Nun funktioniert das Ganze recht gut, ich frage mich aber dennoch, warum ich den DC mit dem PS verknüpfen musste.
Kann mir dabei jemand helfen?
-
Aus der MSDN:
An application should not call BeginPaint except in response to a WM_PAINT message.