BeginPaint ein Muss ?



  • Wie ist das denn eigentlich mit dem BeginPaint, muss man das immer aufrufen?
    Reicht es nicht, wenn man sich einmalig zu Programmbeginn ein hdc auf das hWnd holt?
    Oder ändert sich das während des Programms ?



  • AFAIK bezieht sich der DC aus der PAINTSTRUCT von BeginPaint() tatsächlich nur auf den vorher durch InvalidateRect() markierten Bereich und hat direkt nichts mit dem DC des Fensters zu tun. Das Jonglieren mit den verschiedenen DCs ist sowieso schon seltsam genug, da sollte man durchaus die vorgesehenen Techniken benutzen. Und für WM_PAINT ist das nunmal das BeginPaint()-EndPaint()-Paar.



  • Hmm, ich wollt mir ne DIB Bitmap erzeugen und dort diverses reinmalen.
    Mit set Pixel und so. 🙂



  • Und für WM_PAINT ist das nunmal das BeginPaint()-EndPaint()-Paar

    Kannst dir aber auch außerhalb des Context'es den Wert holen, über GetDC() oder sowas.


  • Mod

    Nur durch BeginPaint wird ein invalidierter Bereich eines DCs wieder als "gezeichnet/gültig/valide" markiert. Wird BeginPaitn nicht aufgreufen wird der Windowsmanager immer wieder eine WM_PAINT Nachricht für dieses Fenster ausgeben.



  • und wer macht das mit dem invalidate ? muss ich das selber aufrufen ?
    also erst invalidate() und dann wird automatisch WM_PAINT gesendet ?



  • WM_PAINT wird immer gesendet, wenn ein Fensterbereich ungültig wird, also z. B. wenn die Größe verändert wird oder ein Teil des Fensters durch ein Menü verdeckt war und jetzt wieder gezeichnet werden soll: Das Menü wird gelöscht bzw. mit dem Fensterinhalt übermalt (weil der Monitor nunmal nur 2-dimensional ist). In der DefWindowProc wird die WM_PAINT einfach mit BeginPaint-EndPaint ohne was dazwischen abgehandelt. Damit wird nur der Fensterhintergrund neu gezeichnet, alle Inhalte werden dadurch gelöscht. Du kannst eine WM_PAINT selbst auslösen, indem Du InvalidateRect o. ä. aufrufst. Wenn etwas danach im Fenster erhalten bleibt, mußt Du es in WM_PAINT bearbeiten. Aber nur EndPaint ist in der Lage, den Fensterbereich als gültig zu erklären.


  • Mod

    Elektronix schrieb:

    Aber nur EndPaint ist in der Lage, den Fensterbereich als gültig zu erklären.

    <besserwissermodus>
    Das macht nicht EndPaint. Es macht BeginPaint! 🕶

    http://msdn2.microsoft.com/en-us/library/ms534911(VS.85).aspx

    The BeginPaint function automatically validates the entire client area. Neither the ValidateRect nor ValidateRgn function should be called if a portion of the update region must be validated before the next WM_PAINT message is generated.

    The system continues to generate WM_PAINT messages until the current update region is validated.

    </besserwissermodus>



  • mad_martin schrieb:

    ... Das Jonglieren mit den verschiedenen DCs ist sowieso schon seltsam genug...

    Das sag ich dir, um ne Bitmap ins Fenster zu blitten brauch ich auch extra ein HDC für die Bitmap, das kompatibel zum Fenster HDC sein muss.
    Die Bitmap kann ich mit SelectObject ins HDC 'reinladen'. Was auch immer da intern passiert. Seltsam finde ich das allerdings auch !



  • Martin Richter schrieb:

    Elektronix schrieb:

    Aber nur EndPaint ist in der Lage, den Fensterbereich als gültig zu erklären.

    <besserwissermodus>
    Das macht nicht EndPaint. Es macht BeginPaint! 🕶

    http://msdn2.microsoft.com/en-us/library/ms534911(VS.85).aspx

    The BeginPaint function automatically validates the entire client area. Neither the ValidateRect nor ValidateRgn function should be called if a portion of the update region must be validated before the next WM_PAINT message is generated.

    The system continues to generate WM_PAINT messages until the current update region is validated.

    </besserwissermodus>

    Errare humanum est... Abgekürzt: E h e 🤡



  • ich frag mich gerade wegen dem fensterhintergrund...den muss ich doch nicht selber zeichnen oder ?



  • Sagen wir mal so: Wenn Du ein Bild auf ein Blatt Papier zeichnen willst- mußt Du dann das Papier auch selbst zeichnen? 😉
    Wie schon vorher gesagt: Den Fensterhintergrund zeichnet Windows immer selbst. Du legst höchstens die Hindergrundfarbe fest (in der Wndclass-Struktur).


Log in to reply