Disegnare nella Finestra in Visual C/C++

Per disegnare con le primitive grafiche dell’sdk di Windows in Visual C/C++ occore gestire il tutto con l’intercettazione del messaggio WM_PAINT che viene lanciato ogni volta che occorre aggiornare il disegno della finestra ( UpdateWindow ). L’inizio del disegno vero e proprio avviene tra la funzione BeginPaint, che restituisce l’handle del DC ( Device Context ) della finestra, ed EndPaint. Vediamo come implementare il tutto con il disegno di un’ellisse nell’applicazione utilizzata nella scorsa lezione.

...
LONG FAR PASCAL WindowProc(HWND hWnd, UINT msg,
            WPARAM wParam, LPARAM lParam)
{
      PAINTSTRUCT ps;
      HDC hdc;

      switch (msg)
      {
             case WM_DESTROY:
                   PostQuitMessage(0);
                   break;
             case WM_PAINT:
                   hdc = BeginPaint(hWnd, &ps);
                   Ellipse(hdc, 200, 200, 500, 400);
                   TextOut(hdc, 280, 245, "<- Ellisse", 10);
                   ValidateRect(hWnd, NULL);
                   EndPaint(hWnd, &ps);
                   break;
              default:
                    return DefWindowProc(hWnd, msg, wParam, lParam);
   }
   return 0;
}
...

Osserviamo le funzioni all’interno del messaggio WM_PAINT e l’inizio del disegno con BeginPaint che, come dicevamo prima, ritorna l’handle del DC della client area della finestra. Una volta ottenuto l’handle al dispositivo possiamo disegnarci sopra con le funzioni grafiche dell’sdk, che vi invito a studiare. Ho utilizzato Ellipse, una funzione che vuole l’handle al device context ed il rettangolo in cui inscrivere l’ellisse, se vi venisse troppo grande potete diminuire i valori. Da notare che queste primitive grafiche vogliono sempre l’handle su cui scrivere, il device context è la lavagna su cui disegnare e le dimensioni, che si esprimono con gli assi cartesiani, il solito ascissa ed ordinata; in particolare nel nostro esempio sono left, top, right e bottom. Incluso nell’ellisse ho inserito anche del testo e poi ho chiuso il disegno. Una volta fatto tutto occorre salvare il device con ValidateRect e dargli NULL per validare tutta la client area della finestra.

<< Lezione Precedente – Inizio CorsoLezione Successiva >>

Informazioni su Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.
Questa voce è stata pubblicata in VC/C++. Contrassegna il permalink.