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 :

Anomalie d'affichage d'une infobulle


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 Anomalie d'affichage d'une infobulle
    Bonjour,

    Je suis sur Delphi 7 et j'essaie de créer une infobulle personnalisée en forme de bulle "carrée"
    Je souhaite éviter d'utiliser la JVCL.

    Je suis parti de l'exemple de nono car il correspondait à peu près au rendu que je souhaite obtenir.
    http://nono40.developpez.com/sources/source0028/

    Par rapport au code de nono, j'ai uniquement modifié le constructeur et la méthode paint pour mes besoins.
    Voici ce que j'ai modifié :
    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
    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
    Constructor TMonHint.Create(AOwner: TComponent);
    Begin
      Inherited Create(AOwner);
      // Create n'est surchargé que pour initialiser les variables
      // popo => Modification de la fonte (famille, taille et couleur)
      with Canvas.Font do
      begin
        Name  := 'Arial';
        Size  := 10;
        Color := RGB(95,120,144);
      end;
      FCreerRegion := False;
    End;
     
    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);
        Rgn2 :=CreateRectRgn(Rect.Left,Rect.Top+20,Rect.Right,Rect.Bottom); // popo => Pas de bord arrondi
        // 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 Nom : hint.png
    Affichages : 380
    Taille : 5,3 Kodession 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);
      // popo => fond blanc
      Canvas.Brush.Color:=clWhite;
      FillRgn(Canvas.Handle,rgn1,Canvas.Brush.Handle);
      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;
      Canvas.Brush.Color:=clWhite; // popo => Texte écrit sur fond blanc
      // Et dessin effectif du texte
      DrawText(Canvas.Handle, PChar(Caption), -1, Rect , DT_CENTER or DT_NOPREFIX or DT_WORDBREAK);
    End;

    Mon problème est que avant d'afficher l'infobulle j'ai une partie de l'ancienne infobulle qui apparaît.
    Ceci est une reconstitution car c'est rapide et je n'ai pas le temps de faire l'impression écran.
    Nom : hint.png
Affichages : 380
Taille : 5,3 Ko

    Est-ce qu'il y a un moyen d'éviter cet effet ?
    Merci.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Pourtant tu as utilisé THintWindowClass pour que ton Hint remplace TOUT Hint de l'application comme dans l'exemple de Nono ?!

    Tu es sur que c'est l'ancien Hint et non un défaut de région/transparence de ton THintWindow ?
    EDIT : On voit l'ombre de ta fenêtre donc semble que cela soit autre chose qui s'affiche comme si le HintWindowClass avait ajouté ta classe mais pas remplacé celle par défaut !?

    Il y a presque 10 ans, j'avais refait complètement le système de Hint pour qu'il affiche de Hint (HTML + Bouton) même sur des contrôles Disabled !
    Car par défaut, un composant Disabled n'affiche plus de Hint hors c'était indispensable pour ce projet (le Hint permettait de passer l'élément en Enabled par exemple)


    Sinon une simple TForm avec une couleur de fond et en jouant sur la transparence et même pas besoin de région pour obtenir ce résultat :
    Forme qui prend l'apparence d'une image
    Comment créer une TForm fille transparente
    Une version en C++ pour une info bulle avec des liens pour télécharger des programmes (Un Hint spécial uniquement pour quelques controles sur une fenêtre sans remplacer tous les HINT )
    Code c++ : 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
     
    //---------------------------------------------------------------------------
     
    #ifndef SliteDVRDahuaTechnology_DAVFileFormatNoticeH
    #define SliteDVRDahuaTechnology_DAVFileFormatNoticeH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include <Vcl.Menus.hpp>
    //---------------------------------------------------------------------------
    #include "SliteForm.h"
    //---------------------------------------------------------------------------
     
     
    //---------------------------------------------------------------------------
    //             TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm             -
    //---------------------------------------------------------------------------
    class TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm : public TFormBase
    {
    __published:	// Composants gérés par l'EDI
      TLabel *LabelUseDAVNotice;
      TLabel *LabelUseAVINotice;
      TLabel *LabelURLDownloadDAVPlayer;
      TLabel *LabelURLDownloadAVIPlayer;
      TTimer *HideDelay;
      TTimer *ShowDelay;
      TLabel *LabelDahuaDownloadPage;
      TPopupMenu *PopupMenu;
      void __fastcall LabelURLDownloadAllPlayerMouseEnter(TObject *Sender);
      void __fastcall LabelURLDownloadAllPlayerMouseLeave(TObject *Sender);
      void __fastcall LabelURLDownloadPlayerClick(TObject *Sender);
      void __fastcall HideDelayTimer(TObject *Sender);
      void __fastcall AllMouseEnter(TObject *Sender);
      void __fastcall FormMouseEnter(TObject *Sender);
      void __fastcall FormMouseLeave(TObject *Sender);
      void __fastcall FormPaint(TObject *Sender);
      void __fastcall ShowDelayTimer(TObject *Sender);
      void __fastcall PopupMenuPopup(TObject *Sender);
     
    private:	// Déclarations utilisateur
      // Membres Privés
      TControl *FAdvisedControl;
      char FPathIni[MAX_PATH+1];
      bool AllowTransparent;
     
      // Méthodes Privées
      char* GetPathIni();
      AnsiString LitChaineIni(const AnsiString AKeyName);
     
    public:		// Déclarations utilisateur
      // Constructeurs Publiques
      /*constructor*/__fastcall TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm(TComponent* AOwner);
     
      // Méthodes Publiques
      void ShowNotice(TControl *AAdvisedControl);
      void HideNotice();
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm *SliteDVRDahuaTechnology_DAVFileFormatNoticeForm;
    //---------------------------------------------------------------------------
    #endif

    Code c++ : 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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    //---------------------------------------------------------------------------
    #pragma hdrstop
    //---------------------------------------------------------------------------
    #include "SliteDVRDahuaTechnology_DAVFileFormatNotice.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    //---------------------------------------------------------------------------
     
    //---------------------------------------------------------------------------
    //             TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm             -
    //---------------------------------------------------------------------------
    /*constructor*/__fastcall TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm::TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm(TComponent* AOwner)
      : TFormBase(AOwner, GetPathIni(), Slite_FORM_AUTONAMED_SECTION, false, NULL, false, false)
    {
      BorderStyle = bsNone; // Force ces valeurs car TFormBase peut les altérer !
     
      AllowTransparent = CheckWin32Version(5, 0);  // Win2000 ou plus requis ! sinon ...
      if ( ! AllowTransparent)
        TransparentColor = false;
     
      LabelUseDAVNotice->Caption = StringReplace(LabelUseDAVNotice->Caption, "\\n", sLineBreak, TReplaceFlags() << rfReplaceAll);
      LabelUseAVINotice->Caption = StringReplace(LabelUseAVINotice->Caption, "\\n", sLineBreak, TReplaceFlags() << rfReplaceAll);
    }
     
    //---------------------------------------------------------------------------
    void TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm::ShowNotice(TControl *AAdvisedControl)
    {
      HideDelay->Enabled = false;
      if (FAdvisedControl != AAdvisedControl)
        Hide();
     
      FAdvisedControl = AAdvisedControl;
      ShowDelay->Enabled = true;
    }
     
    //---------------------------------------------------------------------------
    void TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm::HideNotice()
    {
      ShowDelay->Enabled = false;
      HideDelay->Enabled = true;
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm::FormPaint(TObject *Sender)
    {
      if (AllowTransparent) // Win2000 ou plus requis ! sinon ...
      {
        const TPoint TrianglePoints[3] = {TPoint(40,10), TPoint(50, 0), TPoint(60, 10)};
     
        this->Canvas->Brush->Color = clInfoBk;
        this->Canvas->Pen->Color   = clBlack;
     
        // Rectangle arrondi
        this->Canvas->RoundRect(0, TrianglePoints[0].Y, ClientWidth - 1, ClientHeight - 1, 30, 30);
     
        // Flèche
        this->Canvas->Polygon(TrianglePoints, 2);
     
        // Efface le trait entre triangle et rectangle
        this->Canvas->Pen->Color = clInfoBk;
        this->Canvas->MoveTo(TrianglePoints[0].X +1, TrianglePoints[0].Y);
        this->Canvas->LineTo(TrianglePoints[2].X, TrianglePoints[2].Y);
      }
      else
      {
        // Rectangle
        this->Canvas->Rectangle(0, 0, ClientWidth - 1, ClientHeight - 1);
      }
    }
     
     
    //---------------------------------------------------------------------------
    void __fastcall TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm::ShowDelayTimer(TObject *Sender)
    {
      ShowDelay->Enabled = false;
      if ( ! Visible)
      {
        HWND ActiveWnd = GetForegroundWindow();
     
        TPoint PS = FAdvisedControl->Parent->ClientToScreen(Point(FAdvisedControl->Left, FAdvisedControl->Top));
        TPoint NPS = PS;
        NPS.y += FAdvisedControl->Height;
     
        if (NPS.x + Width <= Screen->WorkAreaWidth)
          Left = NPS.x;
        else
          Left = NPS.x - Width;
     
        if (NPS.y + Height <= Screen->WorkAreaHeight)
          Top = NPS.y;
        else
          Top = PS.y - Height;
     
        Show();
        SetForegroundWindow(ActiveWnd);
        SetWindowPos(this->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
      }
    }
     
     
    //---------------------------------------------------------------------------
    void __fastcall TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm::HideDelayTimer(TObject *Sender)
    {
      HideDelay->Enabled = false;
      Hide();
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm::AllMouseEnter(TObject *Sender)
    {
      HideDelay->Enabled = false;
      HideDelay->Interval = 200;
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm::FormMouseEnter(TObject *Sender)
    {
      HideDelay->Enabled = false;
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm::FormMouseLeave(TObject *Sender)
    {
      HideDelay->Enabled = true;
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm::LabelURLDownloadAllPlayerMouseEnter(TObject *Sender)
    {
      if (Sender->InheritsFrom(__classid(TLabel)))
        ((TLabel*)Sender)->Font->Color = clRed;
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm::LabelURLDownloadAllPlayerMouseLeave(TObject *Sender)
    {
      if (Sender->InheritsFrom(__classid(TLabel)))
        ((TLabel*)Sender)->Font->Color = clHotLight;
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm::LabelURLDownloadPlayerClick(TObject *Sender)
    {
      AnsiString HTTPURL;
     
      // Gère les TLabel pour DAV et AVI player
      if (Sender->InheritsFrom(__classid(TLabel)))
      {
        HTTPURL = LitChaineIni(AnsiString(((TLabel*)Sender)->Name + ".URL").c_str());
      }
      else
      {
        // Gère les TMenuItem pour General DAV et Smart DAV player
        if (Sender->InheritsFrom(__classid(TMenuItem)))
          HTTPURL = ((TMenuItem*)Sender)->Hint;
      }
     
      if ( ! HTTPURL.IsEmpty())
        ShellExecute(NULL, "Open" , HTTPURL.c_str(), NULL, NULL, SW_SHOWDEFAULT);
    }
     
    //---------------------------------------------------------------------------
    void __fastcall TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm::PopupMenuPopup(TObject *Sender)
    {
      TPopupMenu* lMenu = dynamic_cast<TPopupMenu*>(Sender);
      if (lMenu)
      {
        if (lMenu->PopupComponent == LabelURLDownloadDAVPlayer)
        {
          lMenu->Items->Clear();
     
          TMenuItem* lSubMenu = new TMenuItem(lMenu);
          lSubMenu->Caption = LitChaineIni("LabelURLDownloadDAVPlayer.URLName");
          lSubMenu->Hint = LitChaineIni("LabelURLDownloadDAVPlayer.URL");
          lSubMenu->OnClick = LabelURLDownloadPlayerClick;
          lMenu->Items->Add(lSubMenu);
     
          lSubMenu = new TMenuItem(lMenu);
          lSubMenu->Caption = LitChaineIni("LabelURLDownloadDAVPlayer.Adv.URLName");
          lSubMenu->Hint = LitChaineIni("LabelURLDownloadDAVPlayer.Adv.URL");
          lSubMenu->OnClick = LabelURLDownloadPlayerClick;
          lMenu->Items->Add(lSubMenu);
        }
      }
    }
     
     
    //---------------------------------------------------------------------------
    #include "SliteDVRDahuaTechnologyProviderClasses.h"
    //---------------------------------------------------------------------------
    char* TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm::GetPathIni()
    {
      AnsiString Path = TSliteHardwareDVRDahuaTechnologyProvider::GetProvider()->GlobalIniFile->FileName;
      return StrPCopy(FPathIni, Path);
    }
     
    //---------------------------------------------------------------------------
    AnsiString TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm::LitChaineIni(const AnsiString AKeyName)
    {
      return AnsiString(pc_ptrUtil->LitChaineIni(AKeyName.c_str(), pc_szNomRubrique.c_str()));
    }
     
     
    //---------------------------------------------------------------------------

    Code dfm : 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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    object SliteDVRDahuaTechnology_DAVFileFormatNoticeForm: TSliteDVRDahuaTechnology_DAVFileFormatNoticeForm
      Left = 325
      Top = 84
      AutoSize = True
      BorderStyle = bsNone
      Caption = 'SliteDVRDahuaTechnology_DAVFileFormatNoticeForm'
      ClientHeight = 196
      ClientWidth = 477
      Color = clFuchsia
      TransparentColor = True
      TransparentColorValue = clFuchsia
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      FormStyle = fsStayOnTop
      Padding.Left = 15
      Padding.Top = 15
      Padding.Right = 15
      Padding.Bottom = 15
      OldCreateOrder = False
      OnMouseEnter = FormMouseEnter
      OnMouseLeave = FormMouseLeave
      OnPaint = FormPaint
      PixelsPerInch = 96
      TextHeight = 13
      object LabelUseDAVNotice: TLabel
        Left = 15
        Top = 15
        Width = 447
        Height = 42
        Align = alTop
        Alignment = taCenter
        AutoSize = False
        Caption = 'LabelUseDAVNotice'
        Color = clInfoBk
        ParentColor = False
        Transparent = False
        WordWrap = True
        OnMouseEnter = AllMouseEnter
        ExplicitLeft = 17
        ExplicitTop = 8
        ExplicitWidth = 444
      end
      object LabelUseAVINotice: TLabel
        Left = 15
        Top = 57
        Width = 447
        Height = 85
        Align = alTop
        Alignment = taCenter
        AutoSize = False
        Caption = 'LabelUseAVINotice'
        Color = clInfoBk
        ParentColor = False
        Transparent = False
        WordWrap = True
        OnMouseEnter = AllMouseEnter
      end
      object LabelURLDownloadDAVPlayer: TLabel
        Left = 15
        Top = 155
        Width = 447
        Height = 13
        Cursor = crHandPoint
        Align = alTop
        Caption = 'LabelURLDownloadDAVPlayer'
        Color = clInfoBk
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clHotLight
        Font.Height = -11
        Font.Name = 'Tahoma'
        Font.Style = [fsUnderline]
        ParentColor = False
        ParentFont = False
        PopupMenu = PopupMenu
        Transparent = False
        OnClick = LabelURLDownloadPlayerClick
        OnMouseEnter = AllMouseEnter
        ExplicitWidth = 141
      end
      object LabelURLDownloadAVIPlayer: TLabel
        Left = 15
        Top = 168
        Width = 447
        Height = 13
        Cursor = crHandPoint
        Align = alTop
        Caption = 'LabelURLDownloadAVIPlayer'
        Color = clInfoBk
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clHotLight
        Font.Height = -11
        Font.Name = 'Tahoma'
        Font.Style = [fsUnderline]
        ParentColor = False
        ParentFont = False
        Transparent = False
        OnClick = LabelURLDownloadPlayerClick
        OnMouseEnter = AllMouseEnter
        ExplicitWidth = 138
      end
      object LabelDahuaDownloadPage: TLabel
        Left = 15
        Top = 142
        Width = 447
        Height = 13
        Cursor = crHandPoint
        Align = alTop
        Caption = 'LabelDahuaDownloadPage'
        Color = clInfoBk
        Font.Charset = DEFAULT_CHARSET
        Font.Color = clHotLight
        Font.Height = -11
        Font.Name = 'Tahoma'
        Font.Style = [fsUnderline]
        ParentColor = False
        ParentFont = False
        Transparent = False
        OnClick = LabelURLDownloadPlayerClick
        OnMouseEnter = AllMouseEnter
        ExplicitWidth = 127
      end
      object HideDelay: TTimer
        Enabled = False
        Interval = 2000
        OnTimer = HideDelayTimer
        Left = 200
        Top = 98
      end
      object ShowDelay: TTimer
        Enabled = False
        Interval = 500
        OnTimer = ShowDelayTimer
        Left = 258
        Top = 98
      end
      object PopupMenu: TPopupMenu
        OnPopup = PopupMenuPopup
        Left = 148
        Top = 97
      end
    end
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  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
    J'ai trouvé !
    Comme la partie jaune s'affichait autour de la bulle j'ai pensé que c'était peut être l'affichage de la zone non client.
    J'ai commencé par intercepter le message WM_NCPAINT pour l'empêcher mais ça n'a pas été concluant.

    Au final j'ai regardé dans la pile d'appel pour voir ce qui déclenchait le message WM_NCPAINT.
    Il s'est avéré que c'est le message WM_PRINT qui le fait.

    J'ai donc intercepté ce message pour dessiner uniquement ce qui m'intéresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TMyHint.WMPrint(var Message: TMessage);
    begin
      Paint;
    end;

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Dans ce cas, mets BorderStyle à bsNone.

  5. #5
    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
    Il n'y a pas de propriété BorderStyle dans un THintWindow ni dans aucun de ses ancêtres.

    Par contre j'étais persuadé que le cadre de l'infobulle par défaut était dû au fait que son style est déclaré en WS_POPUP or WS_BORDER.
    Le code de nono a également l'air d'aller dans ce sens.
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    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;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Temps d'affichage d'une infobulle
    Par deruyter dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/05/2007, 23h58
  2. affichage avec une infobulle
    Par snetechen dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 09/02/2007, 14h38
  3. [ToolTip] temps d'affichage d'une infobulle
    Par RR instinct dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 10/10/2006, 10h48
  4. [CSS] Problème lors de l'affichage d'une infobulle
    Par nais_ dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 14/09/2006, 09h59
  5. [VB.Net 2.0/NotifyIcon] Pb de durée d'affichage d'une infobulle
    Par exclusif dans le forum Windows Forms
    Réponses: 10
    Dernier message: 19/08/2006, 22h41

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