Chinaunix首页 | 论坛 | 博客
  • 博客访问: 969113
  • 博文数量: 108
  • 博客积分: 3243
  • 博客等级: 中校
  • 技术积分: 964
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-15 22:09
文章分类

全部博文(108)

文章存档

2020年(2)

2019年(1)

2018年(2)

2017年(9)

2016年(20)

2015年(1)

2013年(1)

2012年(12)

2011年(28)

2010年(27)

2009年(4)

2008年(1)

分类:

2010-01-28 15:33:07

使用sendmessage()postmessage()向控件发送消息时, 需要指定对应的句柄,而非可视控件继承于 TComponent 没有 Handle,所以一般非可视控件都不能接受外部发来的消息.

为了让非可视控件能够接受消息,首先想到的就是给其加上句柄.

在查阅资料后,发现 Classes 里有两个个函数 AllocateHWnd(Method: TWndMethod): HWND; DeallocateHWnd(Wnd: HWND) 顾名思义 一个是分配 Handle 一个是释放 Handle

程序代码简单如下:

Type

TMyObject = class(TComponent)

private

  FWindowHandle: HWND;

Protected

  procedure WndProc(var Msg: TMessage);

public

  constructor Create(AOwner: TComponent); override;

  destructor  Destry;override;

  property Handle: HWND read FWindowHandle;
end;

 

procedure Register; 

 

implementation

 

procedure Register; 

begin

  .....

end;

 

constructor TMyObject.Create(AOwner: TComponent);

begin

  inherited Create(AOwner);

  FWindowHandle := AllocateHWnd(WndProc);

end;

 

destructor  TMyObject.Destry;

begin

  DeallocateHWnd(FWindowHandle);

  inherited Destroy;

end;

 

每个有Handle的控件都有这个段过程  }

procedure TMyObject.WndProc(var Msg: TMessage);

begin

  with Msg do

  begin

    case Msg of

      //自己的处理消息的过程.....

    else

      Result := DefWindowProc(FWindowHandle, Msg, WParam, LParam);

    end;

  end;

end;

 

向此控件发送消息时,跟从 TWinControl继承下来的控件一样的使用

  PostMessage(MyObject.Handle, ..., ..., ...);

就可以了。

 

 

 

阅读(912) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~