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:tcontrols2 [19/08/2024 16:21] thierry [Dessin du TControl] |
prog:lazarus:classes:tcontrols:tcontrols2 [29/08/2024 19:07] (Version actuelle) thierry [Savoir quelle partie (TRect) du Control est affiché] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ===== Dessin des Controls ===== | + | ====== Dessin des Controls ====== |
- | ==== Bloquer l'affichage du control lors d'un Update ==== | + | ===== Méthode PAINT ===== |
+ | ==== Quand est appelée PAINT ? ==== | ||
+ | La méthode ''Paint'' d'un ''TControl'' est appelée dans plusieurs circonstances liées à la nécessité de redessiner l'interface utilisateur. Voici les principaux moments où cette méthode est appelée : | ||
+ | |||
+ | 1. **Lors de la création du contrôle :** Quand un contrôle est créé pour la première fois, la méthode `Paint` est appelée pour dessiner l'apparence initiale du contrôle. | ||
+ | |||
+ | 2. **Lors d'un rafraîchissement ou d'une invalidation :** Si le contrôle est explicitement invalidé en appelant la méthode `Invalidate` ou `Repaint`, le système de rendu de Windows planifie un message de peinture, et la méthode `Paint` sera appelée pour redessiner le contrôle. | ||
+ | |||
+ | 3. **Lorsqu'une partie du contrôle est recouverte puis découverte :** Par exemple, si une autre fenêtre recouvre partiellement le contrôle, puis est déplacée, la méthode `Paint` sera appelée pour redessiner la partie découverte. | ||
+ | |||
+ | 4. **Lors de la redimensionnement du contrôle :** Si les dimensions du contrôle changent (par exemple, si l'utilisateur redimensionne la fenêtre contenant le contrôle), la méthode `Paint` est appelée pour ajuster et redessiner le contenu en fonction des nouvelles dimensions. | ||
+ | |||
+ | 5. **Lors du défilement (scrolling) :** Si le contrôle est dans une zone défilable et que le contenu est déplacé par défilement, `Paint` peut être appelée pour dessiner les nouvelles parties du contrôle qui deviennent visibles. | ||
+ | |||
+ | 6. **Lors du changement de style ou de propriétés visuelles :** Si certaines propriétés visuelles du contrôle changent (comme la couleur, le style de police, etc.), la méthode `Paint` est appelée pour redessiner le contrôle avec les nouvelles propriétés. | ||
+ | |||
+ | La méthode `Paint` fait partie du cycle de peinture des contrôles dans l'API Windows. C'est une méthode clé pour assurer que les contrôles graphiques sont correctement affichés à l'écran, réagissant aux changements de l'état visuel ou de la disposition du formulaire. | ||
+ | |||
+ | |||
+ | ===== Bloquer l'affichage du control lors d'un Update ===== | ||
Il est possible que l'on ai besoin de "figer" le contrôle, lorsque l'on met a jour ses enfants par exemple, pour éviter le scintillement de celui-ci. | Il est possible que l'on ai besoin de "figer" le contrôle, lorsque l'on met a jour ses enfants par exemple, pour éviter le scintillement de celui-ci. | ||
Ligne 41: | Ligne 60: | ||
</code> | </code> | ||
===== TControlBorderSpacing ===== | ===== TControlBorderSpacing ===== | ||
- | **TControlBorderSpacing** est une classe utilisée dans les environnements de développement visuel comme Lazarus (basé sur la bibliothèque de composants Free Pascal) pour gérer l'espacement autour d'un contrôle. Elle est particulièrement utile pour définir les marges (espace vide) entre un contrôle et les autres contrôles environnants, ou entre un contrôle et les bords de son conteneur parent. | + | ''TControlBorderSpacing'' est une classe utilisée pour gérer l'espacement autour d'un contrôle.\\ |
+ | Elle est particulièrement utile pour définir les marges (espace vide) entre un contrôle et les autres contrôles environnants, ou entre un contrôle et les bords de son conteneur parent. | ||
=== Rôle de TControlBorderSpacing === | === Rôle de TControlBorderSpacing === | ||
Ligne 60: | Ligne 80: | ||
Supposons que vous ayez un **TButton** placé dans un **TPanel**, et que vous souhaitiez ajouter un espace de 10 pixels autour du bouton pour qu'il ne touche pas directement les bords du panneau. Vous pourriez configurer **TControlBorderSpacing** comme suit : | Supposons que vous ayez un **TButton** placé dans un **TPanel**, et que vous souhaitiez ajouter un espace de 10 pixels autour du bouton pour qu'il ne touche pas directement les bords du panneau. Vous pourriez configurer **TControlBorderSpacing** comme suit : | ||
- | ``` | ||
<code pascal> | <code pascal> | ||
Button1.BorderSpacing.Around := 10; | Button1.BorderSpacing.Around := 10; | ||
</code> | </code> | ||
- | ``` | ||
Ou, pour spécifier des marges différentes pour chaque côté : | Ou, pour spécifier des marges différentes pour chaque côté : | ||
- | ``` | ||
<code pascal> | <code pascal> | ||
Button1.BorderSpacing.Left := 5; | Button1.BorderSpacing.Left := 5; | ||
Ligne 76: | Ligne 93: | ||
</code> | </code> | ||
- | En utilisant **TControlBorderSpacing**, vous pouvez contrôler précisément l'espacement des contrôles dans une interface utilisateur, ce qui est particulièrement utile lorsque vous travaillez avec des layouts dynamiques ou des interfaces utilisateur complexes. | + | En utilisant ''TControlBorderSpacing'', vous pouvez contrôler précisément l'espacement des contrôles dans une interface utilisateur, ce qui est particulièrement utile lorsque vous travaillez avec des layouts dynamiques ou des interfaces utilisateur complexes. |
+ | |||
+ | ===== Savoir quelle partie (TRect) du Control est affiché ===== | ||
+ | |||
+ | La fonction ''TMyControl.GetVisibleRect'' ci-dessous __calcule la partie visible d'un contrôle__ personnalisé sous forme d'un ''TRect'', en tenant compte des limites imposées par ses parents dans la hiérarchie visuelle.\\ | ||
+ | Elle traverse tous les parents du contrôle, réduisant progressivement le rectangle visible à l'intersection avec chaque parent. Le résultat est le rectangle visible final en coordonnées locales, retourné par la fonction. | ||
+ | <code pascal> | ||
+ | function TMyControl.GetVisibleRect: TRect; | ||
+ | var | ||
+ | vParent: TWinControl; | ||
+ | vRect, vParentRect: TRect; | ||
+ | vP: TPoint; | ||
+ | begin | ||
+ | assert(assigned(Parent)); | ||
+ | |||
+ | vRect := BoundsRect; // Le TControl en entier, pas juste ClientRect | ||
+ | if assigned(Parent) then | ||
+ | begin | ||
+ | vParent := Parent; | ||
+ | vP := ControlOrigin; | ||
+ | vRect.Offset(vP); | ||
+ | |||
+ | { On scan tous les Parents } | ||
+ | while assigned(vParent) and not (vRect.IsEmpty) do | ||
+ | begin | ||
+ | vParentRect := vParent.ClientToScreen(vParent.ClientRect); | ||
+ | vRect := vRect.Intersect(vRect, vParentRect); | ||
+ | vParent := vParent.Parent; | ||
+ | end; | ||
+ | |||
+ | if not vRect.IsEmpty then vRect.Offset(-vP.X, -vP.y); | ||
+ | |||
+ | end; | ||
+ | |||
+ | Result := vRect; | ||
+ | |||
+ | end; | ||
+ | |||
+ | </code> | ||
+ | ** Utilité de la fonction TMyControl.GetVisibleRect ** | ||
+ | |||
+ | La fonction `TMyControl.GetVisibleRect` permet de déterminer quelle partie d'un contrôle est réellement visible à l'écran, en tenant compte des limitations imposées par ses parents dans la hiérarchie des contrôles. | ||
+ | |||
+ | ** Contexte d'utilisation ** | ||
+ | * **Rendu graphique** : Identifie quelles portions du contrôle doivent être redessinées en fonction de leur visibilité. | ||
+ | * **Détection de clics** : Vérifie si une interaction utilisateur, comme un clic, se produit dans une zone visible du contrôle. | ||
+ | * **Optimisation** : Aide à concentrer les ressources sur la partie visible du contrôle pour améliorer les performances. | ||
+ | |||
+ | ** Autres applications ** | ||
+ | * **Défilement automatique** : Lorsqu'un contrôle est contenu dans un `ScrollBox`, la fonction aide à gérer le défilement en ajustant dynamiquement la partie visible. | ||
+ | * **Animations ou effets visuels** : Pour des effets qui doivent se limiter aux zones visibles, cette fonction garantit que seules les parties pertinentes du contrôle sont affectées. | ||
+ | * **Validation et gestion des collisions** : Dans des applications comme les jeux ou les simulations, elle peut servir à déterminer les parties visibles d'un objet pour des vérifications ou interactions précises. | ||
+ | |||