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 :

Treeview et CustomDrawItem: probleme d'affichage avec la scrollbar horizontale


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Par défaut Treeview et CustomDrawItem: probleme d'affichage avec la scrollbar horizontale
    bonjour,

    J'ai cherché partout sur internet et je ne trouve pas ma réponse.

    Le problème est très simple.
    J'utilise l'évènement OnCustomDrawItem pour dessiner le texte dans la treeview.
    Lorsque je diminue la largeur de la fenêtre une scroll bar horizontale apparait en bas.

    Le problème est que lorsque je clique sur la scroll bar l'affichage est completement illisible, la Treeview n'est que partiellement redessinée.

    Avant le scroll:
    Nom : treeview2.jpg
Affichages : 1580
Taille : 14,5 Ko

    Apres le scroll:
    Nom : treeview1.jpg
Affichages : 1452
Taille : 13,7 Ko

    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
     
    procedure TForm1.TVCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
    var
      NodeRect: TRect;
    begin
      with TV.Canvas do
      begin
        DefaultDraw := False;
     
        NodeRect := Node.DisplayRect(False);
     
        Brush.Style := bsSolid;
        Brush.Color := clmoneygreen;
        FillRect(NodeRect);
     
        TextOut(NodeRect.Left+TV.indent, NodeRect.Top, Node.Text);
      end;
    end;
    Merci pour votre aide.
    Franck

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    Par défaut
    Je viens de vérifier, c'est le comportement standard du TTreeView
    C'est un peu comme si l'on plaçait le TTreeView dans une TScrollBox, cela déplace l'ensemble de l'objet, ce n'est pas le texte qui défile mais tout le contrôle

    Faudrait sinon retirer avec ShowScrollBar la barre de défilement horizontal
    (Faudra peut-être lutter avec un TTimer pour la cacher en boucle, avec le TDBGrid, c'était pénible, ça revenait toujours)

    Puis ajoute une TScrollBar
    tu gères cette TScrollBar pour décaler ton dessin SANS décaler le TreeView lui même
    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é
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    C'est bizarre: pourquoi le déplacement vertical fonctionne sans problème mais pas le déplacement horizontal?

    Regarde dans les options [il y a 3 ensembles] pour vérifier qu'il n'y en a pas au moins 1 que tu as loupé.

    Sinon, essaie de surcharger l'événement OnScroll [ou un autre à voire]: peut-être en y mettant un Refresh et voir si le DrawItem est appelé avec un rectangle qui ne commence pas à zéro pour la propriété Left (<- prépare toi à faire des clippings )

  4. #4
    Membre expérimenté Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Par défaut
    N'y aurait-il pas un moyen de capturer les évenements de la scroll bar ?
    Auquel cas je ferais un invalidate à chaque evenement.

    Il y aurait la solution de créer une classe dérivée de TTreeView mais je voudrais conserver la possibilité de modifier les propriétés dans l'IDE donc je rejete cette option.

    Il a peut être une solution en détournant la fonction WindowProc de Ttreeview mais je ne sais pas comment faire, à chaque fois je me retrouve avec des erreurs stack overflow.

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    Par défaut
    J'ai testé ton code
    Je n'avais pas compris que même avant le scroll tu perdais toute l'arborescence

    Pour le scroll, on ne voit plus le petit nœud, c'est le comportement par défaut, je suis en train de traduire un code C++ Builder : Treeview avec des colonnes
    Je vais comparer mon code et le lien

    Je vais aussi inclure une TScrollBar pour gérer le défilement du texte sans défiler les nœuds
    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

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    Par défaut
    J'ai utilisé OnAdvancedCustomDrawItem, sur le Stage cdPostPaint, cela permet d'écraser le dessin d'origine par le tient

    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
    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
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
     
    unit ZooThomVCL_ControlExperiment;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.ExtCtrls, Vcl.StdCtrls,
      System.Generics.Collections;
     
    type
      TZooThomVCLControlExperimentForm = class(TForm)
        pgcControls: TPageControl;
        tsTreeView: TTabSheet;
        pgcTreeView: TPageControl;
        tsTreeViewTextScrolling: TTabSheet;
        pnlNormalScrollingTreeView: TPanel;
        tvNormalScrolling: TTreeView;
        pnlTextScrollingTreeView: TPanel;
        tvTextScrolling: TTreeView;
        ScrollBarTextScrollingTreeView: TScrollBar;
        chkCustomDrawTextScrollingTreeView: TCheckBox;
        pnlColumnTreeView: TPanel;
        tvColumn: TTreeView;
        chkCustomDrawColumnTreeView: TCheckBox;
        pnlColumnTreeViewButtons: TPanel;
        btnBtnTreeViewColumnAdd: TButton;
        btnBtnTreeViewColumnDelete: TButton;
        btnBtnTreeViewColumnNodeAdd: TButton;
        chkCustomDrawTextScrollingTreeViewSpecial: TCheckBox;
        procedure tvNormalScrollingDblClick(Sender: TObject);
        procedure tvTextScrollingDblClick(Sender: TObject);
        procedure tvTextScrollingChange(Sender: TObject; Node: TTreeNode);
        procedure tvTextScrollingCollapsed(Sender: TObject; Node: TTreeNode);
        procedure tvTextScrollingExpanded(Sender: TObject; Node: TTreeNode);
        procedure pnlTextScrollingTreeViewResize(Sender: TObject);
        procedure chkCustomDrawTextScrollingTreeViewClick(Sender: TObject);
        procedure ScrollBarTextScrollingTreeViewChange(Sender: TObject);
        procedure chkCustomDrawColumnTreeViewClick(Sender: TObject);
        procedure btnBtnTreeViewColumnAddClick(Sender: TObject);
        procedure btnBtnTreeViewColumnDeleteClick(Sender: TObject);
        procedure btnBtnTreeViewColumnNodeAddClick(Sender: TObject);
        procedure tvColumnDblClick(Sender: TObject);
      private
        { Déclarations privées }
        FTreeViewColWidths: System.Generics.Collections.TList<Integer>;
        procedure ShowTreeControls(AControl: TWinControl; Node: TTreeNode);
        procedure tvTextScrollingAdvancedCustomDrawItemEventHandler(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
        procedure tvColumnAdvancedCustomDrawItemEventHandler(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
      public
        { Déclarations publiques }
        constructor Create(AOwner: TComponent); override;
        destructor Destroy(); override;
      end;
     
    implementation
     
    {$R *.dfm}
     
    constructor TZooThomVCLControlExperimentForm.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
     
      FTreeViewColWidths := System.Generics.Collections.TList<Integer>.Create();
    end;
     
    destructor TZooThomVCLControlExperimentForm.Destroy();
    begin
      FreeAndNil(FTreeViewColWidths);
     
      inherited Destroy();
    end;
     
    procedure TZooThomVCLControlExperimentForm.tvColumnAdvancedCustomDrawItemEventHandler(
      Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState;
      Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
    var
      Tree: TTreeView;
      NodeRect: TRect;
      ColIndex: Integer;
    begin
      if (Stage = cdPostPaint) and (Sender is TTreeView) then
      begin
        Tree := TTreeView(Sender);
        NodeRect := Node.DisplayRect(True);
        if NodeRect.Left > 0 then
        begin
          Tree.Canvas.TextOut(NodeRect.Left + 2, NodeRect.Top + 2, Node.Text);
     
          for ColIndex := 0 to FTreeViewColWidths.Count - 1 do
            Tree.Canvas.TextOut(NodeRect.Left + FTreeViewColWidths[ColIndex] + 2, NodeRect.Top + 2, Format('Col N°%d - %d [%s]', [ColIndex, FTreeViewColWidths[ColIndex], Node.Text]));
        end;
      end;
    end;
     
    procedure TZooThomVCLControlExperimentForm.tvColumnDblClick(Sender: TObject);
    begin
      ShowTreeControls(Self, tvColumn.Items.Add(nil, Self.ClassName));
     
      // Change le Panel pour pouvoir jouer sur le redimensionnement de TTreeView
      SetWindowLong(pnlColumnTreeView.Handle, GWL_STYLE,
        GetWindowLong(pnlColumnTreeView.Handle, GWL_STYLE) or WS_SIZEBOX);
     
      pnlColumnTreeView.Width := pnlColumnTreeView.Width - 1; // C'est le seul truc efficace pour que WS_SIZEBOX soit pris en compte, Invalidate, SetWindowPos, rien ne passe à part cette bidouille
    end;
     
    procedure TZooThomVCLControlExperimentForm.tvNormalScrollingDblClick(Sender: TObject);
    begin
      ShowTreeControls(Self, tvNormalScrolling.Items.Add(nil, Self.ClassName));
     
      // Change le Panel pour pouvoir jouer sur le redimensionnement de TTreeView
      SetWindowLong(pnlNormalScrollingTreeView.Handle, GWL_STYLE,
        GetWindowLong(pnlNormalScrollingTreeView.Handle, GWL_STYLE) or WS_SIZEBOX);
     
      pnlNormalScrollingTreeView.Width := pnlNormalScrollingTreeView.Width - 1; // C'est le seul truc efficace pour que WS_SIZEBOX soit pris en compte, Invalidate, SetWindowPos, rien ne passe à part cette bidouille
    end;
     
    procedure TZooThomVCLControlExperimentForm.btnBtnTreeViewColumnAddClick(Sender: TObject);
    var
      Value: string;
      ColWidth: Integer;
    begin
      if InputQuery('Ajout d''une Colonne', 'Largeur ?', Value) then
      begin
        if TryStrToInt(Value, ColWidth) and (ColWidth > 0) then
        begin
          FTreeViewColWidths.Add(ColWidth);
          tvColumn.Invalidate();
        end;
      end;
    end;
     
    procedure TZooThomVCLControlExperimentForm.btnBtnTreeViewColumnDeleteClick(Sender: TObject);
    var
      Value: string;
      ColIndex: Integer;
    begin
      if InputQuery('Suppression d''une Colonne', 'Numéro (indice en base 0)', Value) then
      begin
        if TryStrToInt(Value, ColIndex) and ((0 <= ColIndex) and (ColIndex < FTreeViewColWidths.Count )) then
        begin
          FTreeViewColWidths.Delete(ColIndex);
          tvColumn.Invalidate();
        end;
      end;
    end;
     
    procedure TZooThomVCLControlExperimentForm.btnBtnTreeViewColumnNodeAddClick(Sender: TObject);
    begin
      tvColumn.Items.AddChild(tvColumn.Selected, 'Node N°' + IntToStr(tvColumn.Items.Count)).MakeVisible();
    end;
     
    procedure TZooThomVCLControlExperimentForm.chkCustomDrawColumnTreeViewClick(Sender: TObject);
    begin
      if chkCustomDrawColumnTreeView.Checked then
        tvColumn.OnAdvancedCustomDrawItem := tvColumnAdvancedCustomDrawItemEventHandler
      else
        tvColumn.OnAdvancedCustomDrawItem := nil;
     
      tvColumn.Invalidate();
    end;
     
    procedure TZooThomVCLControlExperimentForm.chkCustomDrawTextScrollingTreeViewClick(Sender: TObject);
    begin
      if chkCustomDrawTextScrollingTreeView.Checked then
        tvTextScrolling.OnAdvancedCustomDrawItem := tvTextScrollingAdvancedCustomDrawItemEventHandler
      else
        tvTextScrolling.OnAdvancedCustomDrawItem := nil;
     
      tvTextScrolling.Invalidate();
    end;
     
    procedure TZooThomVCLControlExperimentForm.pnlTextScrollingTreeViewResize(Sender: TObject);
    begin
      // Pas de OnResize dans le TTreeView, j'utilise celui du panel
      // Cela revient sans cesse !
      if chkCustomDrawTextScrollingTreeViewSpecial.Checked then
        ShowScrollBar(tvTextScrolling.Handle, SB_HORZ, False);
    end;
     
    procedure TZooThomVCLControlExperimentForm.ScrollBarTextScrollingTreeViewChange(Sender: TObject);
    begin
      if Assigned(tvTextScrolling.OnAdvancedCustomDrawItem) then
        tvTextScrolling.Invalidate();
    end;
     
    procedure TZooThomVCLControlExperimentForm.ShowTreeControls(AControl: TWinControl; Node: TTreeNode);
    var
       I: Integer;
       ChildNode: TTreeNode;
    begin
      For I := 0 to AControl.ControlCount - 1 do
      begin
        ChildNode := TTreeView(Node.TreeView).Items.AddChild(Node, Format('%s - Parent Node %d', [AControl.Controls[I].ClassName, Node.AbsoluteIndex]));
        if AControl.Controls[I] is TWinControl then
          ShowTreeControls(AControl.Controls[I] as TWinControl, ChildNode);
      end;
    end;
     
    procedure TZooThomVCLControlExperimentForm.tvTextScrollingChange(Sender: TObject; Node: TTreeNode);
    begin
      // Cela revient sans cesse !
      if chkCustomDrawTextScrollingTreeViewSpecial.Checked then
        ShowScrollBar(tvTextScrolling.Handle, SB_HORZ, False);
    end;
     
    procedure TZooThomVCLControlExperimentForm.tvTextScrollingCollapsed(Sender: TObject; Node: TTreeNode);
    begin
      // Cela revient sans cesse !
      if chkCustomDrawTextScrollingTreeViewSpecial.Checked then
        ShowScrollBar(tvTextScrolling.Handle, SB_HORZ, False);
    end;
     
    procedure TZooThomVCLControlExperimentForm.tvTextScrollingAdvancedCustomDrawItemEventHandler(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; Stage: TCustomDrawStage; var PaintImages, DefaultDraw: Boolean);
    var
      NodeRect: TRect;
    begin
      if (Stage = cdPostPaint) and (Sender is TTreeView) then
      begin
        with TTreeView(Sender), Canvas do
        begin
          NodeRect := Node.DisplayRect(True); // True !!!
     
          Brush.Style := bsSolid;
          Brush.Color := clmoneygreen;
          FillRect(NodeRect);
     
          if chkCustomDrawTextScrollingTreeViewSpecial.Checked then
            TextOut(NodeRect.Left, NodeRect.Top, Copy(Node.Text, ScrollBarTextScrollingTreeView.Position))
          else
            TextOut(NodeRect.Left, NodeRect.Top, Node.Text);
        end;
      end;
    end;
     
    procedure TZooThomVCLControlExperimentForm.tvTextScrollingDblClick(Sender: TObject);
    begin
      ShowTreeControls(Self, tvTextScrolling.Items.Add(nil, Self.ClassName));
      if chkCustomDrawTextScrollingTreeViewSpecial.Checked then
        ShowScrollBar(tvTextScrolling.Handle, SB_HORZ, False);
     
      // Change le Panel pour pouvoir jouer sur le redimensionnement de TTreeView
      SetWindowLong(pnlTextScrollingTreeView.Handle, GWL_STYLE,
        GetWindowLong(pnlTextScrollingTreeView.Handle, GWL_STYLE) or WS_SIZEBOX);
     
      pnlTextScrollingTreeView.Width := pnlTextScrollingTreeView.Width - 1; // C'est le seul truc efficace pour que WS_SIZEBOX soit pris en compte, Invalidate, SetWindowPos, rien ne passe à part cette bidouille
    end;
     
    procedure TZooThomVCLControlExperimentForm.tvTextScrollingExpanded(Sender: TObject; Node: TTreeNode);
    begin
      // Cela revient sans cesse !
      if chkCustomDrawTextScrollingTreeViewSpecial.Checked then
        ShowScrollBar(tvTextScrolling.Handle, SB_HORZ, False);
    end;
     
    end.
    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
    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
    209
    210
    211
    212
     
    object ZooThomVCLControlExperimentForm: TZooThomVCLControlExperimentForm
      Left = 396
      Top = 246
      Caption = 'Exp'#233'rimentations diverses sur les controles VCL'
      ClientHeight = 596
      ClientWidth = 1219
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object pgcControls: TPageControl
        Left = 0
        Top = 0
        Width = 1219
        Height = 596
        ActivePage = tsTreeView
        Align = alClient
        TabOrder = 0
        ExplicitLeft = 129
        ExplicitTop = 136
        ExplicitWidth = 289
        ExplicitHeight = 193
        object tsTreeView: TTabSheet
          Caption = 'tsTreeView'
          ExplicitLeft = 0
          ExplicitTop = 0
          ExplicitWidth = 281
          ExplicitHeight = 165
          object pgcTreeView: TPageControl
            Left = 0
            Top = 0
            Width = 1211
            Height = 568
            ActivePage = tsTreeViewTextScrolling
            Align = alClient
            TabOrder = 0
            ExplicitHeight = 477
            object tsTreeViewTextScrolling: TTabSheet
              Caption = 'tsTreeViewTextScrolling'
              ExplicitLeft = 0
              ExplicitTop = 0
              ExplicitWidth = 281
              ExplicitHeight = 165
              object pnlNormalScrollingTreeView: TPanel
                Left = 3
                Top = 3
                Width = 255
                Height = 296
                ShowCaption = False
                TabOrder = 0
                object tvNormalScrolling: TTreeView
                  AlignWithMargins = True
                  Left = 4
                  Top = 4
                  Width = 247
                  Height = 288
                  Align = alClient
                  Indent = 19
                  TabOrder = 0
                  OnDblClick = tvNormalScrollingDblClick
                  ExplicitLeft = 3
                  ExplicitTop = 3
                  ExplicitWidth = 170
                  ExplicitHeight = 238
                end
              end
              object pnlTextScrollingTreeView: TPanel
                Left = 264
                Top = 3
                Width = 255
                Height = 296
                ShowCaption = False
                TabOrder = 1
                OnResize = pnlTextScrollingTreeViewResize
                object tvTextScrolling: TTreeView
                  AlignWithMargins = True
                  Left = 4
                  Top = 27
                  Width = 247
                  Height = 248
                  Margins.Bottom = 0
                  Align = alClient
                  Indent = 19
                  TabOrder = 0
                  OnChange = tvTextScrollingChange
                  OnCollapsed = tvTextScrollingCollapsed
                  OnDblClick = tvTextScrollingDblClick
                  OnExpanded = tvTextScrollingExpanded
                  ExplicitLeft = 8
                end
                object ScrollBarTextScrollingTreeView: TScrollBar
                  AlignWithMargins = True
                  Left = 5
                  Top = 275
                  Width = 246
                  Height = 17
                  Margins.Left = 4
                  Margins.Top = 0
                  Align = alBottom
                  PageSize = 0
                  TabOrder = 1
                  OnChange = ScrollBarTextScrollingTreeViewChange
                end
                object chkCustomDrawTextScrollingTreeView: TCheckBox
                  AlignWithMargins = True
                  Left = 4
                  Top = 4
                  Width = 247
                  Height = 17
                  Align = alTop
                  Caption = 'Dessin Manuel'
                  TabOrder = 2
                  OnClick = chkCustomDrawTextScrollingTreeViewClick
                end
                object chkCustomDrawTextScrollingTreeViewSpecial: TCheckBox
                  Left = 106
                  Top = 4
                  Width = 97
                  Height = 17
                  Caption = 'Scrolling Text'
                  TabOrder = 3
                end
              end
              object pnlColumnTreeView: TPanel
                Left = 525
                Top = 3
                Width = 255
                Height = 296
                ShowCaption = False
                TabOrder = 2
                object tvColumn: TTreeView
                  AlignWithMargins = True
                  Left = 4
                  Top = 27
                  Width = 247
                  Height = 241
                  Margins.Bottom = 0
                  Align = alClient
                  Indent = 19
                  TabOrder = 0
                  OnDblClick = tvColumnDblClick
                  ExplicitLeft = 85
                  ExplicitTop = 58
                  ExplicitWidth = 170
                  ExplicitHeight = 238
                end
                object chkCustomDrawColumnTreeView: TCheckBox
                  AlignWithMargins = True
                  Left = 4
                  Top = 4
                  Width = 247
                  Height = 17
                  Align = alTop
                  Caption = 'Dessin Manuel'
                  TabOrder = 1
                  OnClick = chkCustomDrawColumnTreeViewClick
                end
                object pnlColumnTreeViewButtons: TPanel
                  Left = 1
                  Top = 268
                  Width = 253
                  Height = 27
                  Align = alBottom
                  BevelOuter = bvLowered
                  ShowCaption = False
                  TabOrder = 2
                  DesignSize = (
                    253
                    27)
                  object btnBtnTreeViewColumnAdd: TButton
                    Left = 4
                    Top = 1
                    Width = 75
                    Height = 25
                    Anchors = [akLeft, akBottom]
                    Caption = 'Add Column'
                    TabOrder = 0
                    OnClick = btnBtnTreeViewColumnAddClick
                  end
                  object btnBtnTreeViewColumnDelete: TButton
                    Left = 80
                    Top = 1
                    Width = 89
                    Height = 25
                    Anchors = [akLeft, akBottom]
                    Caption = 'Delete Column'
                    TabOrder = 1
                    OnClick = btnBtnTreeViewColumnDeleteClick
                  end
                  object btnBtnTreeViewColumnNodeAdd: TButton
                    Left = 170
                    Top = 1
                    Width = 75
                    Height = 25
                    Anchors = [akLeft, akBottom]
                    Caption = 'Add Node'
                    TabOrder = 2
                    OnClick = btnBtnTreeViewColumnNodeAddClick
                  end
                end
              end
            end
          end
        end
      end
    end


    OnCustomDrawItem et DefaultDraw à False, tu perds le dessin des noeuds

    Tu avais mis False à TextOnly de DisplayRect, cela complique le calcul de position

    Si le paramètre TextOnly a la valeur true, le rectangle de délimitation inclut seulement le texte du noeud. Sinon, il inclut toute la ligne occupée par le noeud dans le contrôle vue arborescente.
    En utilisant DisplayRect(True), plus besoin de Ident
    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

  7. #7
    Membre expérimenté Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Par défaut
    Merci infiniment pour le temps que tu m'as consacré.

    J'ai donc repris mon exemple , j'ai modifié les propriétés comme tu m'as dit et effectivement le constat est que cela fonctionne, donc bravo !
    Sauf que je n'ai pas tout dit et que j'ai besoin de redessiner la totalité de chaque item (y compris l'icone) pour obtenir une couleur de fond unique sur toute la largeur de la treeview comme ceci:


    Nom : Capture.PNG
Affichages : 1766
Taille : 20,5 Ko

    voici donc le code complet:
    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
     
    procedure TRecipeEditorForm.TVCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState;var DefaultDraw: Boolean);
    var
      NodeRect  : TRect;
      LayerNode : TTreeNode;
      ImageId   : integer;
    begin
      DefaultDraw := false;
      with TV.Canvas do
      begin
     
        NodeRect := Node.DisplayRect(false); // textonly=false because we want the full rectangle
     
        Font.Color:=clblack;
        // -----------------
        // BackGround color
        // -----------------
        LayerNode := Node;
        while (LayerNode.Parent<>nil) and ((TObject(LayerNode.Data) is TEquipLayer) or (TObject(LayerNode.Data) is TEventLayer))  do LayerNode:=LayerNode.Parent; // All sub item of a layer are the same color, so search if there is a parent of type Tlayer
        if TObject(LayerNode.Data) is TRecipeItem then
        With TRecipeItem(LayerNode.Data) do
        if IsColor then
        Begin
          Brush.Color := Color; // BBGGRR
          Brush.Style := bssolid;
          FillRect(NodeRect);
          font.color := GetTextColorBW(color);
        End;
     
        Brush.Style := bsClear;
        // -----------------
        // Draw the selection rect.
        // -----------------
        if Node=Sender.Selected then
        Begin
          Pen.Color:=clblack;
          Rectangle(NodeRect);
        End;
     
        NodeRect.Left := NodeRect.Left + (Node.Level * TV.Indent); // NodeRect.Left now represents the left-most portion of the expand button
        TV_DrawButton(TTreeView(Sender),NodeRect, Node); // Draw the [+] [-] and the three
     
        NodeRect.Left := NodeRect.Left + TV.Indent ;
     
        ImageId := Node.ImageIndex;
     
        // EntryPoint
        if (assigned(EntryPoint)) then
        begin
          if (node.AbsoluteIndex < EntryPoint.AbsoluteIndex) then // if it is before the entry point then write in Italic
          Begin
            font.Style := font.Style + [fsItalic];
          End else
          if (node.AbsoluteIndex = EntryPoint.AbsoluteIndex) then // if it is the entry point then write in Bold
          Begin
            ImageId := byte(RCimgStart);
            font.Style := font.Style + [fsBold];
          End;
        end;
     
        ImageTreeView.Draw(Sender.Canvas, NodeRect.Left, NodeRect.Top + (NodeRect.Bottom - NodeRect.Top) div 2 - TV.Images.Height div 2, ImageId, True);
     
        SetBkMode(Canvas.Handle, Ord(TRANSPARENT));
        NodeRect.Left := NodeRect.Left + ImageTreeView.Width+5;
     
        TextOut(NodeRect.Left, NodeRect.Top+1, Node.Text);
     
       // -----------------
       if  Sender.Dragging and (Sender.DropTarget=Node) then
       Begin
         pen.mode:=pmXor;
         moveto(NodeRect.Left,NodeRect.Bottom-4);    LineTo(NodeRect.Left+50,NodeRect.Bottom-4);
         pen.mode:=pmCopy;
       End;
      end;
    End;
    merci

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

Discussions similaires

  1. Probleme d'affichage avec un DataGridView
    Par kekesilo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/01/2007, 14h12
  2. Probleme d'affichage avec TextOutA
    Par NouRSS dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/05/2006, 15h01
  3. [Graphic2D] Probleme d'affichage avec drawLine()
    Par Yannick_from_31 dans le forum 2D
    Réponses: 12
    Dernier message: 23/05/2006, 18h09
  4. Problème d'affichage avec top
    Par HacHHacH dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 03/04/2006, 01h25
  5. Réponses: 6
    Dernier message: 10/11/2005, 08h58

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