Estoy trabajando en Win32 UI. Quiero saber la diferencia entre GetDC y BeginPaint. Cuándo usar qué API y cuándo no usar qué API.Diferencia entre GetDC() y BeginPaint()
Respuesta
GetDC simplemente devuelve el identificador al contexto del dispositivo, que se puede usar en cualquier momento y en cualquier lugar para hacer su propio dibujo. Por otro lado, BeginPaint prepara la ventana para pintar y también proporciona información sobre lo que debe pintarse (por ejemplo, si el fondo necesita pintura y el rect que debe pintarse).
Ejemplos de cuándo usar cada uno? BeginPaint se ve más comúnmente dentro de los manejadores WM_PAINT (MSDN: una aplicación no debe llamar a BeginPaint excepto en respuesta a un mensaje WM_PAINT. Cada llamada a BeginPaint debe tener una llamada correspondiente a la función EndPaint). GetDC se puede usar en cualquier lugar, por lo que si desea dibujar en una ventana externa. Básicamente, en cualquier momento no está en un controlador WM_PAINT. BeginPaint y EndPaint también tienen algún efecto en el caret. Lee msdn para más detalles.
BeginPaint
está destinado a ser llamado solo en respuesta al mensaje WM_PAINT
. El contexto del dispositivo obtenido apunta al área invalidada (por redibujar) de la ventana. Debería ser liberado usando EndPaint
.
GetDC
se pueden llamar en cualquier momento. El contexto del dispositivo que obtiene apunta a toda el área del cliente de la ventana. Para liberarlo, debe llamar al ReleaseDC
.
GetDC() es no sustituto de Begin + EndPaint(). Si lo intenta, verá que su subproceso de interfaz de usuario comienza a grabar 100% de núcleo de CPU y su controlador WM_PAINT recibe una y otra llamada.
El más grande es EndPaint(), borra la región de actualización de la ventana. El valor de PAINTSTRUCT.rcPaint. WM_PAINT se genera siempre que la ventana tenga un rectángulo sucio, creado por una llamada InvalidateRect() ya sea por el administrador de ventanas o por su programa que lo llama explícitamente. EndPaint() lo borra.
Gracias, eso explica la utilización de la CPU que estaba obteniendo sin EndPaint. –
Es cierto. EndPaint esencialmente llama a ValidateRect. Puede diferir a DefWindowProc (que valida el rect) o simplemente llamar ValidateRect usted mismo. –
- 1. MySQL: diferencia entre ', `,' y"
- 2. Diferencia entre objeto y *?
- 3. Diferencia entre. y #
- 4. ¿Diferencia entre == y caso?
- 5. La diferencia entre $ * y $ @
- 6. Diferencia entre & y &
- 7. VBA: Diferencia entre y y +
- 8. Diferencia entre -Wconversion entre gcc y g ++
- 9. Diferencia entre subprocess.Popen y os.system
- 10. Diferencia entre decimal y decimal
- 11. ¿Diferencia entre trazo y relleno?
- 12. Diferencia entre interrupción y eventos
- 13. Diferencia entre netTcpContextBinding y netTcpBinding
- 14. ¿Diferencia entre brújula y sass?
- 15. Diferencia entre "__method__" y "método"
- 16. Diferencia entre Mealy y Moore
- 17. Diferencia entre HashSet y HashMap?
- 18. diferencia entre ajax y enviar
- 19. Diferencia entre sistema y shell_exec
- 20. Diferencia entre Style y ControlTemplate
- 21. Diferencia entre relativo y absoluto
- 22. Diferencia entre window.location.href y top.location.href
- 23. Diferencia entre strncpy y memcpy?
- 24. diferencia entre SDL y GLUT
- 25. Diferencia entre Javascript y PHP
- 26. Diferencia entre Session y HttpContext.Current.Session
- 27. diferencia entre px y em
- 28. Diferencia entre sqrtf y sqrtf
- 29. ¿Diferencia entre Keychain y NSUserDefault?
- 30. Diferencia entre ViewData y TempData?
Gracias por la valiosa entrada. Si utilizo GetDC dentro de WM_PAINT en lugar de BeginPaint, dará algún problema –
Lea la respuesta de Hans Passant para obtener detalles sobre por qué esa no es una buena idea. Cuando creas un nuevo proyecto de estudio visual, obtienes BeginPaint y EndPaint que ya están en el controlador WM_PAINT, ¿Por qué querrías usar GetDC? – Matt