Corso di Visual C++

Aggiungere una scrollbar alla vista

 

Per spiegare cosa sono e a cosa servono le scrollbar, create un nuovo progetto, chiamatelo Prg17 e assegnategli le solite impostazioni di default con il Wizard ( ricordate di selezionare Single Document allo step 1 ).

Modificate OnDraw nel seguente modo:

void CPrg17View::OnDraw(CDC* pDC)

{

CFont MyFont,*pOldFont;

pDC->SetMapMode(MM_LOMETRIC); // settiamo la modalità di mapping

LOGFONT lf;

memset(&lf, 0, sizeof(LOGFONT)); // azzera tutti i membri della struttura

lf.lfHeight = -180; // font di altezza 18 mm

strcpy(lf.lfFaceName, "Times New Roman"); // scelta tipo carattere

VERIFY(MyFont.CreateFontIndirect(&lf)); // crea il font dalla struttura LOGFONT

 

pOldFont=pDC->SelectObject(&MyFont); // seleziona il font nel contesto di dispositivo ( DC )

pDC->SetTextColor(RGB(0,0,255)); // scegliamo il colore blu

pDC->TextOut(60,-60,"Software Planet: www.softwareplanet.net"); // scriviamo il testo

pDC->SelectObject(pOldFont); // ripristiniamo il contesto di dispositivo

}

In questo snippet ho volutamente creato un font in un modo che non ho spiegato: utilizzando la funzione CreateFontIndirect. La sola differenza da CreateFont è che in questo caso il font viene creato attraverso una struttura e non passando i parametri alla funzione. Può risultare utile quando si vogliono utilizzare font standard e/o si desidera specificare poche opzioni.

Ho utilizzato anche la macro VERIFY, che come fa intuire il nome verifica che il valore tra parentesi sia diverso da 0, in caso contrario blocca l'esecuzione del programma. É comoda in fase di Debug perché permette di verificare la corretta allocazione di oggetti e i valori di ritorno dalle funzione e di evitare così di proseguire l'elaborazione con oggetti non significativi.

Effettuando un 'Run' probabilmente vi accorgerete che nella finestra non è visibile tutto il testo, ma avete bisogno di ridimensionare la finestra. Per ovviare a questo inconveniente possiamo utilizzare le barre di scorrimento ( scrollbar per gli amici ) che consentono di spostare la viewport ( l'area visibile ) della finestra.

Una barra di scorrimento è una finestra ( nel senso che è un oggetto derivato da CWnd ) con alle estremità due frecce e con nel mezzo una casella di scorrimento; può essere disposta o in orizzontale o in verticale. Quando la suddetta finestra riceve un clic del mouse, invia dei messaggi al suo genitore per informarlo dell'evento. In seguito a ciò il contenuto della finestra non si 'sposterà' automaticamente, ma dovremo gestire noi i suddetti messaggi affinché ciò avvenga.

Innanzitutto dobbiamo aggiungere alla finestra della vista le barre; per far ciò dobbiamo applicare allo stile di finestra l'attributo WS_HSCROLL e WS_VSCROLL.
Una funzione che in una finestra consente ciò è OnCreate, infatti questa viene richiamata dal Framework in seguito ad una richiesta dell'applicazione per la creazione dell'oggetto finestra. Questa richiesta viene effettuata richiamando o la funzione Create o CreateEx. Queste due funzioni sono richiamate dopo la creazione dell'oggetto CWnd, ma prima che la finestra venga visualizzata sullo schermo. OnCreate è richiamata prima che Create o CreateEx ritornino in modo da poter cambiare dei parametri di inizializzazione contenuti in un oggetto di tipo CREATESTRUCT passato alla funzione.
Per il nostro scopo occorre agire sull'oggetto finestra CView, a tale uopo possiamo utilizzare la funzione PreCreateWindow che viene richiamata prima di OnCreate, per consentire la modifica degli attributi di finestra.

Modifichiamo in questo modo la funzione PreCreateWindow di CPrg17View:

BOOL CPrg17View::PreCreateWindow(CREATESTRUCT& cs)

{

cs.style|=WS_HSCROLL | WS_VSCROLL; // aggiungiamo gli stili per le barre

return CView::PreCreateWindow(cs);

}

A questo punto abbiamo le barre di scorrimento, ma non funzionano!.

Infatti, come già detto, le dobbiamo ancora programmare, ma inizieremo a vedere come fare nel prossimo articolo.

Chi vuole scaricare il progetto CPrg17, clicchi qui.

 

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