Les ascenseurs

 

 

La première chose à faire, c'est de faire appraître les barres d'ascenseurs:

Dans le cas de'une fenêtre de type overlapped, pop-up, ou child window, il suffira d'ajouter les options dans le style de la fenêtre:

Pour rappel, le style de la fenêtre est déclaré par la fonction CreateWindow:

Pour l'ascenseur horizontal, on utilisera le style WS_HSCROLL, pour le vertical le style WS_VSCROLL

Voici un exemple:

hwnd = CreateWindowEx (WS_EX_CLIENTEDGE,szAppName, "Le titre de notre fenêtre",
WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);

Dans ce cas, les deux ascenseurs seront affichés.

 

Maintenant les ascenseurs sont affichés, il peut être utile de définir l'intervalle de variations, la taille des pages ainsi que la position du curseur de défilement:

Une fonction fait tout cela:

int SetScrollInfo(
HWND hwnd,
int fnBar,
LPCSCROLLINFO lpsi,
BOOL fRedraw
);

Les paramètres sont:

hwnd: Handle sur un contrôle "scroll bar" ou une window ayant les ascenseurs. Ce paramètre est lié au suivant:

fnBar: Spécifie le type d'ascenseur qui va recevoir les modifications:

Valeurs Désignations
SB_CTL Paramètre un contrôle de type scroll-bar
SB_HORZ Paramètre l'ascenseur horizontal de la fenêtre
SB_VERT Paramètre l'ascenseur vertical de la fenêtre

lpsi: Pointeur sur une structure de type SCROLLINFO. Cette structure devra être initialisée avant l'appel à cette fonction.

fRedraw : Indique à windows qu'il doit redessiner l'ascenseur avec ces nouvelles valeurs si TRUE.

La fonction retourne la position courante de la boite de défilement.

Remarque : Il est possible de cacher l'ascenseur à partir de cette fonction. Il suffit pour cela de mettre 0 en valeur min et max. De même, une incohérence dans les paramètres passés cachera aussi l'ascenseur.

 

De la même manière, il y a la fonction pour lire ces informations:

BOOL GetScrollInfo(
HWND hwnd,
int fnBar,
LPSCROLLINFO lpsi
);

Si la valeur en retour est 0, alors il y a une erreur.

 

Il y a toujours les anciennes fonctions (ne pas utiliser, c'est juste là pour information):

La fonction pour paramétrer l'intervalles des variations:

SetScrollRange (hwnd, nBar, nMin, nMax, bRedraw);

nBar soit à SB_VERT ou SB_HORIZ suivant que l'on veut modifier l'ascenseur vertical ou horizontal.
bRedraw à TRUE pour indiquer à Windows de redessiner la barre par rapport aux nouvelles valeurs.

Position des barres de défilement
SetScrollPos (hwnd, nBar, nPos, nRedraw);

Remarque concernant bRedraw:comme nous le verrons ensuite, il est possible de définir la position du curseur de défilement. Là aussi, il y aura ce paramètre bRedraw.Donc si vous voulez changer l'intervalle puis ensuite la position de ce curseur, il suffira d'indiquer bRedraw à TRUE que sur la dernière fonction initialisant ces différentes valeurs. Cela évitera de demander à Windows de redessiner les barres à chaque fois, alors qu'une seule fois suffit !

Pour lire l'intervalle: GetScrollRange(); ou la position GetScrollPos();

Désactiver/activer les ascenseurs:

La fonction EnableScrollBar() active ou désactive toutes ou une partie des ascenseurs:

BOOL EnableScrollBar(
HWND hWnd,
UINT wSBflags,
UINT wArrows
);

En entrée:

hWnd Handle sur une window ou d'un controle "scroll bar". Suivant la valeur de wSBflags

wSBflags Indique le type d'ascenseur

Valeur Désignation
SB_BOTH Active ou désactive les ascenseur horizontaux et verticaux d'une fenêtre
SB_CTL
Active ou désactive directement un ascenseur, il faudra donc passer le handle du controle "scroll bar" à désactiver
SB_HORZ Active ou désactive les ascenseurs horizontaux d'une fenêtre
SB_VERT Même chose mais verticaux cette fois-ci !



wArrows Pour spécifier les éléments du scroll bar à activer/désactiver

Valeur Désignation
ESB_DISABLE_BOTH Désactive les deux flêches de l'ascenseur
ESB_DISABLE_DOWN Désactive la flêche du bas d'un ascenseur vertical
ESB_DISABLE_LEFT Désactive la flêche gauche d'un ascenseur horizontal
ESB_DISABLE_LTUP Désactive la flêche gauche d'un ascenseur horizontal ou celle pointant vers le haut pour un vertical
ESB_DISABLE_RIGHT Désactive la flêche droite d'un ascenseur horizontal
ESB_DISABLE_RTDN Désactive la flêche droite d'un ascenseur horizontal ou celle pointant vers le bas pour un vertical
ESB_DISABLE_UP Désactive la flêche du haut d'un ascenseur vertical
ESB_ENABLE_BOTH Active toutes les flêches

 

En sortie:

Si l'opération fonctionne, la valeur retournée est différente de zéro.

Si une erreur ou si l'ascenseur est déjà dans l'état demandé, la valeur est 0. Utilisez alors GetLastError() pour plus de détails.

 

Enfin, il peut être intéressant d'afficher ou de cacher un ou les ascenseurs:

BOOL ShowScrollBar(
HWND hWnd,
int wBar,
BOOL bShow
);

Paramètres:

hWnd: Handle d'une window ou d'un control "scroll bar".
wBar: Indique l'ascenseur à cacher.

Valeur Désignation
SB_BOTH Affiche ou cache tous les ascenseurs d'une fenêtre standard
SB_CTL Affiche ou cache un control de type "scrollbar". hWnd doit être un contrôle
SB_HORZ Affiche ou cache l'ascenseur horizontal d'une fenêtre standard
SB_VERT Affiche ou cache l'ascenseur vertical d'une fenêtre standard

bShow: TRUE pour afficher, FALSE pour cacher.

La fonction retourne 0 si erreur.

 

A noter, si vous n'avez pas défini de style dans l'instruction CreateWindow pour les ascenseurs, il est toujours possible de les faire apparaître ensuite en utilisant cette fonction.

Enfin, ne surtout pas utiliser cette fonction dans WM_PAINT, car l'affichage ou non d'un ascenseur altère la zone client, donc cette fonction va renvoyer un WM_PAINT !

Les évènements:

Pour recevoir les évènements des ascenseurs, il suffit d'intercepter les messages dans la procédure de la fenêtre.

Les messages sont WM_VSCROLL ou WM_HSCROLL lorsque l'on clique sur la barre de défilement ou si on déplace le curseur.

Ces messages sont complétés avec le type d'action de la souris sur l'ascenseur. Chaque action de la souris génère au moins 2 messages l'un quand le bouton est pressé, l'autre quand relâché

L'action de la souris sera donc dans wParam. les identificateurs commençant par SB pour "scroll bar".

Que ce soit vertical ou horizontal, les indentificateurs utilisent toujours UP ou DOWN:

SB_LINEUP, SB_PAGEUP et idem DOWN

SB_ENDSCROLL indique bouton souris relâché, on peut l'ignorer en général.

SB_TOP et SB_BOTTOM si le curseur a atteind son minimum ou maximum, mais ce message n'est jamais reçu pour une fenêtre principale ! Cependant, comme cela sera vu dans le chapitre sur le clavier, ces évènements permettront de forcer la position du curseur de l'ascenseur au début ou à la fin.

Il y a aussi les identificateurs suivants:

si wParam vaut SB_THUMBTRACK ou SB_THUMBPOSITION, le mot de poids faible de lParam représente la position actuelle de la boîte de défilement
On utilisera alors la macro LOWORD (lParam) pour récupérer cette position.

 

Remarque:

On constatera qu'il n'y a rien concernant la gestion des ascenseurs par le clavier...

Normal, car il n'y a absolument rien de fait là dessus par Microsoft, ce sera donc à nous de tout faire !

Cette partie sera traitée rapidement dans le chapitre sur le clavier plus exactement dans le clavier et les ascenseurs.