当前位置:首页 > java知识学习_java技术文章 > 正文

delphi classes allocatehwnd参数传递与窗口消息处理

浏览411+

一、参数传递说明

allocatehwnd是classes中一个很常用并且非常重要的一个处理函数,该函数在日常工作中的应用也是比较广泛的,但是由于其参数问题导致了该函数有一定的局限性,下图是该函数的详细定义声明:

allocatehwnd函数声明详情

通过图中我们看出该方法需要传递一个参数儿,这个参数通常必须是定义的某个类中的一个局部的或全局的方法。

函数allocatehwnd既然这样声明,那么我们必须按照其相关规定传入一个类的方法才能够编译通过和执行,但是有些情况下我们只想传入一个普通的方法又不想仅仅因为这一个方法而创建一个类,也就是说我们能不能够做到传入的这个方法是自己声明的一个方法而不需要创建一个类呢?

扩展阅读:

allocatehwnd失败

让AllocateHwnd接受一般函数地址作参数

二、allocatehwnd接收非类方法参数代码实现

带着上面这个问题,我们来一步一步分析具体怎么实现,下面我们来看一下TWndMethod这个类的方法的声明。

TWndMethod方法定义详细

通过上图中我们可以得到一个结论,就是在执行某个方法时实际上参数中是传入的是这个类的对象,然后由对象在调用该类的方法,然后进行运行和执行。

基于以上这个原理,我们可以对该函数进行重新声明,然后自己定义函数中对象的类型和消息的类型,详见下图。

自定义的函数声明详情

我们自定义声明了TMyWndProc这个类型之后,然后我们将该类型的类传入到MyAllocateHWnd这个函数中,然后在函数内部写一些代码执行allocatehwnd,详见下图:

TMyWndProc引入执行AllocateHWnd的详细代码

allocatehwnd接收非类方法参数代码

三、无需创建窗口实现与windows消息处理

不创建尺寸窗口接收windows消息

我们在日常的开发中应用delphi的时候或多或少的不可避免的都会遇到与Windows交互进行消息接收与处理的问题。

但是呢Windows的消息处理结束和发送它有自己的一套规定,Windows中自己定义了一个叫windows Handle的处理规定,接收Windows的消息必须要创建一个消息处理窗口才可以。

程序开发中你要自己创建可视化窗口这有些困难以及不太好用,因此delphi就研究出了其它的方式,classes中的AllocateHWnd刚好能够实现避免创建窗口的这样一个解决方案,它能够创建一个零尺寸的接收窗口,这样就能够不创建窗口的情况下接收windows的消息了。

扩展阅读:

让你的Delphi非窗口自定义控件接收Windows消息

Classes.AllocateHWnd创建尺寸为0的窗口

转换和处理windows消息

AllocateHWnd里面提供了一个处理消息的方法,它能够将windows的对象函数转换为可以处理的普通函数,这样AllocateHWnd就可以通过普通函数来接收windows的消息并且进行处理,代码如下:

allocatehwnd在不创建窗口的情况下接收处理windows消息详细代码