Wie kann man außer WM_PAINT zeichnen?
-
Ist es möglich die zum Zeichnen Quellcode irgendwo anders ausführen? Wie soll es dann aussehen? Und muss man explizit WM_PAINT schicken, oder?
Vielen Dank!
P.S. Mir wurde schon die Funktion InvalidateRect(hWnd, NULL, TRUE/FALSE) empfohlen. Aber schickt sie immer WM_PAINT aus? Und wird der zweite Parameter beinflußen welcher Region zu updaten ist?
-
nein, du kannst imho überall ein
HDC dc = GetDC(Fenster_zum_bemalen); // auf dc malen ReleaseDC(dc);InvalidateRect sagt, dass das Fenster demnächst neu gezeichnet werden muss.
Der zweite parameter gibt an, welche fläche "beschmutzt" wurde.
-
Ja aber den kannst du weglassen, nur musst du immer in WM_PAINT zeichnen. Du darfst nicht außerhalb zeichnen, da es sonst irgendwelche probleme geben kann. Theoretisch könntest du GetDC(hWnd) benutzen und dann mit dem erhaltenen DC zeichen, aber das kann zu flackern etc. führen.
-
Ohne Doublebuffering kann es innerhalb WM_PAINT auch flackern, je nachdem was man zeichnet

Man muss halt nur aufpassen das Windows eben schonmal alles plättet

z.B. wenn das Fenster (ganz oder teilweise) verdeckt war z.B. sowas:
- Erstmal WM_ERASEBKGND sendet (dadurch wird quasi alles vorher gezeichnete vernichtet und der Fensterhintergrund wird da gemalt)
- anschließend WM_PAINT an das Fenster gesendet wird.Mit anderen Worten: Alles was außerhalb von WM_PAINT gezeichnet wird hält möglicherweise nicht sonderlich lange

Der letzte Parameter von InvalidateRect() sagt welcher Teil neu gezeichnet werden muss, das Rect bekommt man auch bei WM_PAINT mit dazu! Ob man sich dran hält oder mehr neuzeichnet als nötig ist, da ist man selbst für verantwortlich.
Mittels UpdateWindow() hinter einem InvalidateRect() kann man das neuzeichnen ohne große Verzögerung quasi sofort durchboxen lassen.
-
geeky schrieb:
Dennis123 schrieb:
Du hast aber kein case für WM_PAINT, oder? Das würde es eigentlich erklären. WM_PAINT muss immer behandelt werden sonst kommen glaube ich tausende WM_PAINT messages.
Nur wenn man dann nicht die DefWindowProc() aufruft, die DefWindowProc() macht sonst quasi selber ein BeginPaint()/EndPaint()
WM_PAINT wird solange ständig neu ans Fenster geschickt bis alle Fensterbereiche als "gültig" markiert sind.
Wenn z.B. ein Fensterbereich zum Teil überdeckt wurde, wird der ehemals überdeckte Teil als "ungültig" markiert und WM_PAINT geschickt. Bei BeginPaint() kann man aus der PAINTSTRUCT lesen welchen Teil man neu zeichnen soll. Beim Aufruf von EndPaint() markiert Windows diesen Teil dann wieder als gültig.
Mit InvalidateRect() kann man Teile auch selber als ungültig markieren. Gültig markieren kann man abgesehen von EndPaint() auch außerhalb von WM_PAINT mit ValidateRect().
Ich denke, dass ich schon etwas verstanden habe!
Vielen Dank!