如何捕获TTreeView中滚动条滚动的动作
好不丫给你骂一顿,我招你了老哥?咱给您写段吧,"喷嚏震天响"兄的方法也行,您也可
以用他的方法写个VCL控件,可以添加进两个事件响应句柄。其实还有几个方法,但咱这个
比较简单,写个回调函数就完事了。咱没有试着用(没有装Delphi),纯粹瞎掰,不好使您
别骂我。
申明部分:
...
private
FClientInstance,
FPrevClientProc : TFarProc;
procedure ClientWndProc(var Message: TMessage);
...
实现部分:
procedure TForm1.FormCreate(Sender: TObject);
begin
FClientInstance := MakeObjectInstance(ClientWndProc);
FPrevClientProc := Pointer(GetWindowLong(TreeView1.Handle, GWL_WNDPROC));
{ 保存默认窗口回调函数指针,TreeView1.Handle 是需要监控的TreeView的句柄 }
SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FClientInstance));
{ 设置自定义窗口回调函数 }
end;
procedure TForm1.ClientWndProc(var Message: TMessage);
begin
case Message.Msg of
WM_VSCROLL:
begin
{ 干您的好事,处理WM_VSCROLL消息,垂直滚动条变化消息 }
end;
WM_HSCROLL:
begin
{ 干您的好事,处理WM_HSCROLL消息,水平滚动条变化消息 }
end;
else
Result := CallWindowProc(FPrevClientProc, ClientHandle, Msg, wParam,
lParam);
{ 调用默认窗口回调函数处理其它消息 }
end;
end;
*********************
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls;
type
TForm1 = class(TForm)
TreeView1: TTreeView;
procedure FormCreate(Sender: TObject);
private
FClientInstance,
FPrevClientProc : TFarProc;
procedure ClientWndProc(var Message: TMessage);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
FClientInstance := MakeObjectInstance(ClientWndProc);
FPrevClientProc := Pointer(GetWindowLong(TreeView1.Handle, GWL_WNDPROC));
SetWindowLong(TreeView1.Handle, GWL_WNDPROC, LongInt(FClientInstance));
end;
procedure TForm1.ClientWndProc(var Message: TMessage);
begin
case Message.Msg of
WM_VSCROLL:
begin
ShowMessage ('wm_vscroll 事件');
end;
WM_HSCROLL:
begin
ShowMessage ('wm_hscroll 事件');
end;
end;
Message.Result := CallWindowProc(FPrevClientProc,
ClientHandle, Message.Msg, Message.wParam, Message.lParam);
end;
end.
不好意思,前面回答的代码段没有调试就是有好多问题,以上代码调试通过,不过好像点击
一次滚动条会激活两次 WM_xSCROLL消息,你可以做一个判断来过虑。