在改变ListView控件的列宽时发生什么事件?(200分)

  • 主题发起人 wuzhongl
  • 开始时间
W

wuzhongl

Unregistered / Unconfirmed
GUEST, unregistred user!
ListView控件的Style属性为Report。
在改变ListView控件的列宽时发生什么事件?如没有已预定义的事件,如何才能产生该事
件。
 
OnColumnDragged
 
oncolumndraged 是拖动列(即改变列的位置:如将第一列拖到第二列后),而我需要改变
列宽时发生的事件?
 
OnResize事件
 
没有现成的事件
可以参照VCL源代码,先取得HeaderHandle,然后取得它的窗口过程
再在里面拦截消息。
 
搞定:

{***************************************************************
*
* Project Name: LVTest -- Main
* Typist: XJG(xianjun@163.net)
* Purpose:
* Comment Time: 2002-12-2 16:03:20
* History: Create by xjg.
*
****************************************************************}

unit Main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;

type
TForm1 = class(TForm)
ListView1: TListView;
Memo1: TMemo;
private
{ Private declarations }
FHeaderHandle: THandle;
FHeaderInstance: Pointer;
FDefHeaderProc: Pointer;
FMouseDowned: Boolean;
FWidths: array of Integer;
procedure HeaderWndProc(var Message: TMessage);
public
{ Public declarations }
procedure Loaded; override;
destructor Destroy; override;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

uses CommCtrl;

destructor TForm1.Destroy;
begin
if FHeaderHandle <> 0 then
SetWindowLong(FHeaderHandle, GWL_WNDPROC, Longint(FDefHeaderProc));
FreeObjectInstance(FHeaderInstance);
inherited;
end;

procedure TForm1.HeaderWndProc(var Message: TMessage);

procedure RecordCurWidths;
var
I: Integer;
begin
SetLength(FWidths, ListView1.Columns.Count);
for I := 0 to High(FWidths) do
FWidths := ListView1.Columns.Width;
end;

procedure CompareWidths;
var
I: Integer;
begin
for I := 0 to High(FWidths) do
if FWidths <> ListView1.Columns.Width then
begin
Memo1.Lines.Add(Format('Column %d: %d --> %d', [I, FWidths,
ListView1.Columns.Width]));
end;
end;
begin
with Message do
begin
Result := CallWindowProc(FDefHeaderProc, FHeaderHandle, Msg, WPARAM, LPARAM);
if Msg = WM_LBUTTONDOWN then
begin
FMouseDowned := True;
RecordCurWidths;
end
else if Msg = WM_LBUTTONUP then
begin
if FMouseDowned then
begin
CompareWidths;
FMouseDowned := False;
end;
end
else if Msg = WM_LBUTTONDBLCLK then
CompareWidths;
end;
end;

procedure TForm1.Loaded;
begin
inherited;
FHeaderHandle := ListView_GetHeader(ListView1.Handle);
FHeaderInstance := MakeObjectInstance(HeaderWndProc);
FDefHeaderProc := Pointer(GetWindowLong(FHeaderHandle, GWL_WNDPROC));
SetWindowLong(FHeaderHandle, GWL_WNDPROC, Longint(FHeaderInstance));
end;

end.

 
ListView_GetHeader是什么函数?在编译时通不过!
另外,在帮助中查找到OnColumnResize事件,将该事件加入到ListView控件中能解决问题吗?
 
是CommCtrl单元中的一个函数:
function ListView_GetHeader(hwnd: HWND): HWND;
begin
Result := SendMessage(hwnd, LVM_GETHEADER, 0, 0);
end;

>>外,在帮助中查找到OnColumnResize事件,将该事件加入到ListView控件中能解决问题吗?
TListView及其祖先类并无此事件,没办法直接加入到ListView控件中
 
顶部