Pittura della finestra

È stata creata la finestra. Ora vuoi mostrare qualcosa all'interno di esso. Nella terminologia di Windows viene chiamato disegnare la finestra. Per combinare metafore, una finestra è un'area di disegno vuota, in attesa di riempirla.

A volte il programma avvierà la pittura per aggiornare l'aspetto della finestra. In altre occasioni, il sistema operativo avvisa che è necessario eseguire il repository di una parte della finestra. Quando si verifica questo problema, il sistema operativo invia la finestra a un messaggio di WM_PAINT . La parte della finestra che deve essere dipinta è denominata area di aggiornamento.

La prima volta che viene visualizzata una finestra, è necessario disegnare l'intera area client della finestra. Pertanto, riceverai sempre almeno un messaggio WM_PAINT quando visualizzi una finestra.

figura che mostra l'area di aggiornamento di una finestra

Sei responsabile solo della pittura dell'area client. La cornice circostante, inclusa la barra del titolo, viene dipinta automaticamente dal sistema operativo. Dopo aver completato la pittura dell'area client, deselezionare l'area di aggiornamento, che indica al sistema operativo che non deve inviare un altro messaggio WM_PAINT finché non cambia qualcosa.

Si supponga ora che l'utente sposta un'altra finestra in modo da nascondere una parte della finestra. Quando la parte offuscata diventa nuovamente visibile, tale parte viene aggiunta all'area di aggiornamento e la finestra riceve un altro messaggio di WM_PAINT .

figura che mostra come cambia l'area di aggiornamento quando due finestre si sovrappongono

L'area di aggiornamento cambia anche se l'utente estende la finestra. Nel diagramma seguente, l'utente estende la finestra a destra. L'area appena esposta sul lato destro della finestra viene aggiunta all'area di aggiornamento:

figura che mostra come cambia l'area di aggiornamento quando viene ridimensionata una finestra

Nel nostro primo programma di esempio, la routine di pittura è molto semplice. Riempie l'intera area client con un colore a tinta unita. Tuttavia, questo esempio è sufficiente per illustrare alcuni dei concetti importanti.

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

Avviare l'operazione di disegno chiamando la funzione BeginPaint . Questa funzione riempie la struttura PAINTSTRUCT con informazioni sulla richiesta di ripaint. L'area di aggiornamento corrente viene specificata nel membro rcPaint di PAINTSTRUCT. Questa area di aggiornamento è definita in relazione all'area client:

figura che mostra l'origine dell'area client

Nel codice di disegno sono disponibili due opzioni di base:

  • Disegnare l'intera area client, indipendentemente dalle dimensioni dell'area di aggiornamento. Qualsiasi cosa che rientra all'esterno dell'area di aggiornamento viene ritagliata. Vale a dire, il sistema operativo lo ignora.
  • Ottimizzare per disegnare solo la parte della finestra all'interno dell'area di aggiornamento.

Se si disegna sempre l'intera area client, il codice sarà più semplice. Se la logica di disegno è complessa, tuttavia, può essere più efficiente ignorare le aree all'esterno dell'area di aggiornamento.

La riga di codice seguente riempie l'area di aggiornamento con un singolo colore, usando il colore di sfondo della finestra definito dal sistema (COLOR_WINDOW). Il colore effettivo indicato da COLOR_WINDOW dipende dalla combinazione di colori corrente dell'utente.

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

I dettagli di FillRect non sono importanti per questo esempio, ma il secondo parametro fornisce le coordinate del rettangolo da riempire. In questo caso, viene passata l'intera area di aggiornamento (il membro rcPaint di PAINTSTRUCT). Nel primo messaggio WM_PAINT , l'intera area client deve essere dipinta, quindi rcPaint conterrà l'intera area client. Nelle successive WM_PAINT messaggi , rcPaint potrebbe contenere un rettangolo più piccolo.

La funzione FillRect fa parte dell'interfaccia del dispositivo grafico (GDI), che ha basato la grafica Windows per molto tempo. In Windows 7 Microsoft ha introdotto un nuovo motore grafico, denominato Direct2D, che supporta operazioni grafiche ad alte prestazioni, ad esempio accelerazione hardware. Direct2D è disponibile anche per Windows Vista tramite l'aggiornamento della piattaforma per Windows Vista e per Windows Server 2008 tramite l'aggiornamento della piattaforma per Windows Server 2008. (GDI è ancora completamente supportato).

Al termine della pittura, chiamare la funzione EndPaint . Questa funzione cancella l'area di aggiornamento, che segnala a Windows che la finestra è stata completata.

Prossima

Chiusura della finestra