Einerlei: GetDC und BeginPaint ?



  • Frage(n) (A)

    Bei den Device Contexts blicke ich noch nicht so richtig durch:
    Laut msdn-library gibt's mehrere Möglichkeiten, in einen DC zu zeichnen, bzw. um ein Handle darauf zu bekommen:

    Einerseits BeginPaint(HWND hwnd, PAINTSTRUCT* ps);
    Andererseits GetDC(HWND hwnd);

    Das 'Loslassen' des DC unterscheidet sich dementsprechend ebenfalls.
    Mehr als einen HDC brauche ich aber gar nicht, um beispielsweise mit TextOut etwas in den DC zu schreiben, und mit den Elementen der Struktur PAINTSTRUCT habe ich bis jetzt auch noch nicht arbeiten müssen.

    Ist es gleichgültig, auf welche der beiden Arten ich mir einen HDC beschaffen lasse, wenn ich mit den Elementen des PAINTSTRUCTS ohnehin nichts zu tun habe?

    Beim Durchsehen der Beispielcodes ist mir aufgefallen, dass BeginPaint() nur, wenn überhaupt, bei der Behandlung einer WM_PAINT Message verwendet wird, wenn bei der Behandlung anderer Messages etwas gezeichnet werden soll, dann meistens GetDC().

    Vielleicht kann mir jemand die kleinen, aber feinen Unterschiede zwischen den beiden Funktionen erklären?

    Frage(n) (B):
    Und dann ist mir noch nicht so recht klar, was es mit dem CS_OWNDC Klassenstil auf sich hat. Die MSDN-Library meint, man bräuchte den HDC gar nicht mehr loszulassen, wenn man ihn erstmal beschafft hat. Muss man dann trotzdem in der Behandlung einer WM_PAINT Nachricht BeginPaint() oder GetDC() erst noch den HDC beschaffen (oder kann man den HDC beispielsweise in einer Globalen Variablen speichern, nachdem man ihn ein einziges Mal beschafft hat, und dann immer mit diesem globalen HDC die GDI-Funktionen aufrufen?)
    Übernimmt Windows auch dann noch das Clipping von Fensterinhalten, wenn man eine in einen privaten OWNDC hineinzeichnet?

    Erstmal Danke für jederlei Antworten!


  • Mod

    A: BeginPaint/EndPaint ist nur und ausschließlich für WM_PAINT gedacht!
    GetDC, GetWindowDC wird verwendet wenn man direkt in einer Nachricht Zeichnen muss (z.B. Drag&Drop) und keinen Redraw mit WM_PAINT veranlassen möchte.
    Grundsätzlich sollte man dies aber auf Ausnahmen beschränken.
    Das passiert z.B. in Menüs oder bei bestimmten Fenstern wenn der Cursor drüber hoovert... Aber bitte wirklich mit Vorsicht benutzen.

    B: OWNDC sagt nur, dass der DC der in WM_PAINT angeboten wird im Fenster gespeichert wird und seinen Zustand beim nächsten WM_PAINT behält und nicht ein Standard DC reused wird. Aufgrund der Größe von DCs vermeidet man das. Die Technik mit BeginPaint/EndPaint bleibt die selbe. GetDC liefert dann auch den gleichen DC!
    In einem Programm das übelst in den DCs herumfuhrwerken muss kann es von Vorteil sein einen eigenen DC zu haben. Dann sollte dieses Fenster aber auch nur einmal je Applikation vorhanden sein.
    Ich kenne keine professionelle größere Software die mit CS_OWNDC arbeitet.



  • Danke für die Tipps, jetzt kenn' ich mich schon besser aus!


Anmelden zum Antworten