使对象可以接收消息
2012-10-25 14:04
134 查看
在delphi中,有时候我们希望对象可以接收windows消息,怎么办呢?因为要接收windows消息起码要有windows Handle,难道要建立的一个可见窗口?那样似乎太差强人意了。delphi提供了一个函数Classes.AllocateHWnd。分析AllocateHWND发现delphi CreateWindowEx一个尺寸为0的窗口,窗口是生成了,Handle也有了,但窗口的消息要处理吧,否则怎么说让对象接收Windows消息呢,但我们都知道类函数和Windows消息处理函数是不一样的,类函数的地址应该是Self+函数的偏移。这个delphi也帮我们处理好了,在AllocateHWnd内部将我们传入的对象函数通过MakeObjectInstance转换为普通函数,然后我们就可以在对象内部处理Windows消息了。
简写代码如下:
TMyHandleWinMessage = class
private
FWinHandle: HWND;
procedure WndProc(var Msg: TMessage);
public
constructor Create;
destructor Destroy; override;
end;
Create 实现:
FWinHandle = Classes.AllocateHWnd(WndProc);
Destroy实现:
if FWinHandle <> 0 then Classes.DeallocateHWnd(FWinHandle); // 必须释放系统核心对象
WndProc实现:
在这里处理你感兴趣的消息,否则交给Windows处理。
With Msg do
if Msg = XXX then // 你打算处理的消息
begin
//
end
else
Result := DefWindowProc(FWinHandle, Msg, wParam, lParam);
简写代码如下:
TMyHandleWinMessage = class
private
FWinHandle: HWND;
procedure WndProc(var Msg: TMessage);
public
constructor Create;
destructor Destroy; override;
end;
Create 实现:
FWinHandle = Classes.AllocateHWnd(WndProc);
Destroy实现:
if FWinHandle <> 0 then Classes.DeallocateHWnd(FWinHandle); // 必须释放系统核心对象
WndProc实现:
在这里处理你感兴趣的消息,否则交给Windows处理。
With Msg do
if Msg = XXX then // 你打算处理的消息
begin
//
end
else
Result := DefWindowProc(FWinHandle, Msg, wParam, lParam);
相关文章推荐
- iOS 中如何除去UIAlertView 规避delegate对象销毁后接收消息的crash
- iOS框架研究 之 UIResponder 可以接收事件的对象(一)
- atl 标准控件在用多线程发消息时VC可以接收但网页无法接收的问题
- springmvc接收前台(可以是ajax)传来的数组list,map,set等集合,复杂对象集合等图文详解
- iOS中可以直接调用 某个对象的消息
- 如何让Spring MVC接收的参数可以转换为java对象
- 使用SendMessage方法对窗体上的控件进行截图,该方法的思想就是把控件的句柄拿到,对控件发送WM_PAINT消息,并且把希望得到图形对象的句柄当作wParam参数传过去,这样就可以在图形对象得到想要得图形。
- 简单演示不同对象间的消息发送和接收(广播消息中心)
- C# TCP服务端 可以接收其他语言或平台发送的TCP消息
- Android中消息机制初探(创建一个可以接收消息的子线程)
- 五.OC基础--1.多态,2.类对象,3.点语法,4.@property&@synthesize,5.动态类型,内省(判断对象是否遵循特定的协议,以及是否可以响应特定的消息)
- springmvc接收前台(可以是ajax)传来的数组list,map,set等集合,复杂对象集合等图文详解
- iOS框架研究 之 UIResponder 可以接收事件的对象(一)
- 游戏对象之间发送和接收消息
- iOS框架研究 之 UIResponder 可以接收事件的对象
- 对话框中添加控件时,CMyDialog类中并没有CButton类的对象,却可以响应鼠标消息,为什么?
- EventBus设置TAG,可以更灵活的发送和接收消息
- ZeroMQ接口函数之 :zmq_msg_more - 指出是不是还有更多的消息部分可以接收
- 程序在托盘中时可以接收Sendmessage消息
- C# TCP服务端 可以接收其他语言或平台发送的TCP消息