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

C++Builder Discussion :

Couleur des titres de colonne d'un ListView


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 27
    Par défaut Couleur des titres de colonne d'un ListView
    Bonjour à tous;

    Je cherche à personnaliser un ListView (affichage en mode vsReport). J'arrive bien à personnaliser l'affichage des "cellules" à l'intérieur du LIstView en utilisant l'évènement AdvancedCustomDrawSubItem.
    Mais j'aurais souhaiter mettre une couleur fixe pour les intitulés des colonnes. Je ne trouve pas de propriété couleur quand j'ajoute une colonne. Y a t il un message Windows à envoyer?

    Merci d'avance pour l'aide.
    remus08

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    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 081
    Par défaut
    Comme les cellules, tu vas devoir le dessiner manuellement, peut-être qu'en affectant Brush.Color avant la phase de dessin, cela peut le forcer à utiliser une autre couleur que celle par défaut en jouant sur le TCustomDrawStage

    Par contre, j'ai un doute si l'on a des évènements sur le dessin des entêtes, j'espère que OnAdvancedCustomDraw ou OnCustomDraw soit appelés !
    Il faut passer à OwnerDraw à true ce qui peut te demander plus de travail

    Pense que le TListView est avant tout un contrôle Windows, que Delphi n'expose pas toutes les fonctionnalités existantes utilise LVM_GETHEADER\ListView_GetHeader pour obtenir un handle de contrôle dont tu pourras modifier différement élements comme la Fonte via WM_GETFONT\WM_SETFONT

    Si tu es courageux, tu peux détourner la WindowProc(selon la version de la VCL, tu passe par SetWindowLong soit c'est une propriété de l'objet)
    Tu peux détourner le WndProc du contrôle Header du TListView qui est un sous enfant du TListView (SysHeader32 que l'on peut obtenir avec FindWindowExou GetWindow(Handle, GW_CHILD).

    Ces codes Delphi peut t'inspirer

    Comment modifier la couleur du header du TListView ?

    Ou ce code pour Delphi 5 :
    En 2007+, tu peux remplacer SetWindowLong par la propriété WindowProc


    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
    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
    unit ComCtrls_ListViewEx;
     
    interface
     
    Uses Windows, SysUtils, Messages, Classes, Controls, ComCtrls, Graphics;
     
    Const
     PM_CHANGEPROC = WM_USER + 1;
     PM_HEADERMSG  = WM_USER + 2;
     
    Type
     TListViewEx = class(TListView)
     private
      FFixedColor   : TColor;
      Header        : HWND;
      HeaderWndProc : Integer;
      procedure ChangeHeaderWndProc(var Msg : TMessage); message PM_CHANGEPROC;
      procedure HeaderMessage(var Msg : TMessage); message PM_HEADERMSG;
      procedure CMRecreateWnd(var Message: TMessage); message CM_RECREATEWND;
      procedure DrawButtons;
      procedure SetFixedColor(const Value: TColor);
     public
      constructor Create(AOwner : TComponent); override;
      procedure CreateHandle; override;
     published
      property FixedColor : TColor read FFixedColor Write SetFixedColor;
     End;
     
     
    procedure Register;
     
    implementation
     
    procedure Register;
    Begin
     RegisterComponents('Slava', [TListViewEx]);
    End;
     
    { TListViewEx }
     
    function MyWndProc(Wnd: HWND; Msg, WParam, LParam: Longint): Longint; stdcall;
    Var
     ParentH : HWND;
     M       : TMessage;
    Begin
     ParentH := GetParent(Wnd);
     If (ParentH = 0) or (ParentH = Wnd) Then Begin
      Result := 1;
      Exit;
     End;
     
     M.Msg    := Msg;
     M.WParam := WParam;
     M.LParam := LParam;
     
     Result := SendMessage(ParentH, PM_HEADERMSG, Integer(@M), 0);
    end;
     
    procedure TListViewEx.ChangeHeaderWndProc(var Msg: TMessage);
    begin
     CMRecreateWnd(Msg);
     If (Parent <> nil) Then Begin
      Header := FindWindowEx(Handle, 0, 'SysHeader32', nil);
      If Header = 0 Then Exit;
      HeaderWndProc := GetWindowLong(Header, GWL_WNDPROC);
      SetWindowLong(Header, GWL_WNDPROC, Longint(@MyWndProc));
     End;
    end;
     
    procedure TListViewEx.CMRecreateWnd(var Message: TMessage);
    begin
     If Header <> 0 Then Begin
      If HeaderWndProc <> 0 Then
       SetWindowLong(Header, GWL_WNDPROC, HeaderWndProc);
      Header := 0;
      HeaderWndProc := 0;
     End;
    end;
     
    procedure TListViewEx.HeaderMessage(var Msg: TMessage);
    Var
     M : PMessage;
    begin
     M := PMessage(Msg.WParam);
     
     Msg.Result := CallWindowProc(Pointer(HeaderWndProc), Header, M^.Msg, M^.WParam, M^.LParam);
     
     If M^.Msg = WM_PAINT Then
      DrawButtons;
    end;
     
    procedure TListViewEx.DrawButtons;
    Var
     DC       : HDC;
     Bounds   : TRect;
     Border1,
     Border2  : Integer;
     I, X     : Integer;
     
     Canvas   : TCanvas;
    Begin
     If Header = 0 Then Exit;
     
     Windows.GetClientRect(Header, Bounds);
     
     Border1 := GetSystemMetrics(SM_CXBORDER);
     Border2 := GetSystemMetrics(SM_CXFIXEDFRAME) - Border1;
     
     DC := GetDC(Header); X := 0;
     
     Canvas := TCanvas.Create;
     Canvas.Handle := DC;
     
     Canvas.Brush.Color := FFixedColor;
     
     For I := 0 To Columns.Count - 1 Do Begin
      Canvas.FillRect(Rect(X + Border1, Border1,
                           X + Columns[I].Width - Border2,
                           Bounds.Bottom - Border2));
     
      Canvas.TextOut(X + Border2, Border2, Columns[I].Caption);
     
      X := X + Columns[I].Width;
     End;
     Canvas.FillRect(Rect(X + Border1, Border1, Bounds.Right, Bounds.Bottom - Border2));
     
     Canvas.Free;
    End;
     
    procedure TListViewEx.SetFixedColor(const Value: TColor);
    begin
     FFixedColor := Value;
     DrawButtons;
    end;
     
    procedure TListViewEx.CreateHandle;
    begin
     inherited;
     
     If Parent <> nil Then
      PostMessage(Handle, PM_CHANGEPROC, 0, 0);
    end;
     
    constructor TListViewEx.Create(AOwner: TComponent);
    begin
     inherited;
     Header        := 0;
     HeaderWndProc := 0;
     
     ViewStyle     := vsReport;
     FixedColor    := clBtnFace;
    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
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut remus08
    Un bout de code qui colore les cases de l'entete des colonnes tire de ce site
    Le .h
    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
     
    //---------------------------------------------------------------------------
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ComCtrls.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published: // IDE-managed Components
            TListView *ListView1;
            TButton *Button1;
    private: // User declarations
    public:  // User declarations
            __fastcall TForm1(TComponent* Owner);
            __fastcall TForm1::~TForm1();
    //        LRESULT CALLBACK ListViewWindowProc(HWND hwnd, UINT uMsg,
    //        WPARAM wParam, LPARAM lParam);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    Le .cpp
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    // <a href="http://www.ccrun.com/article.asp?i=1069&d=uq3568" target="_blank">http://www.ccrun.com/article.asp?i=1069&d=uq3568</a>
    typedef LRESULT(CALLBACK * TCallBack)(HWND, UINT, WPARAM, LPARAM);
     
    TCallBack g_oldListViewWndProc;
    HWND g_hListViewHeader;
    LRESULT CALLBACK ListViewWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
         LPARAM lParam)
    {
         PAINTSTRUCT ps ={ 0 };
         RECT rect = { 0 };
         HDC hPen = NULL;
         HDC hBrush = NULL;
         int iCount = 0;
         int i1 = 0;
         BYTE red0 = 115, green0 = 154, blue0 = 206;
         BYTE red1 = 255, green1 = 255, blue1 = 255;
         BYTE red, green, blue;
         int j, m, n;
        switch(uMsg)
         {
         case WM_PAINT:
             BeginPaint(g_hListViewHeader, &ps);
             hPen = SelectObject(ps.hdc, GetStockObject(DC_PEN));
             iCount = Header_GetItemCount(g_hListViewHeader); // ??????
     // ???? C++Builder?? - <a href="http://www.ccrun.com/article.asp?i=1069&d=uq3568" target="_blank">http://www.ccrun.com/article.asp?i=1069&d=uq3568</a>
             SetDCPenColor(ps.hdc, ColorToRGB((TColor)(0x00EFDBCE)));
             red = GetRValue((TColor)(0x00EFDBCE));
             green = GetGValue((TColor)(0x00EFDBCE));
             blue = GetBValue((TColor)(0x00EFDBCE));
             for (int i = 0; i < iCount; i++)
             {
                 Header_GetItemRect(g_hListViewHeader, i, &rect); // ??Item???
                m = rect.bottom - rect.top;
                 n = m / 2 + 1;
                 for (j = 0; j < n; j++)
                 {
                     red = red0 * (j + 1) / n + red1 * (n - j - 1) / n;
                     green = green0 * (j + 1) / n + green1 * (n - j - 1) / n;
                     blue = blue0 * (j + 1) / n + blue1 * (n - j - 1) / n;
                    SetDCPenColor(ps.hdc, RGB(red, green, blue));
                     MoveToEx(ps.hdc, rect.left + 1, rect.top + j, NULL);
                     LineTo(ps.hdc, rect.right, rect.top + j);
                     MoveToEx(ps.hdc, rect.left + 1, rect.bottom - j - 1, NULL);
                     LineTo(ps.hdc, rect.right, rect.bottom - j - 1);
                 }
                 SetDCPenColor(ps.hdc, ColorToRGB(clBtnFace));
                 MoveToEx(ps.hdc, rect.right, rect.top + 1, NULL);
                 LineTo(ps.hdc, rect.right, rect.bottom - 1);
                 SelectObject(ps.hdc, Form1->Font->Handle);
                 i1 = ((rect.bottom - rect.top) - abs(Form1->Font->Height)) / 2;
                 hBrush = SelectObject(ps.hdc, GetStockObject(NULL_BRUSH));
                 SetBkMode(ps.hdc, TRANSPARENT); // ??????????
                 TextOut(ps.hdc, rect.left + 10, rect.top + i1,
                     Form1->ListView1->Columns->Items[i]->Caption.c_str(),
                     Form1->ListView1->Columns->Items[i]->Caption.Length());
                 SelectObject(ps.hdc, hBrush);
             }
             hPen = SelectObject(ps.hdc, hPen);
             EndPaint(g_hListViewHeader, &ps);
             break;
         default:
             return CallWindowProc((FARPROC)g_oldListViewWndProc, g_hListViewHeader,
                 uMsg, wParam, lParam);
         }
        return 0;
    }
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    g_hListViewHeader = FindWindowEx(ListView1->Handle, NULL, "SysHeader32", NULL);
    g_oldListViewWndProc = (TCallBack)GetWindowLong
                            (g_hListViewHeader, GWL_WNDPROC);
    SetWindowLong(g_hListViewHeader, GWL_WNDPROC, long(ListViewWindowProc));
    }
    //---------------------------------------------------------------------------
    __fastcall TForm1::~TForm1()
    {
    SetWindowLong(g_hListViewHeader, GWL_WNDPROC, (long)g_oldListViewWndProc);
    }
    Cela fonctionne avec BCB6 et Window7

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Pour colorer la font placer cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SetTextColor(ps.hdc, clRed); //couleur texte
    ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SetBkMode(ps.hdc, TRANSPARENT); // ??????????
                 SetTextColor(ps.hdc, clRed); //couleur texte
    TextOut(ps.hdc, rect.left + 10, rect.top + i1,
    Form1->ListView1->Columns->Items[i]->Caption.c_str(),
    Form1->ListView1->Columns->Items[i]->Caption.Length());

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 27
    Par défaut
    Parfait, ça marche nickel!
    Je pensais pas à la transparence et l'effet dégradé intégré, mais c'est vraiment plus joli avec.

    Un détail le texte des intitulés n'est plus centré, je pense qu'il faudrait modifié la ligne suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextOut(ps.hdc, rect.left + 10, rect.top + i1,
    En remplaçant le "+10" par un calcul pour le centrage.
    Dès que j'ai fais l'amélioration je posterai le code.

    Un grand merci!

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TextOut(ps.hdc, rect.left + 10, rect.top + i1,
                 Form1->ListView1->Columns->Items[i]->Caption.c_str(),
                 Form1->ListView1->Columns->Items[i]->Caption.Length());
    par ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DrawText(ps.hdc, Form1->ListView1->Columns->Items[i]->Caption.c_str(), -1, &rect, DT_CENTER | DT_NOPREFIX | DT_VCENTER | DT_SINGLELINE);

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

Discussions similaires

  1. [JTable] Problème d'affichage des titres de colonnes
    Par saidgrd dans le forum Composants
    Réponses: 2
    Dernier message: 10/05/2008, 20h37
  2. JTable impossible de mettre des titres de colonnes !
    Par isma92 dans le forum Composants
    Réponses: 3
    Dernier message: 20/12/2007, 20h46
  3. Couleur des titres dans une JTable
    Par drasalmed dans le forum Composants
    Réponses: 3
    Dernier message: 28/05/2007, 15h45
  4. [C#] Changer les couleurs des titres colonnes d'une listView
    Par ExSter dans le forum Windows Forms
    Réponses: 4
    Dernier message: 15/04/2007, 21h02

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