Gestione della Grafica con MFC

Nella scorsa lezione di questo corso sulla programmazione in Visual C/C++, abbiamo introdotto la libreria di Microsoft MFC ( Microsoft Foundation Class ). Questa volta in particolare ci occuperemo delle classi che riguardano la grafica primitiva, quella cioè fatta da linee, testo, punti e quadrati.
Come abbiamo già visto riguardo all’SDK di Windows, la tela su cui possiamo scrivere si chiama device context, che è incapsulato un una classe CDC, i colori per gli sfondi invece risiedono nella classe CBrush, mentre i tratti delle linee in CPen, la gestione dei font è invece demandata a CFont. Per una descrizione delle proprietà e metodi di queste classi si rimanda all’aiuto in linea dell’ambiente di sviluppo. Prima di vedere un esempio concreto che vi consentirà di capire il funzionamento delle primitive grafiche con le MFC, dobbiamo spiegare come vengono gestiti i messaggi. La libreria di Microsoft utilizza delle macro per la gestione dei messaggi, in particolare nel file di intestazione vengono dichiarati con DECLARE_MESSAGE_MAP(), mentre nel file sorgente viene iniziata una zona per i messaggi con BEGIN_MESSAGE_MAP() e terminata con END_MESSAGE_MAP(), sono sicuro che capirete meglio quando vedrete l’esempio pratico. Nel messaggio OnPaint() della client area dobbiamo costruire un DC ( Device Context ), per il disegno la classe si chiama CPaintDC, per la finestra CWindowDC, mentre per la client area si chiama CClientDC, infine abbiamo anche CMetaFileDC per i meta file appunto; tutte queste classi sono derivate dalla classe base CDC. Passiamo ad esporre l’esempio concreto diviso in file di intestazione e sorgente. Codice del file di intestazione .h:

class CMyApp : public CWinApp
{
   public:
      virtual BOOL InitInstance();
};

class CMainWnd : public CFrameWnd
{
   public:
      CMainWnd();

   DECLARE_MESSAGE_MAP();
   afx_msg void OnPaint();
};

Codice del file sorgente .cpp:

#include <afxwin.h>
#include "CorsoVC.h"

CMainWnd::CMainWnd()
{
   Create(NULL, "Corso di MFC", WS_OVERLAPPEDWINDOW, rectDefault, NULL, NULL);
}

BOOL CMyApp::InitInstance()
{
   m_pMainWnd = new CMainWnd();
   m_pMainWnd->ShowWindow(m_nCmdShow);
   m_pMainWnd->UpdateWindow();
   return TRUE;
}

CMyApp theApp;

BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
   ON_WM_PAINT()
END_MESSAGE_MAP()

void CMainWnd::OnPaint()
{
   CPaintDC dc(this);
   CFont font;

   font.CreatePointFont(120, _T("Tahoma"), &dc);
   CFont* pOldFont = dc.SelectObject(&font);
   dc.TextOut(200, 200, _T("Benvenuti in MFC"));
   dc.SelectObject(pOldFont);
   font.DeleteObject();
}

Come avevo detto i messaggi vengono dichiarati nel file di intestazione e delineati da una zona nel file sorgente per ogni classe, tutto attraverso delle macro. Nel messaggio di disegno ho creato un DC per disegnare associato alla finestra, poi ho creato un oggetto di tipo font ed infine ho selezionato questo sul device context. Da dire che ogni volta che viene creato un DC questi avrà le caratteristiche di default, con la funzione SelectObject vado a modificare queste caratteristiche, ecco perché alla fine ho ripristinato il font di default e poi ho liberato la risorsa con DeleteObject. Vedremo questi concetti anche nella prossima lezione quando parleremo di tipi di device context.

<< Lezione PrecedenteInizio Corso

Informazioni su Giampaolo Rossi

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