ListView Color des titres des Colonnes

Résolu
jorisT Messages postés 5 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 9 septembre 2010 - 7 sept. 2010 à 14:14
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 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

6 réponses

jorisT Messages postés 5 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 9 septembre 2010
9 sept. 2010 à 09:25
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. 

3
jorisT Messages postés 5 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 9 septembre 2010
8 sept. 2010 à 09:22
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 !!!!
0
jorisT Messages postés 5 Date d'inscription vendredi 30 juillet 2004 Statut Membre Dernière intervention 9 septembre 2010
8 sept. 2010 à 09:25
Et pour info FixedColor et TitreFont n'existe pas pour les ListViews du moins sur Delphi 5 mais il existe dans les DBGRID.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
9 sept. 2010 à 17:04
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]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
10 sept. 2010 à 01:52
« 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.)
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
10 sept. 2010 à 10:39
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]
0
Rejoignez-nous