Wann ReleaseDC()?
-
Hi,
ich hab gleich eine neue Frage: Wann muss ich ReleaseDC() aufrufen?
Im MSDN hab ich keine klare Antwort gefunden. Ich habe ein Funktion, die ein HWND erhält. Damit erzeuge ich mir eine HDC (GetDC()). Lt. MSDN muss ich bei einem CS_OWNDC-Fenster kein ReleaseDC() aufrufen. Aber wie sieht's mit anderen Fenstern aus?
Zu ReleaseDC() steht, dass man bei bei GetDC()-erzeugten HDC nur bei "common DC[s]" aufrufen muss. Hab aber bisher nix über diese "common DC[s]" gefunden.

Grüße,
don_basto.
-
Du holst dir mit GetDC einen Kontext, arbeitest damit und gibst ihn wieder frei, wenn du ihn nicht mehr brauchst.
Schema:
HDC hDC = GetDC(hWnd); // Hier erfolgt die Benutzung // ... ReleaseDC(hWnd, hDC);
-
Aber scheinbar ist der Aufruf nicht zwingend nötig:
The application must call the ReleaseDC function for each call to the GetWindowDC function and for each call to the GetDC function that retrieves a common DC.
Ich frage, weil ich ein Fkt. mit 2 Überladungen innerhalb einer Klasse hab und der HDC ein Element der Klasse ist, dass den ich am Ende ordentlich vernichten will.
Die eine Fkt. nimmt nun direkt den HDC (keine Probleme, Aufrufer soll sich drum kümmern) und die zweite eben ein HWND. Da ich dort den DC selbst erstelle, sollte ich ihn auch wieder ggf. freigeben. Aber scheinbar muss des nur Ausnahmefällen geschehen (common dc), sodass ich mir da eine Fallunterscheidung sparen kann. Deswegen die Frage.Was sind "common dc[s]"?
-
don_basto schrieb:
Was sind "common dc[s]"?
Alle Gerätekontexte die du mit GetWindowDC oder GetDC bzw GetDCEx ermittelst.
-
Private Device Contexts
Private device contexts are display DCs that, unlike common device contexts, retain any changes to the default data even after an application releases them. [..]An application creates a private device context by first specifying the CS_OWNDC window-class style when it initializes the style member of the WNDCLASS structure and calls the RegisterClass function. (For more information about window classes, see Window Classes.)
Achso und damit sind vom ReleaseDC() also nur DCs von CS_OWNDC-Windows ausgenommen. Alles klar.

Grüße,
don_basto.
-
don_basto schrieb:
Private Device Contexts
Private device contexts are display DCs that, unlike common device contexts, retain any changes to the default data even after an application releases them. [..]An application creates a private device context by first specifying the CS_OWNDC window-class style when it initializes the style member of the WNDCLASS structure and calls the RegisterClass function. (For more information about window classes, see Window Classes.)
Achso und damit sind vom ReleaseDC() also nur DCs von CS_OWNDC-Windows ausgenommen. Alles klar.

Kann man so sagen...CS_OWNDC wird dann verwendet, wenn du viele Operationen mit einem Kontext ausführen musst;
Das Anfordern und Freigeben wäre dabei dann zu rechenintensiv.