Corso di Visual C++

Prime operazioni con le ‘Finestre’

 

In questa puntata, come promesso, vedremo come scrivere in una finestra e come farci qualche disegnino.

Tanto per iniziare create un nuovo progetto, proprio come abbiamo fatto nella puntata precedente, quindi come nome scegliete ‘prg2’.

Dopo avere seguito tutte le impostazioni di default, ma aver scelto nella seconda finestra il tipo di documento ‘Single Document’ avete davanti l’ambiente di lavoro vuoto; a questo punto se cliccate sulla prima voce ‘prg2 classes’ della scheda ClassView sulla sinistra, vi compaiono 6 voci che in ordine sono (se il progetto lo avete chiamato prg2): CAboutDlg, CMainFrame, CPrg2App, CPrg2Doc, CProg2View e Globals.

Queste sono le classi contenute nel vostro progetto e si riferiscono, nell’ordine partendo dall’alto: alla classe per la finestra About, alla classe finestra principale, alla classe applicazione, alla classe documento e alla classe vista.

Sicuramente vi state chiedendo perché tutte queste classi per un programma che sostanzialmente disegna solo una finestra sullo schermo e compie poche altre operazioni, beh, la risposta è semplice: è il Wizard che ci ha preparato tutto ciò di cui avremo bisogno quando tra qualche puntata scriveremo delle applicazioni serie.

Infatti tutte queste classi sono contenitori per funzioni che hanno un ben preciso significato: la classe finestra principale contiene tutti i gestori dei menu, della barra degli strumenti, del titolo e di stato; la classe vista si occupa dell’output grafico della finestra e della stampa, la classe documento si occupa del salvataggio e caricamento dei file, la classe applicazione si occupa di cose un pò più complesse che per ora non prenderemo in oggetto.

Questa metodologia di programmazione si chiama "documento-vista", e permette di scrivere programmi molto ordinati, leggibili e di facile correzione. Potremmo infatti anche scrivere tutto in una sola classe, ma immaginate un po’ quando dovremo effettuare una compilazione di un listato di 4000 righe di codice ed il compilatore impiega tantissimo tempo, oppure quando dovremo trovare una funzione di cui non ricordiamo il nome e lo dovremo fare tra altre duecento!

Questi sono comunque solo i vantaggi meno rilevanti dell’architettura documento-vista, quelli più importanti li capiremo in seguito.

Proviamo ora a scrivere del testo nella finestra: cliccate sulla voce CPrg2View facendo così apparire tutte le funzioni di questa classe, fate quindi doppio clic sulla voce OnDraw(CDC* pDC), in tal modo il Visual C capirà di dover aprire il file contenente la funzione da voi scelta, ma non finisce qui, farà anche si che il corpo della funzione venga visualizzato al centro dello schermo!, cosa volete di più!

OnDraw come avrete capito dal nome è appunto la funzione che cercavamo, ci permette di disegnare sullo schermo tutto ciò che vogliamo e in più ci permette anche delle ‘facility’ per la stampa che vedremo in seguito.

A video dovrebbe apparirvi qualcosa del genere:

/////////////////////////////////////////////////////////////////////////////

// CPrg2View drawing

void CPrg2View::OnDraw(CDC* pDC)

{

CPrg2Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

}

Qui vediamo che il Wizard ha scritto già del codice per noi, innanzitutto tramite la funzione GetDocument() recupera un puntatore all’oggetto documento e ne verifica la validità, quindi ci dice nel commento che nelle righe successive possiamo aggiungere il codice per il disegno.

Diciamo subito, che se cercate di trovare nel codice le istanziazioni delle classi, non le troverete; ciò perché sono nascoste dietro al ‘Framework’, cioè all’infrastruttura dell’applicazione su cui si basa il nostro codice.

Infatti ‘in giro’ non troverete il codice per disegnare cursori, barre degli strumenti, finestre..., ma solo delle funzioni che richiamate permettono di fare ciò; infatti le loro implementazioni fanno parte della libreria MFC che a sua volta richiama le funzioni API standard.

Prima di disegnare qualcosa è anche bene capire cosa sia un contesto di dispositivo, o CDC per gli addetti ai lavori (come avrete visto un puntatore a tale classe è passato come parametro della funzione).

Il CDC (Class Device Context) è una classe che ci permette di astrarre il dispositivo su cui andremo a disegnare, in modo da poter adottare le medesime funzioni sia che scriviamo su schermo, che su stampante che su un plotter.

Questa classe ci offre tutte le funzioni per disegnare testo, cerchi, ellissi, linee...

Avremo modo di approfondire questi concetti, però ora cerchiamo di disegnare un bel cerchio sullo schermo:

Scrivete ciò che segue dopo il commento:

pDC->Ellipse(CRect(100,100,300,300));

La funzione Ellipse del contesto di dispositivo prende come parametri un oggetto CRect, tramite il quale definiamo le coordinate dei quattro angoli del rettangolo in cui è inscritta l’ellisse.

Provate da voi a fare delle prove con le funzioni LineTo, Rectangle e Polygon, aiutandovi magari con l’help in linea, e poi provate a stampare, avrete un spiacevole sorpresa!

Ciao e alla prossima.

 

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