Deseo mostrar un control en algún mapa de bits fuera de la pantalla para tener acceso rápido a él.Invalidar en el propio mapa de bits
Desafortunadamente Control.DrawToBitmap
parece dibujar todo el control al que se llama, incluidos todos sus controles secundarios. Internamente, emite un mensaje WM_PRINT con CC auto proporcionada a un mapa de bits. Este mapa de bits temporal se ajusta luego al mapa de bits proporcionado por el usuario. Inaceptable para mí, prefiero tener este mapa de bits actualizado según sea necesario para que mi rendimiento llegue cuando se necesita el mapa de bits se minimiza.
En el escenario ideal, me gustaría que el formulario se comportara como si estuviera visible en la pantalla (pero no puede ser). Eso significaría que si, por ejemplo, un control tiene su propiedad Text
modificada, el formulario se invalidaría parcialmente. La captura de los mensajes/eventos relevantes me permitiría especificar mi propio DC para el formulario que se dibujará, o simplemente BitBlt los formularios DC a mi gusto.
Algunas direcciones que he mirado en:
- El parámetro
PaintEventArgs
enOnPaint
parece tener un miembro savedGraphicsState, tal vez se podría utilizar para averiguar lo que no requiere invalidar - Tener la forma visible pero fuera del área de la pantalla. Sin embargo, los controles no se pintan.
- llamar manualmente RedrawWindow() en la ventana, la misma historia
No estoy del todo claro sobre por qué 'DrawToBitmap' (el mensaje' WM_PRINT') es inaceptable para su uso. ¿Estás preocupado por * rendimiento *? Es muy poco probable que dibujar en un mapa de bits sea más lento que dibujar en la pantalla. –
Necesito un mecanismo de almacenamiento en búfer. DrawToBitmap pinta todo el control desde cero, mientras que el sistema invalidante utilizado en las ventanas normales solo actualizaría las regiones que realmente cambiaron. –
@Frank, ¿consideró usar Bitblt? http://www.codeproject.com/KB/GDI-plus/Bitblt_wrapper_class.aspx –