Corso di Visual C++

Utilizzare gli oggetti GDI

 

Nella funzione OnRButtonDown del programma Prg10 abbiamo visto come fare a disegnare all'esterno della funzione OnDraw:

Abbiamo create un contesto di dispositivo locale mediante CClientDC dc(this); questa dichiarazione fa si che nella variabile dc sia contenuta un copia del contesto di dispositivo dell'area client della vista. Tale area della vista è l'area utilizzabile per il disegno, vengono esclusi quindi da codesta: menu, barre di stato e barre degli strumenti.

Gli altri contesti di dispositivi creabili sono CPaintDC, CWindowDC e CMetaFileDC.

Per approfondimenti riguardo all'utilizzo dei contesti di dispositivo CDC, vi rimando però alla prossima puntata.

Abbiamo anche utilizzato il nuovo oggetto CPen per creare una penna da utilizzare per il disegno.

L'inizializzazione della penna può essere effettuata o attraverso la funzione CreatePen o passando gli stessi parametri al costruttore.

Es.:
CPen pen(PS_SOLID,1,color); // equivalente a CreatePen(PS_SOLID,1,color);

La doppia opzione è utile quando la penna la si vuole creare a run-time, mentre l'oggetto lo si alloca staticamente.

I parametri da passare sono nell'ordine lo stile della linea (vedete l'help in linea per tutti i possibili stili), lo spessore della linea e il colore come oggetto COLORREF.

Alcuni stile di linea più utili sono: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT e PS_NULL che nell'ordine permettono di disegnare linee piene, tratteggiate, punteggiate, tratto-punto e trasparenti.

Uno stile di penna particolare è PS_INSIDEFRAME che permette di tracciare ad esempio un rettangolo facendo si che lo spessore del contorno ricada tutto all'interno della figura. Ovviamente questo stile si dovrebbe applicare solo a penne di spessore non unitario e a figure chiuse. Per coloro a cui interessasse, aggiungo che in Windows2000 c'è anche il nuovo stile PS_USERSTYLE che permette di definire uno stile di penna personalizzato.

Il secondo parametro passato a CreatePen è un oggetto di tipo COLORREF; questo è un nuovo tipo di dati che permette di specificare un colore utilizzando un valore intero senza segno a 32 bit (una DWORD o un UINT).

La sua definizione è la seguente:

typedef DWORD COLORREF

In aiuto viene la macro RGB che permette di calcolare tale valore a 32 bit a partire dalla terna cromatica di base.

L'operazione che effettua è la seguente RGB(R,G,B)=Rx255x255+Gx255+B; il quarto byte è utilizzato per la trasparenza (non c'è nell'esempio). Il valore RGB(0,0,0) indica il nero, mente RGB(255,255,255) indica il bianco.

Abbiamo visto inoltre anche come utilizzare una penna diverso da quello standard, per fare ciò abbiamo utilizzato la funzione SelectObject di CDC.

Questa è una funzione sovraccaricata (overloaded) di CDC e può assumere le seguenti forme:

CPen* SelectObject( CPen* pPen );

CBrush* SelectObject( CBrush* pBrush );

virtual CFont* SelectObject( CFont* pFont );

CBitmap* SelectObject( CBitmap* pBitmap );

int SelectObject( CRgn* pRgn );

Quindi come si può vedere accetta come parametri vari oggetti grafici e restituisce un oggetto dello stesso tipo.

Il perché è semplice: la GDI è una risorsa comune e per tale motivo ogni volta che se ne cambia lo stato, lo si deve ripristinare dopo l'uso. Nella funzione OnRButtonDown di Prg10 abbiamo ad esempio effettuato le seguenti operazioni:

CPen *pOldPen=dc.SelectObject(&pen);

dc.MoveTo(m_ptInizio);

dc.LineTo(m_ptFine);

dc.SelectObject(pOldPen);

Come vedete selezionando la penna abbiamo memorizzato in pOldPen un puntatore alla penna che era utilizzata precedentemente, poi dopo l'uso nelle funzioni MoveTo e LineTo l'abbiamo ripristinata.

Questa operazione è sempre necessaria quando si selezionano nel CDC oggetti che non sono di stock, cioè standard.

Gli oggetti standard si selezionano con SelectStockObject la cui sintassi è:

virtual CGdiObject* SelectStockObject( int nIndex );

Gli oggetti standard sono alcune penne, pennelli e font. I più utilizzati sono i seguenti:

 

Torna all'indice Generale del corso di Corso di Visual C++ di Software Planet