IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Remplacer le ToolTip d'un Treeview par un Hint


Sujet :

Composants VCL Delphi

  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut Remplacer le ToolTip d'un Treeview par un Hint
    Bonjour,

    Je suis sous Delphi 7 Pro et je cherche à remplacer le ToolTip d'un Treeview par hint personnalisé.
    Je précise également que j'aimerai éviter l'utilisation de bibliothèque externe.

    Sur le message WM_NOTIFY j'ai tenté de provoquer l'affichage du hint.
    J'ai également intercepté le CM_HINTSHOW pour vérifier s'il y passait bien.

    Les deux uniques méthode de mon treeview dérivé du CustomTreeView :
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    procedure TTreeViewEx.WMNotify(var Message: TWMNotify);
    var P : TPoint;
        HintInfo : THintInfo;
    begin
      if not(Message.NMHdr.code = TTN_SHOW) then  inherited
      else
      begin
        GetCursorPos(P);
        HintInfo.HintPos := P;
        HintInfo.CursorPos := ScreenToClient(P);
        HintInfo.HintMaxWidth := Screen.Width;
        HintInfo.HintStr := 'Test';
        HintInfo.ReshowTimeout := 0;
        HintInfo.HideTimeout := Application.HintHidePause;
        HintInfo.HintWindowClass := HintWindowClass;
        HintInfo.HintColor := clWhite;
        HintInfo.CursorRect := BoundsRect;
        HintInfo.HintData := nil;
     
        Perform(CM_HINTSHOW, 0, LongInt(@HintInfo));
      end;
     
    procedure TTreeViewEx.CMHintShow(var msg: TCMHintShow);
    begin
      inherited;
    end;


    J'avoue ne pas être tout à fait à l'aise avec les messages mais je pensais que cela suffirai.
    Lorsque je passe dans CMHintShow la valeur de msg.HintInfo.HintWindowClass correspond d'ailleurs bien à mon hint personnalisé.
    Mais ce n'est pas mon hint personnalisé qui s'affiche.

    Edit : j'ai bien remplacé le HintWindowClass au démarrage et mon hint s'affiche très bien sur les autres composants que j'utilise

    Où est-ce que j'ai fait une boulette ?

    Merci.

  2. #2
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Le inherited; appelle le code standard d'affichage de TCustomTreeview, je pense que ça vient de là

    à la place je mettrais le code que tu as mis pour le WMNotify (et pas de inherited)
    Bidouilleuse Delphi

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Le code dans WMNotify est justement là pour forcer l'affichage du Hint.
    Si je ne le mets pas, le message CM_HINTSHOW n'est jamais déclenché.

    D'après ce que j'ai lu sur le sujet et que j'ai également pu constater :
    - le message CM_HINTSHOW est déclenché lors de l'affichage du hint
    - le message WM_NOTIFY est déclenché avec TTN_SHOW dans le code du NMHdr lors de l'affichage du tooltip.

  4. #4
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Non mais il est bien le WMNotify, c'est pas lui le souci !

    C'est ça le soucis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TTreeViewEx.CMHintShow(var msg: TCMHintShow);
    begin
      inherited;
    end;
    Le inherited appelle le code d'affichage du Tooltip que toi tu t'es efforcé de personnaliser par WMNotify, mais avec les paramètres de la VCL, sauce Delphi, que justement tu veux pas et que ça s'affiche quand même

    TU me suis ? dis oui, s'il te plaît
    Bidouilleuse Delphi

  5. #5
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TMyHintData = record
        FontSize: Integer;
      end;
     
      TMyHintWindow = class(THintWindow)
      public
        function CalcHintRect(MaxWidth: Integer; const AHint: string; AData: TCustomData): TRect; override;
      end;
     
      TMyButton = class(TButton)
      private
        procedure CMHintShow(var AMessage: TCMHintShow); message CM_HINTSHOW;
      public
        FMyHintData: TMyHintData;
        constructor Create(AOwner: TComponent); override;
      end;
     
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        MyButton: TMyButton;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     TMyButton(Sender).FMyHintData.FontSize:=44;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     MyButton:=TMyButton.Create(Form1);
     MyButton.Parent:=Form1;
     MyButton.Caption:='Test';
     MyButton.Left:=100;
     MyButton.Top:=100;
     MyButton.ShowHint:=true;
     MyButton.OnClick:=Button1Click;
    end;
     
    function TMyHintWindow.CalcHintRect(MaxWidth: Integer; const AHint: string; AData: TCustomData): TRect;
    begin
     Canvas.Font.Size:=TMyHintData(AData^).FontSize;
     Result:=inherited;
    end;
     
    constructor TMyButton.Create(AOwner: TComponent);
    begin
     inherited;
     FMyHintData.FontSize:=25;
    end;
     
    procedure TMyButton.CMHintShow(var AMessage: TCMHintShow);
    begin
     inherited;
     AMessage.HintInfo.HintData:=@FMyHintData;
     AMessage.HintInfo.HintWindowClass:=TMyHintWindow;
     AMessage.HintInfo.HintStr:='My custom hint';
    end;
     
    end.
    (Et là ça fonctionne sans WMNotify en plus ...
    Bidouilleuse Delphi

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Je crois qu'on ne se comprend pas.

    Mes Treeview n'ont pas de Hint.
    Mon problème se situe au niveau du Tooltip.

    Sur l'image attachée, j'ai volontairement activé le hint pour montrer la différence entre un hint et un tooltip.
    A gauche, le résultat avec ton hint, à droite, le résultat avec le mien.
    Le tooltip apparaît sous la pointe du curseur pour afficher en entier le texte qu'on ne voit pas.
    Le hint apparaît décalé vers le bas par rapport à la souris.
    Nom : Probleme.png
Affichages : 570
Taille : 8,5 Ko

    Je n'ai aucun hint qui apparaît si ShowHint est à false.
    Si je remets le WMNotify j'ai le vieux hint qui apparaît (y compris avec tes transformations de le CMHintShow)
    Ou alors c'est le juste que le tooltip s'est décalé mais je ne sais pas comment en être sûr.

    Mon but est de remplacer ce tooltip pour faire apparaître un hint à la place.
    Ou au pire faire en sorte que ce tooltip apparaisse sous la même forme que mon hint.

Discussions similaires

  1. Remplacer un treeview par un autre treeview
    Par mathias dans le forum IHM
    Réponses: 7
    Dernier message: 10/04/2007, 14h26
  2. [VB.NET] Selectionner un noeud du treeview par le code
    Par Elbarto dans le forum Windows Forms
    Réponses: 7
    Dernier message: 23/02/2006, 10h49
  3. [C#] Remplacer les boutons d'un DataGrid par une image
    Par PascalL dans le forum Windows Forms
    Réponses: 17
    Dernier message: 04/04/2005, 16h07
  4. Remplacer le contenu d'un div par un autre
    Par prgasp77 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 24/10/2004, 23h48
  5. remplacer des espaces dans un champ par des zero
    Par yeep dans le forum Access
    Réponses: 4
    Dernier message: 08/10/2004, 09h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo