Dopo aver creato la barra è necessario definire un intervallo di scorrimento, la posizione della casella di scorrimento e la grandezza della pagina.
L'intervallo di scorrimento è dato da una coppia di interi che definiscono il limite inferiore e superiore all'interno del quale si può muovere la casella di scorrimento ( di cui si può definire la posizione ). La grandezza di pagina si riflette per ora solo sulla dimensione di quest'ultima e serve a dare un'idea della grandezza totale del documento. Se non si imposta posizione e grandezza pagina, il Windows da dai valori di default.
Vorrei fare un'osservazione importantissima: l'intervallo di scorrimento
non può essere maggiore di 32767 a causa di rimasugli di
win16. Ciò comporta che se ad esempio utilizzate la modalità
di mapping MM_HIMETRIC non potete gestire un documento più
grande di 327mm!
Inoltre se settate il minimo ed il massimo dell'intervallo a 0,
accadrà che scomparirà la barra di scorrimento.
Per settare l'intervallo di scorrimento occorre utilizzare la funzione di CWnd SetScrollRange; il suo prototipo è il seguente:
void SetScrollRange( int nBar, int nMinPos, int nMaxPos, BOOL bRedraw = TRUE );
Il parametro nBar può assumere i valori SB_HORZ oppure SB_VERT dipendentemente dal fatto che si voglia agire sulla barra orizzontale o quella verticale.
I successivi due parametri impostano i limiti inferiore e superiore dell'intervallo di scorrimento.
L'ultimo parametro se uguale a TRUE forza il ridisegno della barra.
La funzione SetScrollPos consente invece di settare la posizione della casella di scorrimento; il suo prototipo è il seguente:
int SetScrollPos( int nPos, BOOL bRedraw = TRUE );
Il valore di ritorno è il valore della posizione precedente della scrollbar.
Il primo parametro serve a settare la nuova posizione della casella di scorrimento ( questa deve rientrare entro l'intervallo prescelto ).
L'ultimo parametro se posto uguale a TRUE forza il ridisegno della barra.
Nel caso in cui si chiamano in successione SetScrollRange e SetScrollPos, conviene impostare il parametro di ridisegno della prima a FALSE. In questo modo la barra non viene ridisegnata due volte in un lasso di tempo molto breve e si evita così un fastidioso effetto di sfarfallio.
Per impostare la dimensione pagina di una Scrollbar è necessario utilizzare la funzione SetScrollInfo, questa prende come uno dei parametri una struttura di tipo SCROLLINFO che permette di specificare anche intervallo e posizione di scorrimento. Quindi volendo è possibile effettuare tutte le impostazioni in un solo passaggio.
Il prototipo di questa funzione è il seguente:
BOOL SetScrollInfo( int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE );
nBar può assumere i valori SB_VERT o SB_HORZ ( per applicare le impostazioni alla barra verticale o a quella orizzontale ), mentre bRedraw forze il ridisegno della barra.
La definizione della struttura SCROLLINFO è la seguente:
typedef struct tagSCROLLINFO
{
UINT cbSize;
UINT fMask;
int nMin;
int nMax;
UINT nPage;
int nPos;
int nTrackPos;
} SCROLLINFO, *LPSCROLLINFO;
typedef SCROLLINFO CONST *LPCSCROLLINFO;
Il primo parametro deve essere impostato con la dimensione in byte della struttura ( utilizzare l'operatore sizeof ); fMask consente di scegliere i parametri che si vogliono settare e può essere una combinazione di varie costanti che è possibile trovare nell'help in linea; vediamo le più importanti: per settare la grandezza pagina usare SIF_PAGE, per la posizione SIF_POS e per l'intervallo SIF_RANGE. Per impedire alla barra di accettare input utilizzare la costante SIF_DISABLENOSCROLL.
Ad esempio per impostare l'intervallo di scorrimento a ( 0 , 1000 ), la posizione a 250, e la grandezza pagina a 100, utilizzare le seguenti istruzioni:
SCROLLINFO si;
si.cbSize = sizeof ( SCROLLINFO);
si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
si.nPage = 100;
si.nMin = 0;
si.nMax = 1000;
si.nPos = 250;
SetScrollInfo( SB_VERT, &si, TRUE );
Nel prossimo articolo vedremo finalmente come effettuare lo scrolling di una finestra e gestire i messaggi inviati dalle barre.
Torna all'indice Generale del corso di Corso di Visual C++ di Software Planet