Developpez.com - Delphi
X

Choisissez d'abord la catégorieensuite la rubrique :

Nono40.developpez.com
Le petit coin du web de Nono40
SOURCES TESTS DELPHI WIN32 AUTOMATISMES DELPHI .NET QUICK-REPORT
Retour à l'accueil
28 - BULLES D'AIDE ( HINT ) PERSONNALISÉES

PRÉSENTATION : Création de bulles d'aide personnalisées en utilisant des régions pour définir un dessin complexe.
ZIP : Téléchargez le zip APERÇUS : -1.jpg-

NOTES : C'est un exemple de création de bulle d'aide ( Hint ) perssonalisée. Afin d'obtenir des bulles d'aide non rectangulaire, il faut utiliser les régions. Ce source est donc aussi un exemple d'utilisation des régions de windows et de leur affectation à une fenêtre afin d'en limiter sa surface d'affichage.

CODE :
Unit Unit1;

Interface

Uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

Type
  TForm1 = Class(TForm)
    Button1: TButton;
    Label1: TLabel;
  Private
    { Déclarations privées }
  Public
    { Déclarations publiques }
  End;

Var
  Form1: TForm1;

Implementation

{$R *.dfm}

// Pour créer un bulle d'aide personnalisée, il faut créer une
// classe descendante de THintWindow et l'affecter à la variable
// globale HintWindowClass.
Type TMonHint = Class( THintWindow )
       Private
       Protected
         // Variable mise à TRUE à chaque affichage de la bulle
         // pour recréer la région adaptée à la taille du texte
         FCreerRegion  : Boolean;
         // Principalement Paint doit être surchargé pour pouvoir modifier le dessin de la bulle
         Procedure Paint;override;
         // La surcharge de CreateParams permet de modifier les propriété de la
         // fenêtre Windows encapsulée par le THintWindow
         // Ce n'est pas obligatoire, tout dépend du dessin souhaité
         Procedure CreateParams(Var Params: TCreateParams);Override;
       Public
         // Create est surchargé juste pour initialiser les variables
         Constructor Create(AOwner: TComponent); override;
         // ActiveHintData est appelée à chaque nouvel affichage de bulle d'aide.
         // Le fait de la surchargée permet d'être averti d'un nouveau texte
         Procedure ActivateHintData(Rect: TRect; Const AHint: String; AData: Pointer); override;
         // Si la taille par défaut de la bulle doit être modifiée
         // il faut surcharger CalcHintRect. Car cette méthode est appelée avant l'affichage de
         // la bulle pour en déterminer la taille.
         Function CalcHintRect(MaxWidth: Integer; Const AHint: String; AData: Pointer): TRect; override;
     End;

Constructor TMonHint.Create(AOwner: TComponent);
Begin
  Inherited Create(AOwner);
  // Create n'est surchargé que pour initialiser les variables
  FCreerRegion := False;
End;

Procedure TMonHint.CreateParams(Var Params: TCreateParams);
Begin
  Inherited CreateParams(Params);
  // CreateParams est surcharge pour modifier les paramètre Windows de la bulle.
  // Par défaut le stype est WS_POPUP OR WS_BORDER
  // La fenêtre n'étant pas carrée, il est inutile de dessiner le bord
  Params.Style := WS_POPUP;
End;

// Cette méthode est appelée à chaque nouvelle bulle d'aide
// On ne fait que signaler que la région de la fenêtre doit être changée
Procedure TMonHint.ActivateHintData(Rect: TRect; Const AHint: String; AData: Pointer);
Begin
  Inherited;
  FCreerRegion:=True;
End;

// Cette méthode calcul la taille de la bulle en fonction du texte
Function TMonHint.CalcHintRect(MaxWidth: Integer; Const AHint: String; AData: Pointer): TRect;
Begin
  // La taille est largeur est limitée à 200 pixels
  // C'est plus joli pour les textes longs
  MaxWidth:=200;

  // La valeur par défaut est mofiée afin de d'avoir la place de dessiner
  // les contours et la flêche suppérieure.
  Result:=Inherited CalcHintRect(MaxWidth,AHint,AData);
  Inc(Result.Right ,10);
  Inc(Result.Bottom,30);
End;

// Paint est la méthode de dessin de la bulle
Procedure TMonHint.Paint;
Const Points:Array[1..3]Of TPoint=(( x:18 ; y:20 ),( x:23 ; y:0 ),( x:33;y:20 ));
Var Rect : TRect;
    Rgn1 : HRgn;
    Rgn2 : HRgn;
Begin
  // ClientRect à été déterminé par la méthode CalcHintRect.
  // On se sert alors de la zone Client pour calculer la région
  Rect := ClientRect;

  // FCreerRegion est mis à true à chaque apparition de la bulle d'aide.
  // Donc s'il est à True il faut recalculer la région de la fenêtre en
  // fonction du nouveau texte
  If FCreerRegion Then
  Begin
    // Création d'une région rectangulaire avec les coins arrondis.
    Rgn2 :=CreateRoundRectRgn(Rect.Left,Rect.Top+20,Rect.Right,Rect.Bottom,30,30);
    // Création d'une région sous forme de triangle placé au dessus de la région
    // précédente
    Rgn1 :=CreatePolygonRgn  (Points,3,ALTERNATE);
    // Les deux régions sont ajoutées afin de créer la forme finale de la bulle
    CombineRgn(Rgn2,Rgn2,Rgn1,RGN_OR);
    // Rgn1 n'est plus utile...
    DeleteObject(Rgn1);
    // La forme de la bulle ( région ) est appliqué afin que la fenêtre Windows
    // en prenne la forme.
    SetWindowRgn(Handle,Rgn2,True );
    // Ceci n'est effectué qu'une fois pour chaque appartion de la bulle
    // Car la fenêtre Windows conserve sa région jusqu'a la destruction
    // ou l'association d'une autre région
    FCreerRegion:=False;
  End;

  // Pour effectuer le dession lui-même, on récupère la région de base
  // Rgn1 est créé avec une région "bidon" car il faut seulement qu'elle existe
  // avant l'appel de GetWindowRgn
  rgn1:=CreateRectRgn(0,0,10,10);
  GetWindowRgn(Handle,rgn1);

  // FrameRgn() est une fonction qui dessine un contour autour de la région
  // même si celle-ci est d'une forme complexe.
  Canvas.Brush.Color:=$606060;
  FrameRgn(Canvas.Handle,rgn1,Canvas.Brush.Handle,2,2);
  Canvas.Brush.Color:=$A0A0A0;
  FrameRgn(Canvas.Handle,rgn1,Canvas.Brush.Handle,1,1);
  DeleteObject(rgn1);

  // Il re reste qu'a dessiner le texte au centre de la partie basse de la bulle
  InflateRect(Rect,-5,-5);
  Inc(Rect.Top,22);
  // La couleur du fond est la couleur par défaut
  Canvas.Brush.Color:=Application.HintColor;
  // Et dessin effectif du texte
  DrawText(Canvas.Handle, PChar(Caption), -1, Rect , DT_CENTER Or DT_NOPREFIX Or DT_WORDBREAK);
End;

Initialization
  // Il faut bien sur définir notre nouvelle bulle d'aide comme étant
  // classe utilisée par défaut.
  HintWindowClass:=TMonHint;
End.

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2003 Bruno Guérangé. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -