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
|
function MyListViewWndProc(p1: HWND; p2: UINT; p3: WPARAM; p4: LPARAM): LRESULT;
var
ParentH : HWND;
M : TMessage;
Buffer : IntPtr;
Begin
ParentH := GetParent(p1);
if (ParentH = 0) or (ParentH = p1) then begin
Result := 1;
Exit;
End;
M.Msg := p2;
M.WParam := p3;
M.LParam := p4;
Buffer := Marshal.AllocHGlobal(Marshal.SizeOf(TypeOf(TObject(p3))));
try
Marshal.StructureToPtr(TObject(p3), Buffer, False);
Result := SendMessage(ParentH, PM_HEADERMSG, longint(p3), 0);
finally
Marshal.DestroyStructure(Buffer, TypeOf(LParam));
Marshal.FreeHGlobal(Buffer);
end;
end;
constructor TsListView.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Header := 0;
HeaderWndProc := 0;
ViewStyle := vsReport;
FixedColor := clBtnFace;
end;
procedure TsListView.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, @MyListViewWndProc);
End;
end;
procedure TsListView.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 TsListView.HeaderMessage(var Msg: TMessage);
begin
Msg.Result := CallWindowProc(IntPtr(HeaderWndProc), Header, Msg.Msg, Msg.WParam, Msg.LParam);
If Msg.Msg = WM_PAINT Then
DrawButtons;
end;
procedure TsListView.DrawButtons;
Var
DC : HDC;
Bounds : TRect;
Border1,
Border2 : Integer;
I, X : Integer;
Canvas : TCanvas;
Begin
If Header = 0 Then Exit;
FFixedColor := clblue;
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 TsListView.SetFixedColor(const Value: TColor);
begin
FFixedColor := clblue;
DrawButtons;
end;
procedure TsListView.CreateHandle;
begin
inherited;
If Parent <> nil Then
PostMessage(Handle, PM_CHANGEPROC, 0, 0);
end;
function TsListView.get_CheckedCount: Integer;
var
cpt: integer;
begin
Result := 0;
cpt := 0;
while (cpt < Items.Count) do begin
Inc(Result, Ord(Items[cpt].Checked));
Inc(cpt);
end;
end; |