ListView Color des titres des Colonnes [Résolu]

Messages postés
5
Date d'inscription
vendredi 30 juillet 2004
Statut
Membre
Dernière intervention
9 septembre 2010
- - Dernière réponse : Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
- 10 sept. 2010 à 10:39
Bonjours,

J'ai une question concernant les ListView est-il possible de personnaliser la couleur des titres des Colonnes ?

Je l'ai déjà fais sur un DBGRID avec les propriétés FixedColor et une autre (chez plus le nom) pour changer la couleur du texte.
Hors ces propriétés n'existent pas dans un ListView .

Merci pour vos infos
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
5
Date d'inscription
vendredi 30 juillet 2004
Statut
Membre
Dernière intervention
9 septembre 2010
3
Merci
Pour ce qui on se probleme , voila une solution :

unit 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;
AFixedColor : TColor;
AColumnHdr : integer;
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);
procedure SetActiveFixedColor(const Value: TColor);
procedure SetActiveColumnHdr(const Value: integer);
public
constructor Create(AOwner : TComponent); override;
procedure CreateHandle; override;
published
property FixedColor : TColor read FFixedColor Write SetFixedColor;
property ActiveFixedColor : TColor read AFixedColor Write SetActiveFixedColor;
property ActiveColumnHdr : integer read AColumnHdr Write SetActiveColumnHdr;
End;


procedure Register;

implementation

procedure Register;
Begin
RegisterComponents('TListViewEX', [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;
if ParentFont then
Canvas.Font := self.Font;

For I := 0 To Columns.Count - 1 Do Begin

if AColumnHdr > -1 then
begin
if (i = AColumnHdr) then
Canvas.Brush.Color := AFixedColor
else
Canvas.Brush.Color := FFixedColor;
end;
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.SetActiveColumnHdr(const Value: integer);
begin
AColumnHdr := Value;
end;

procedure TListViewEx.SetActiveFixedColor(const Value: TColor);
begin
AFixedColor := Value;
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;

AColumnHdr := -1;
AFixedColor := clBtnFace;
end;

end. 

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 200 internautes nous ont dit merci ce mois-ci

Commenter la réponse de jorisT
Messages postés
5
Date d'inscription
vendredi 30 juillet 2004
Statut
Membre
Dernière intervention
9 septembre 2010
0
Merci
Dsl si je suis débutant et que sur internet je n'ai rien trouvé à part sur un forum anglais ou un mec explique que lui a redeveloppé le composant pour le faire car d'apres lui sur Delphi 5 se n'est pas possible.

Pourtant je pensais avoir mis mon message dans la partie débutant !!!!
Commenter la réponse de jorisT
Messages postés
5
Date d'inscription
vendredi 30 juillet 2004
Statut
Membre
Dernière intervention
9 septembre 2010
0
Merci
Et pour info FixedColor et TitreFont n'existe pas pour les ListViews du moins sur Delphi 5 mais il existe dans les DBGRID.
Commenter la réponse de jorisT
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
34
0
Merci
bon c'est bien t'as fini par trouver tout seul !!

il t'a fallu deux questions sous deux pseudos différents pour en arriver à ça ... soit mais t'as oublié le plus important ... on cite toujours ses sources par respect pour l'auteur original:

http://www.delphipages.com/forum/showthread.php?t=199219
Merci pour lui


[hr]@+Cirec
[hr]
Commenter la réponse de Cirec
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
0
Merci
« Pourtant je pensais avoir mis mon message dans la partie débutant !!!! »

Ouais. Et alors ?..

Si on n'a pas créé de rubrique 'fainéant', c'est parce qu'on a nos raisons.
(Y'a pas plus actifs que les fainéants sur un forum d'entraide gratos.)
Commenter la réponse de Caribensila
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 septembre 2019
34
0
Merci
et pour toute réponse monsieur demande la suppression de son compte !!

enfin il te reste encore le deuxième compte pour répondre


[hr]@+Cirec
[hr]
Commenter la réponse de Cirec