Win32: Czy okno ma ten sam HDC przez cały okres użytkowania?

Czy mogę używać kontrolera domeny poza cyklem malowania? Czy DC mojego okna jest gwarantowane na zawsze?

Próbuję dowiedzieć się, jak długo kontekst urządzenia (DC) urządzenia sterującego jest prawidłowy.

wiem, że mogę zadzwonić:

GetDC(hWnd);

aby uzyskać kontekst urządzenia w oknie mojej kontroli, ale czy to jest dozwolone?

Gdy system Windows wysyła mi wiadomość WM_PAINT, powinienem zadzwonićBeginPaint/EndPaint aby poprawnie potwierdzić, że je pomalowałem i wewnętrznie usunąć nieprawidłowy region:

BeginPaint(hWnd, {out}paintStruct);
try
   //Do my painting
finally
   EndPaint(hWnd, paintStruct);
end;

Ale wywołanie BeginPaint zwraca mi także DC wewnątrz struktury PAINTSTRUCT. To jest DC, którepowinien malować dalej.

Nie mogę znaleźć niczego w dokumentacji, która mówi, że DC zwrócony przez BeginPaint () jest tym samym DC, który dostałbym od GetDC ().

Szczególnie teraz, w czasach Desktop Composition, czy ważne jest malowanie na DC, które otrzymuję poza BeginPaint?

Wydaje się, że istnieją 2 sposoby, dzięki którym DC może malować podczas cyklu malowania:

dc =GetDC(hWnd);

BeginPaint (& paintStruct);

Jest trzeci sposób, ale wydaje się, że jest to błąd związany z Borland Delphi, z którym się rozwijam.

PodczasWM_PAINT przetwarzania, Delphi uważa, że ​​wParam jest DC i zaczyna malować na nim. Podczas gdy MSDN mówi, że wParam komunikatu WM_PAINT jest nieużywany.

Dlaczego

Mój prawdziwy celjest próba utrzymania trwałego obiektu GDI + Grafika przeciwko HDC, dzięki czemu mogę korzystać z niektórych lepszych funkcji GDI +, które zależą od posiadania stałego DC.

Podczas obsługi wiadomości WM_PAINT chcę narysować obraz GDI + na płótnie. Następująca wersja nieve jest bardzo wolna:

WM_PAINT:
{
   PAINTSTRUCT ps;
   BeginPaint(m_hwnd, ps);
   Graphics g = new Graphics(ps.hdc);
   g.DrawImage(m_someBitmap, 0, 0);
   g.Destroy();
   EndPaint(h_hwnd, ps);
}

GDI zawiera szybszą bitmapę, mapę CachedBitmap. Ale korzystanie z niego bez myślenia nie daje żadnych korzyści:

WM_PAINT:
{
   PAINTSTRUCT ps;
   BeginPaint(m_hwnd, ps);

   Graphics g = new Graphics(ps.hdc);
   CachedBitmap bm = new CachedBitmap(m_someBitmap, g);
   g.DrawCachedBitmap(m_bm, 0, 0);
   bm.Destroy();
   g.Destroy();
   EndPaint(h_hwnd, ps);
}

Wzrost wydajności wynika z jednokrotnego utworzenia mapy CachedBitmit, więc przy inicjalizacji programu:

m_graphics = new Graphics(GetDC(m_hwnd));
m_cachedBitmap = new CachedBitmap(b_someBitmap, m_graphcis);

A teraz w cyklu farb:

WM_PAINT:
{
   PAINTSTRUCT ps;
   BeginPaint(m_hwnd, ps);
   m_graphics.DrawCachedBitmap(m_cachedBitmap, 0, 0);
   EndPaint(h_hwnd, ps);
}        

Z wyjątkiem teraz, ufam, że DC i uzyskane po inicjalizacji programu będzie tym samym DC dla mojego okna, dopóki aplikacja jest uruchomiona. Oznacza to, że przetrwa:

szybkie przełączniki użytkownikakompozycja włączona / wyłączonaprzełączanie motywówwyłączenie motywu

w MSDN nie znajduję niczego, co gwarantuje, że ten sam DC będzie używany dla określonego okna tak długo, jak długo istnieje okno.

Uwaga: nie używam podwójnego buforowania,ponieważ chcę być dobrym programistą i postąpić właściwie. Czasami oznacza to, że podwójne buforowanie jest złe.

questionAnswers(3)

yourAnswerToTheQuestion