Corso di Visual C++

Impostare una scrollbar

 

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