2011-04-30 7 views

Respuesta

14

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.

+0

Gracias por la valiosa entrada. Si utilizo GetDC dentro de WM_PAINT en lugar de BeginPaint, dará algún problema –

+1

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

7

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.

7

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.

+0

Gracias, eso explica la utilización de la CPU que estaba obteniendo sin EndPaint. –

+1

Es cierto. EndPaint esencialmente llama a ValidateRect. Puede diferir a DefWindowProc (que valida el rect) o simplemente llamar ValidateRect usted mismo. –