ListView Color des titres des Colonnes [Résolu]

Signaler
Messages postés
5
Date d'inscription
vendredi 30 juillet 2004
Statut
Membre
Dernière intervention
9 septembre 2010
-
Cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
-
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

6 réponses

Messages postés
5
Date d'inscription
vendredi 30 juillet 2004
Statut
Membre
Dernière intervention
9 septembre 2010

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. 

Messages postés
5
Date d'inscription
vendredi 30 juillet 2004
Statut
Membre
Dernière intervention
9 septembre 2010

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 !!!!
Messages postés
5
Date d'inscription
vendredi 30 juillet 2004
Statut
Membre
Dernière intervention
9 septembre 2010

Et pour info FixedColor et TitreFont n'existe pas pour les ListViews du moins sur Delphi 5 mais il existe dans les DBGRID.
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
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]
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
« 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.)
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
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]