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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question