Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
prog:lazarus:classes:tcontrols:dimensions [27/08/2024 18:26] thierry [Bloquer le redimensionnement] |
prog:lazarus:classes:tcontrols:dimensions [02/09/2024 18:58] (Version actuelle) thierry [TControl.BoundsRect] |
||
---|---|---|---|
Ligne 68: | Ligne 68: | ||
</code> | </code> | ||
- | ===== Capter le changement de Size du Parent ===== | + | ==== TControl.BoundsRect ==== |
- | ==== Parent.AddHandlerOnResize ==== | + | <code pascal> |
+ | function TControl.GetBoundsRect: TRect; | ||
+ | begin | ||
+ | Result.Left := FLeft; | ||
+ | Result.Top := FTop; | ||
+ | Result.Right := FLeft+FWidth; | ||
+ | Result.Bottom := FTop+FHeight; | ||
+ | end; | ||
+ | |||
+ | </code> | ||
+ | ==== TControl.ClientToScreen ==== | ||
+ | |||
+ | <code pascal> | ||
+ | {------------------------------------------------------------------------------ | ||
+ | function TControl.ClientToScreen(const APoint: TPoint): TPoint; | ||
+ | ------------------------------------------------------------------------------} | ||
+ | function TControl.ClientToScreen(const APoint: TPoint): TPoint; | ||
+ | var | ||
+ | P : TPoint; | ||
+ | begin | ||
+ | P := ClientOrigin; | ||
+ | Result.X := APoint.X + P.X; | ||
+ | Result.Y := APoint.Y + P.Y; | ||
+ | end; | ||
+ | |||
+ | function TControl.ClientToScreen(const ARect: TRect): TRect; | ||
+ | var | ||
+ | P : TPoint; | ||
+ | begin | ||
+ | P := ClientToScreen(Point(0, 0)); | ||
+ | Result := ARect; | ||
+ | Result.Offset(P); | ||
+ | end; | ||
+ | |||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Redimensionnement (AutoSize) ===== | ||
+ | ==== Bloquer le redimensionnement ==== | ||
+ | <note>A Tester</note> | ||
+ | En surchargeant la function :''function TWinControl.AutoSizeDelayed: boolean;'' on peut bloquer le redimensionnement. | ||
+ | |||
+ | Je pense qu'il faut aussi surcharger : ''AutoSizeDelayedReport'' et ''AutoSizeDelayedHandle'' | ||
+ | <code pascal \lcl\include\wincontrol.inc> | ||
+ | {------------------------------------------------------------------------------ | ||
+ | function TWinControl.AutoSizeDelayed: boolean; | ||
+ | ------------------------------------------------------------------------------} | ||
+ | function TWinControl.AutoSizeDelayed: boolean; | ||
+ | begin | ||
+ | Result:=(csDestroyingHandle in ControlState) | ||
+ | or (inherited AutoSizeDelayed); | ||
+ | end; | ||
+ | |||
+ | function TWinControl.AutoSizeDelayedReport: string; | ||
+ | begin | ||
+ | if csDestroyingHandle in ControlState then | ||
+ | Result:='csDestroyingHandle' | ||
+ | else | ||
+ | Result:=inherited AutoSizeDelayedReport; | ||
+ | end; | ||
+ | |||
+ | {------------------------------------------------------------------------------ | ||
+ | TWinControl AutoSizeDelayedHandle | ||
+ | |||
+ | Returns true if AutoSize should be skipped / delayed because of its handle. | ||
+ | A TWinControl needs a parent handle. | ||
+ | ------------------------------------------------------------------------------} | ||
+ | function TWinControl.AutoSizeDelayedHandle: Boolean; | ||
+ | begin | ||
+ | Result := (Parent = nil) and (ParentWindow = 0); | ||
+ | end; | ||
+ | </code> | ||
+ | |||
+ | ==== Capter le changement de Size du Parent ==== | ||
+ | === Avec le Handler OnResize du Parent === | ||
* Le code ci-dessous met en place, grace a ''AddHandlerOnResize'', une logique permettant à un contrôle personnalisé de répondre aux événements de redimensionnement de son Parent. | * Le code ci-dessous met en place, grace a ''AddHandlerOnResize'', une logique permettant à un contrôle personnalisé de répondre aux événements de redimensionnement de son Parent. | ||
* Grace a la surcharge de la procédure ''SetParent'', lorsqu'un changement de parent a lieu, il désinscrit l'ancien parent des événements de redimensionnement et inscrit le nouveau parent, garantissant ainsi que ''OnParentResizeHandler'' est appelé chaque fois que le parent est redimensionné. | * Grace a la surcharge de la procédure ''SetParent'', lorsqu'un changement de parent a lieu, il désinscrit l'ancien parent des événements de redimensionnement et inscrit le nouveau parent, garantissant ainsi que ''OnParentResizeHandler'' est appelé chaque fois que le parent est redimensionné. | ||
Ligne 104: | Ligne 180: | ||
end; | end; | ||
</code> | </code> | ||
- | ===== Redimensionnement (AutoSize) ===== | + | === Avec interception du message WM_SIZE === |
- | ==== Bloquer le redimensionnement ==== | + | <code pascal> |
- | <note>A Tester</note> | + | protected |
- | En surchargeant la function :''function TWinControl.AutoSizeDelayed: boolean;'' on peut bloquer le redimensionnement. | + | procedure WndProc(var TheMessage: TLMessage); override; |
+ | ... | ||
+ | |||
+ | procedure TMyControl.WndProc(var TheMessage: TLMessage); | ||
+ | var | ||
+ | vWMSize: TWMSize; | ||
+ | begin | ||
+ | inherited WndProc(TheMessage); | ||
+ | if TheMessage.Msg = WM_SIZE then | ||
+ | begin | ||
+ | vWMSize := TWMSize(TheMessage); | ||
+ | |||
+ | DebugLn('%s.WndProc : Le parent a été redimensionné, SizeType[%d] H[%d] W[%d]', | ||
+ | [Name, vWMSize.SizeType, vWMSize.Height, vWMSize.Width]); | ||
+ | // Le parent a été redimensionné | ||
+ | // Implémenter ici la logique de redimensionnement du contrôle | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | </code> | ||
+ | == TWMSize.SizeType == | ||
+ | le paramétre SizeType peut avoir les valeurs suivantes : | ||
+ | <code pascal unit Windows (\fpc\3.2.2\source\rtl\win\wininc\defines.inc)> | ||
+ | { WM_SIZE message } | ||
+ | SIZE_MAXHIDE = 4; | ||
+ | SIZE_MAXIMIZED = 2; | ||
+ | SIZE_MAXSHOW = 3; | ||
+ | SIZE_MINIMIZED = 1; | ||
+ | SIZE_RESTORED = 0; | ||
+ | </code> | ||
+ | Il peut arriver que les valeurs soit : | ||
+ | * SizeType = 6 : Force le realignement (voir ci-dessous) | ||
+ | * SizeType = 128 : JE NE SAIS PAS ??? | ||
+ | |||
+ | **SizeType = 6** | ||
+ | <code pascal unit Controls (\lcl\include\wincontrol.inc)> | ||
+ | procedure TWinControl.SendMoveSizeMessages(SizeChanged, PosChanged: boolean); | ||
+ | begin | ||
+ | ... | ||
+ | with SizeMsg do | ||
+ | begin | ||
+ | Msg := LM_SIZE; | ||
+ | SizeType := 6; // force realign | ||
+ | ... | ||
+ | Width := FWidth; | ||
+ | Height := FHeight; | ||
+ | ... | ||
+ | WindowProc(TLMessage(SizeMsg)); | ||
+ | end; | ||
+ | </code> | ||
+ | |||
+ | |||