Compartir a través de


Pintar la ventana

Ha creado la ventana. Ahora quieres mostrar algo dentro de él. En la terminología de Windows, esto se denomina pintar la ventana. Para mezclar metáforas, una ventana es un lienzo en blanco, esperando a que lo rellenes.

A veces, el programa iniciará la pintura para actualizar la apariencia de la ventana. En otros momentos, el sistema operativo le notificará que debe volver a pintar una parte de la ventana. Cuando esto ocurre, el sistema operativo envía a la ventana un mensaje WM_PAINT . La parte de la ventana que se debe pintar se denomina región de actualización.

La primera vez que se muestra una ventana, se debe pintar todo el área de cliente de la ventana. Por lo tanto, siempre recibirá al menos un mensaje de WM_PAINT al mostrar una ventana.

Ilustración que muestra la región de actualización de una ventana

Usted es el único responsable de pintar el área cliente. El marco circundante, incluida la barra de título, se pinta automáticamente por el sistema operativo. Cuando termine de pintar el área de cliente, borre la región de actualización, que indica al sistema operativo que no necesita enviar otro mensaje de WM_PAINT hasta que cambie algo.

Ahora supongamos que el usuario mueve otra ventana para que oscurezca una parte de la ventana. Cuando la parte oculta se vuelve a ver, esa parte se agrega a la región de actualización y la ventana recibe otro mensaje WM_PAINT .

ilustración en la que se muestra cómo cambia la región de actualización cuando se superponen dos ventanas

La región de actualización también cambia si el usuario amplía la ventana. En el diagrama siguiente, el usuario extiende la ventana a la derecha. El área recién expuesta en el lado derecho de la ventana se agrega a la región de actualización:

ilustración en la que se muestra cómo cambia la región de actualización cuando se cambia el tamaño de una ventana

En nuestro primer programa de ejemplo, la rutina de pintura es muy sencilla. Simplemente rellena todo el área de cliente con un color sólido. Aun así, este ejemplo es suficiente para demostrar algunos de los conceptos importantes.

switch (uMsg)
{
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);

        // All painting occurs here, between BeginPaint and EndPaint.

        FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

        EndPaint(hwnd, &ps);
    }
    return 0;
}

Inicie la operación de dibujo llamando a la función BeginPaint . Esta función rellena la estructura PAINTSTRUCT con información sobre la solicitud de reintentos. La región de actualización actual se proporciona en el miembro rcPaint de PAINTSTRUCT. Esta región de actualización se define en relación con el área de cliente:

Ilustración en la que se muestra el origen del área de cliente

En el código de dibujo, tiene dos opciones básicas:

  • Pintar todo el área de cliente, independientemente del tamaño de la región de actualización. Se recorta todo lo que quede fuera de la región de actualización. Es decir, el sistema operativo lo omite.
  • Optimice pintando solo la parte de la ventana dentro de la región de actualización.

Si siempre pinta todo el área de cliente, el código será más sencillo. Sin embargo, si tiene lógica de pintura complicada, puede ser más eficaz omitir las áreas fuera de la región de actualización.

La siguiente línea de código rellena la región de actualización con un solo color, utilizando el color de fondo de la ventana definido por el sistema (COLOR_WINDOW). El color real indicado por COLOR_WINDOW depende de la combinación de colores actual del usuario.

FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

Los detalles de FillRect no son importantes para este ejemplo, pero el segundo parámetro proporciona las coordenadas del rectángulo que se va a rellenar. En este caso, pasamos toda la región de actualización (el miembro rcPaint de PAINTSTRUCT). En el primer mensaje de WM_PAINT , es necesario pintar todo el área de cliente, por lo que rcPaint contendrá todo el área de cliente. En los mensajes de WM_PAINT posteriores, rcPaint puede contener un rectángulo más pequeño.

La función FillRect forma parte de la interfaz de dispositivo gráfico (GDI), que ha alimentado los gráficos de Windows durante mucho tiempo. En Windows 7, Microsoft introdujo un nuevo motor de gráficos, denominado Direct2D, que admite operaciones gráficas de alto rendimiento, como la aceleración de hardware. Direct2D también está disponible para Windows Vista a través de la actualización de la plataforma para Windows Vista y para Windows Server 2008 a través de la actualización de la plataforma para Windows Server 2008. (GDI sigue siendo totalmente compatible).

Cuando haya terminado de pintar, llame a la función EndPaint . Esta función borra la región de actualización, que indica a Windows que la ventana ha completado la pintura.

Siguientes

Cerrar la ventana