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.
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.