首页  编辑  

一个回调例子

Tags: /超级猛料/Alogrith.算法和数据结构/源代码/   Date Created:

如何捕获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消息,你可以做一个判断来过虑。