Prywatne konteksty urządzeń wyświetlania
Kontekst urządzenia prywatnego umożliwia aplikacji uniknięcie pobierania i inicjowania kontekstu urządzenia wyświetlania za każdym razem, gdy aplikacja musi rysować w oknie. Konteksty urządzeń prywatnych są przydatne w przypadku okien, które wymagają wielu zmian w wartościach atrybutów kontekstu urządzenia w celu przygotowania go do rysowania. Konteksty urządzeń prywatnych skracają czas wymagany do przygotowania kontekstu urządzenia i w związku z tym czas potrzebny do przeprowadzenia rysowania w oknie.
Aplikacja kieruje system do utworzenia kontekstu urządzenia prywatnego dla okna, określając styl CS_OWNDC w klasie okna. System tworzy unikatowy kontekst urządzenia prywatnego za każdym razem, gdy tworzy nowe okno należące do klasy. Początkowo kontekst urządzenia prywatnego ma te same wartości domyślne atrybutów co wspólny kontekst urządzenia, ale aplikacja może je modyfikować w dowolnym momencie. System zachowuje zmiany w kontekście urządzenia przez okres życia okna lub do momentu wprowadzenia dodatkowych zmian przez aplikację.
Aplikacja może pobrać dojście do kontekstu urządzenia prywatnego przy użyciu funkcji GetDC w dowolnym momencie po utworzeniu okna. Aplikacja musi pobrać uchwyt tylko raz. Następnie może zachować i użyć uchwytu dowolną liczbę razy. Ponieważ kontekst urządzenia prywatnego nie jest częścią pamięci podręcznej kontekstu urządzenia wyświetlania, aplikacja nigdy nie musi zwalniać kontekstu urządzenia przy użyciu funkcjireleaseDC.
System automatycznie dostosowuje kontekst urządzenia w celu odzwierciedlenia zmian w oknie, takich jak przenoszenie lub ustalanie rozmiaru. Dzięki temu wszystkie nakładające się okna są zawsze prawidłowo obcięte; oznacza to, że aplikacja nie wymaga żadnej akcji, aby zapewnić wycinek. Jednak system nie zmienia kontekstu urządzenia w celu uwzględnienia regionu aktualizacji. W związku z tym podczas przetwarzania komunikatu WM_PAINT aplikacja musi dołączyć region aktualizacji przez wywołanie BeginPaint lub pobranie regionu aktualizacji i przecięcie go za pomocą bieżącego regionu wycinkowania. Jeśli aplikacja nie wywołuje BeginPaint, musi jawnie zweryfikować region aktualizacji przy użyciu funkcji ValidateRect lub ValidateRgn. Jeśli aplikacja nie weryfikuje regionu aktualizacji, okno odbiera niekończącą się serię komunikatów WM_PAINT.
Ponieważ BeginPaint ukrywa daszek, jeśli jest ono wyświetlane, aplikacja wywołująca BeginPaint powinna również wywołać funkcję EndPaint w celu przywrócenia daszka. EndPaint nie ma innego wpływu na kontekst urządzenia prywatnego.
Chociaż kontekst urządzenia prywatnego jest wygodny w użyciu, jest intensywnie obciążany pamięcią pod względem zasobów systemowych, co wymaga co najmniej 800 bajtów do przechowywania. Konteksty urządzeń prywatnych są zalecane, gdy zagadnienia dotyczące wydajności przewyższają koszty magazynowania.
System zawiera kontekst urządzenia prywatnego podczas wysyłania komunikatu WM_ERASEBKGND do aplikacji. Bieżące wybory kontekstu urządzenia prywatnego, w tym tryb mapowania, obowiązują, gdy aplikacja lub system przetwarza te komunikaty. Aby uniknąć niepożądanych skutków, system używa współrzędnych logicznych podczas wymazywania tła; na przykład używa funkcji GetClipBox w celu pobrania współrzędnych logicznych obszaru w celu wymazywania i przekazuje te współrzędne do funkcji FillRect. Aplikacje, które przetwarzają te komunikaty, mogą używać podobnych technik.
Aplikacja może użyć funkcji GetDCEx, aby wymusić na systemie zwrócenie wspólnego kontekstu urządzenia dla okna z kontekstem urządzenia prywatnego. Jest to przydatne do przeprowadzania szybkich operacji dotykowych w oknie bez zmieniania bieżących wartości atrybutów kontekstu urządzenia prywatnego.