博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DIY自己的AllocateHWnd函数
阅读量:4671 次
发布时间:2019-06-09

本文共 1159 字,大约阅读时间需要 3 分钟。

Classes单元的AllocateHWnd函数是需要传入一个处理消息的类的方法的作为参数的,原型:

function 
AllocateHWnd(Method: TWndMethod): HWND;
 
很多时候,我们想要创建一个窗口,而又不想因为这个参数而创建一个类,怎么办?
换句话说,就是能不能使传入的参数是个普通的函数而不是类的方法呢?答案是肯定的!
看看TWndMethod的声明:
 

type

TWndMethod = procedure(var Message: TMessage) of object;

 

实际上类的方法在执行时,总是传入了对象这个参数。

即此方法共传了两个参数,根据Delphi默认的registry调用约定,寄存器eax传递对象,edx传递Message结构变量。
因此我们可以声明处理消息的函数的类型:

 

type

TMyWndProc = procedure(AObject: TObject; var Message: TMessage);

 

我们自定义MyAllocateHWnd函数以接收这个类型的参数,内部调用AllocateHWnd:

function MyAllocateHWnd(Proc: TMyWndProc): HWND;asm  push 0//AObject  push Proc//Message  call AllocateHWndend;

 

ps:如果直接调用AllocateHwnd(Proc)是不能通过编译的!

//调用示例:

var H: HWND;procedure MyWndProc(AObject: TObject; var Message: TMessage);beginif Message.Msg = WM_USER + 111 thenShowMessage('')elseMessage.Result := DefWindowProc(H, Message.Msg, Message.WParam, Message.LParam)end;procedure TForm1.FormCreate(Sender: TObject);beginH := MyAllocateHWnd(MyWndProc)end;procedure TForm1.FormDestroy(Sender: TObject);beginDeallocateHWnd(H);end;procedure TForm1.Button1Click(Sender: TObject);beginSendMessage(H, WM_USER + 111, 0, 0)end;

转载于:https://www.cnblogs.com/MaxWoods/p/3886796.html

你可能感兴趣的文章
cacti监控服务器
查看>>
PostMan设置
查看>>
C#判断访问入口是移动端还是PC
查看>>
IAT Hook
查看>>
cookie 保存导航菜单的展开状态
查看>>
我的公众号
查看>>
struts2 spring mybatis 整合(test)
查看>>
需求分析
查看>>
bzoj3456:城市规划
查看>>
算法—二叉查找树的相关一些操作及总结
查看>>
修改看板视图默认显示个数
查看>>
圆筒绘画
查看>>
在变薄变厚的周而复始中前进的信息
查看>>
Professional C# 6 and .NET Core 1.0 - Chapter 43 WebHooks and SignalR
查看>>
响应式网站与自适应网站比较
查看>>
hexo博客出现“Cannot GET/xxxx”的错误
查看>>
sql
查看>>
Android初学第55天
查看>>
css元素样式确定
查看>>
JPA EntityManager详解
查看>>