Win32: ¿Una ventana tiene el mismo HDC durante toda su vida útil?

¿Puedo usar un CD fuera de un ciclo de pintura? ¿Se garantiza que el DC de mi ventana sea válido para siempre?

Estoy tratando de averiguar cuánto tiempo es válido el Contexto de dispositivo (DC) de mi control.

Sé que puedo llamar:

GetDC(hWnd);

para obtener el contexto del dispositivo de la ventana de mi control, pero ¿está permitido?

Cuando Windows me envía un mensaje WM_PAINT, se supone que debo llamarComenzar pintar/EndPaint para reconocer correctamente que lo he pintado y para borrar internamente la región no válida:

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

Pero llamar a BeginPaint también me devuelve un CD dentro de la estructura PAINTSTRUCT. Este es el DC que yodebería seguir pintando

No puedo encontrar nada en la documentación que indique que el DC devuelto por BeginPaint () es el mismo DC que obtendría de GetDC ().

Especialmente ahora, en los días de Desktop Composition, ¿es válido pintar en un DC que obtengo fuera de BeginPaint?

Parece que hay 2 maneras en que puedo hacer que un DC pinte durante un ciclo de pintura:

dc =GetDC(hWnd);

BeginPaint (& paintStruct);

Hay una tercera forma, pero parece ser un error con el Borland Delphi con el que desarrollo.

DuranteWM_PAINT Procesando, Delphi cree que el wParam es un DC, y procede a pintarlo. Mientras que MSDN dice que el wParam de un mensaje WM_PAINT no se ha utilizado.

El porque

Mi verdadera metaes tratar de mantener un objeto GDI + Graphics persistente contra un HDC, por lo que puedo usar algunas características de GDI + de mejor rendimiento que dependen de tener un DC persistente.

Durante el manejo del mensaje WM_PAINT quiero dibujar una imagen GDI + en el lienzo. La siguiente versión de nieve es muy lenta:

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 contiene un mapa de bits de rendimiento más rápido, un CachedBitmap. Pero usarlo sin pensar no proporciona ningún beneficio de rendimiento:

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);
}

La ganancia de rendimiento proviene de la creación de CachedBitmap una vez, así que en la inicialización del programa:

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

Y ahora en el ciclo de pintura:

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

Excepto que ahora confío en que el DC que obtuve después de la inicialización del programa será el mismo DC para mi ventana mientras la aplicación se esté ejecutando. Esto significa que sobrevive a través de:

interruptores rápidos de usuariocomposición habilitada / deshabilitadacambio de temadeshabilitar el tema

No encuentro nada en MSDN que garantice que el mismo DC se usará para una ventana en particular mientras exista la ventana.

Nota: No estoy usando doble búfer,Porque quiero ser un buen desarrollador, y hacer lo correcto.. A veces eso significa que el búfer doble es malo.

Respuestas a la pregunta(3)

Su respuesta a la pregunta