Ceci est une ancienne révision du document !
Utilisation et gestion des Scrollbars
Dans un component
Affichage
Affichage : API Windows ShowScrollBar(Handle, SB_BOTH, true);
- Handle = Handle du component (TWinControl.handle)
- SB_BOTH = affichage des deux SB_HORZ et SB_VERT
- True = visible
Capter les messages de Scroll
Pour capter les scrolling, implementer les procedures suivantes
procedure WMHScroll(var Msg: TLMScroll); message WM_HSCROLL; procedure WMVScroll(var Msg: TLMScroll); message WM_VSCROLL;
Le message TLMScroll contient les membres suivants:
- LMessages
TLMScroll = record Msg: Cardinal; ... ScrollCode: SmallInt; // code voir plus bas SmallPos: SmallInt; // Position sous forme d'un SmallInt ScrollBar: HWND; // Handle de la scrollbar ... Result: LRESULT; // See remark Pos: LongInt; // Position en integer end;
ScrollCodes
- defines.inc
{ Scroll Bar notifications } SB_LINEUP = 0; // On appuis sur le bouton a l’extrémité haute SB_LINEDOWN = 1; // On appuis sur le bouton a l’extrémité basse SB_LINELEFT = 0; // On appuis sur le bouton a l’extrémité gauche SB_LINERIGHT = 1;// On appuis sur le bouton a l’extrémité droite SB_PAGEUP = 2; // On click entre la Scroll Box et le bouton à l’extrémité haute SB_PAGEDOWN = 3; // On click entre la Scroll Box et le bouton à l’extrémité basse SB_PAGELEFT = 2; // On click entre la Scroll Box et le bouton à l’extrémité gauche SB_PAGERIGHT = 3; // On click entre la Scroll Box et le bouton à l’extrémité droite SB_THUMBPOSITION = 4; // On relâche (drop) le Scroll Box ou on utilise la molette de la souris SB_THUMBTRACK = 5; // On tire (drag) le Scroll Box SB_ENDSCROLL = 8; // On sort de la Scrollbar SB_LEFT = 6; // On positionne la Scroll Box a l'extremité gauche (avec le menu contextuel) SB_RIGHT = 7; // On positionne la Scroll Box a l'extremité droite (avec le menu contextuel) SB_BOTTOM = 7; // On positionne la Scroll Box a l'extremité basse(avec le menu contextuel) SB_TOP = 6; // On positionne la Scroll Box a l'extremité haute (avec le menu contextuel)
Modifier la Scrollbar avec ScrollInfo
Structure TScrollInfo
tagScrollInfo = record cbSize : UINT; // Taille de cette structure = sizeof(TScrollInfo) fMask : UINT; // Voir ci dessous nMin: Integer; nMax: Integer; nPage: UInt; // Taille de la ScrollBox proportionnellement au range de la ScrollBar nPos: Integer; // Position par rapport au range de la ScrollBar nTrackPos: Integer; end; PScrollInfo = ^TScrollInfo; TScrollInfo = tagScrollinfo;
fMask
fMask : Spécifie les paramètres de la ScrollBar à définir ou à récupérer.
Valeur | Signification |
---|---|
SIF_ALL | SIF_PAGE or SIF_POS or SIF_RANGE or SIF_TRACKPOS |
SIF_DISABLENOSCROLL | Cette valeur n'est utilisée que lors de la définition des paramètres d'une barre de défilement. Si les nouveaux paramètres de la barre de défilement la rendent inutile, désactivez la barre de défilement au lieu de la supprimer. |
SIF_PAGE | Le membre nPage contient la taille de page pour une Scrollbar proportionnelle. |
SIF_POS | Le membre de nPos contient la position de la Scroll Box, qui n'est pas mise à jour lorsque l'utilisateur fait glisser la Scroll Box. |
SIF_RANGE | Les membres nMin et nMax contiennent les valeurs minimales et maximales de la plage de défilement. |
SIF_TRACKPOS | Le membre nTrackPos contient la position actuelle de la Scroll Box pendant que l'utilisateur la fait glisser. |
nPage
C'est la taille que doit faire la ScrollBox, proportionnellement au range de la ScrollBar.
Par exemple si on défini nPage a 100 et que la ScrollBar a un Min de 0 et un Max de 1000, la taille de la ScrollBox fera un dixième de la taille de la ScrollBar.
Apparemment il y aurait un minimum, c'est a dire que si on défini nPage à 1, la ScrollBox ne s'adapte pas exactement a la taille, elle reste a une taille convenable pour être saisie.
Connaitre la taille des Scrollbar
Les valeurs ci-dessous sont les valeurs relevées sur mon system.
GetSystemMetrics(SM_CXHSCROLL) = 17 GetSystemMetrics(SM_CYHSCROLL) = 17 GetSystemMetrics(SM_CXHTHUMB) = 17 GetSystemMetrics(SM_CXVSCROLL) = 17 GetSystemMetrics(SM_CXVSCROLL) = 17 GetSystemMetrics(SM_CYVTHUMB) = 17 GetSystemMetrics(SM_MOUSEHORIZONTALWHEELPRESENT) = 0 // 0 = pas de molette horizontale sur ma souris. GetSystemMetrics(SM_MOUSEWHEELPRESENT) = 1 // 1 = Une molette verticale est presente sur ma souris
Source : https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getsystemmetrics
Autres fonctions
- func.inc
function SetScrollPos(hWnd:HWND; nBar:longint; nPos:longint; bRedraw:WINBOOL):longint; external 'user32' name 'SetScrollPos'; function GetScrollPos(hWnd:HWND; nBar:longint):longint; external 'user32' name 'GetScrollPos'; function SetScrollRange(hWnd:HWND; nBar:longint; nMinPos:longint; nMaxPos:longint; bRedraw:WINBOOL):WINBOOL; external 'user32' name 'SetScrollRange'; function GetScrollRange(hWnd:HWND; nBar:longint; lpMinPos:LPINT; lpMaxPos:LPINT):WINBOOL; external 'user32' name 'GetScrollRange'; function ShowScrollBar(hWnd:HWND; wBar:longint; bShow:WINBOOL):WINBOOL; external 'user32' name 'ShowScrollBar'; function EnableScrollBar(hWnd:HWND; wSBflags:UINT; wArrows:UINT):WINBOOL; external 'user32' name 'EnableScrollBar'; function GetScrollInfo(hWnd: HWND; BarFlag: Integer; var ScrollInfo: TScrollInfo): BOOL; external 'user32' name 'GetScrollInfo'; function SetScrollInfo(hWnd: HWND; BarFlag: Integer; const ScrollInfo: TScrollInfo; Redraw: BOOL): Integer; external 'user32' name 'SetScrollInfo';
Source : https://docs.microsoft.com/en-us/windows/win32/controls/bumper-scroll-bars-reference-functions