Sign in Join
Wiki copytemporary

LCL Internals - Resizing, Moving/fr: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Présentation
22
33La bibliothèque LCL possède de nombreuses propriétés de redimensionnement (Left, Width, Anchors, Align, AnchorSide, AutoSize, Constraints, ChildSizing, ...) et des points d'ancrage (hooks)avec lesquels les applications peuvent modifier le comportement de l'application (OnResize, OnChangeBounds, ...). Comme tous ces éléments ne peuvent pas être calculés en une seule étape, les contrôles peuvent beaucoup se déplacer avant que les coordonnées finales ne soient disponibles. Pour réduire les risques de scintillement, la bibliothèque LCL n'envoie pas tous les déplacements ou redimensionnements à l'interface de la bibliothèque LCL. Par exemple, au cours des Begin/EndAlign et csLoading, aucun move/resize n'est envoyé à l'interface. Le widgetset va essayer de suivre les conseils de la bibliothèque LCL, mais il y a quelques cas où il ne le fera pas. Par exemple, les fiches(fenêtres de haut niveau) sont limitées par les politiques de gestion de fenêtres, et TPage dépend entièrement de la taille et du thème de TNotebook.
44
55## Comment la bibliothèque LCL indique à l'interface de redimensionner / déplacer une poignée(handle)
66
77Dans TWinControl.DoSendBoundsToInterface la fonction widget SetBounds est appelée
88
9-` TWSWinControlClass(WidgetSetClass).SetBounds(Self, Left, Top, Width, Height);`
9+```text
10+ TWSWinControlClass(WidgetSetClass).SetBounds(Self, Left, Top, Width, Height);
11+```
1012
1113## Comment l'interface dit à la bibliothèque LCL de redimensionner / déplacer une poignée
1214
1315### Quand la zone client d'une poignée a été redimensionnée
1416
1517*Note*: Si le thème change, le cadre d'un TGroupBox peut changer. Cela laisse la taille et la position du TGroupBox inchangées, mais ce n'est pas le cas pour l'espace client. L'interface appelle
1618
17-` LCLControl.InvalidateClientRectCache(false);`
19+```text
20+ LCLControl.InvalidateClientRectCache(false);
21+```
1822
1923et envoie un message LM_SIZE comme ci-dessous.
2024
2125### Quand une poignée d'un TWinControl a été redimensionnée / déplacée
2226
2327#### Tout d'abord, l'interface de la bibliothèque LCL envoie un message LM_WINDOWPOSCHANGED
2428
2529- x := Left (par rapport à 0,0 de la zone cliente du parent)
2630- y := Top
2731- cx := Width
2832- cy := Height
2933
3034#### Ensuite, un message LM SIZE est envoyé
3135
3236- Width
3337- Height
3438- SizeType est un drapeau d'un bit contenant Size_SourceIsInterface plus une des valeurs SIZENORMAL, SIZEICONIC, SIZEFULLSCREEN.
3539
3640#### Ensuite, un message LM_MOVE est envoyé
3741
3842- MoveType := Move_SourceIsInterface;
3943- XPos := Left (par rapport à 0,0 de la zone cliente du parent)
4044- YPos := Top
4145
4246### Quand une fiche est à son maximum, minimisée ou restaurée, l'interface envoie un message LM_SIZE
4347
4448- Width
4549- Height
4650- SizeType est un drapeau d'un bit contenant Size_SourceIsInterface plus une des valeurs SIZENORMAL, SIZEICONIC, SIZEFULLSCREEN.
4751
4852## Comment la bibliothèque LCL obtient la taille/la position de la poignée de l'interface de la bibliothèque LCL
4953
5054### LCLIntf.GetWindowSize(Handle, InterfaceWidth, InterfaceHeight)
5155
5256Renvoie la largeur et la hauteur courante d'une poignée.
5357
5458### LCLIntf.GetClientRect(Handle, Result)
5559
5660Retourne la largeur et la hauteur actuelles(gauche et haut sont toujours à 0) de la zone cliente d'une poignée (= zone intérieure à l'intérieur des frontières / cadre d'un contrôle).
5761
5862### TWSWinControlClass(WidgetSetClass).GetDefaultClientRect(Self, Left, Top, Width, Height, Result)
5963
6064Cette fonction est appelée en premier lieu par la bibliothèque LCL pour obtenir le ClientRect. Si elle retourne false, la bibliothèque LCL va utiliser la fonction GetClientRect si une poignée a déjà été créée, sinon les valeurs chargées à partir du fichier .lfm. Si tout cela échoue, la valeur par défaut est Rect(0,0,Width,Height). GetDefaultClientRect peut être utilisée par l'interface de la bibliothèque LCL pour réduire le scintillement en offrant de bonnes valeurs avant que la poignée ne soit créée.
6165
6266### GetWindowRelativePosition(Handle,NewLeft,NewTop)
6367
6468Renvoie les valeurs Left et Top actuelles d'une poignée relative à l'espace client (0,0) de son parent.
6569
6670## Contraintes
6771
6872La bibliothèque LCL demande à l'interface les contraintes(min, max pour la largeur et la hauteur) avec la fonction
6973
70-` GetControlConstraints`
74+```text
75+ GetControlConstraints
76+```
7177
7278Par exemple: sous gtk, une barre de défilement horizontale a une hauteur fixe.
7379
7480## Taille préférée
7581
7682Pour un redimensionnement automatique d'un contrôle (par exemple, un TButton ou un TLabel), la bibliothèque LCL demande à l'interface la taille minimale pour rendre le contrôle agréable :
7783
78-` TWSWinControlClass(WidgetSetClass).GetPreferredSize(Self, PreferredWidth, PreferredHeight, WithThemeSpace);`
84+```text
85+ TWSWinControlClass(WidgetSetClass).GetPreferredSize(Self, PreferredWidth, PreferredHeight, WithThemeSpace);
86+```
7987
8088## Défilement
8189
8290La bibliothèque LCL fait défiler les contrôles fils seulement virtuellement. Cela signifie que leurs propriétés Left et Top ne changent pas. Pour les faire défiler, utilisez la fonction d'interface
8391
84-` TWSScrollingWinControlClass(WidgetSetClass).ScrollBy(Self, DeltaX, DeltaY);`
92+```text
93+ TWSScrollingWinControlClass(WidgetSetClass).ScrollBy(Self, DeltaX, DeltaY);
94+```
8595
8696## Divers
8797
8898### LCLIntf.GetClientBounds(Handle,Result);
8999
90100Retourne le rectangle du client qui n'a pas défilé par rapport aux propriétés Top et Left de la poignée. En d'autres termes, c'est équivalent à :
91101
92-` CurClientBounds := GetClientRect(Handle)`\
93-` OffsetRect(CurClientBounds,FrameBorderLeft,FrameBorderTop);`
102+``` pascal
103+ CurClientBounds := GetClientRect(Handle)
104+ OffsetRect(CurClientBounds,FrameBorderLeft,FrameBorderTop);
105+```
94106
95107---
96108*From the Free Pascal wiki, page "LCL Internals - Resizing, Moving/fr", as it stood on 2019-10-07 after a change by Gillou58, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history