Delphi 消息机制学习笔记.docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

Delphi消息机制学习笔记

前言

最近几天又将李维《InsideVCl》书中关于Delphi中Windows消息机制的实现看了一遍,这是第二遍了,本来看第一遍时已经完全看懂了,但没做笔记,害得我又看了一遍,这回下定决心写一个笔记。与此同时,我在网上游荡时幸运地看到了两篇论述Delphi消息框架的文章,某些部分分析得相当深入,非常好的Delphi消息机制总结。这下一来又不想写笔记了,但后来一琢磨他们这些文章写得虽然好,但毕竟不是自己写的,要想理清消息机制这条线,非要自己动笔写一下不可,能将你认为懂的东西表述出来那才是真懂。在这里我不得不多说两句,李维的书中很多地方我认为写得并不是很好,有时某个主题虽然用了N长的篇幅去写,好像也没有上面的文章中某些部分写得透彻,例如对MakeObjectInstance这个牛X函数表述我就认为写得一点都不好,所以不要老崇拜所谓的老大,呵呵。

在文中很多地方我会写得特别简单,因为更详细地描述在李维的书中以及我参考的文章里已经写得很清楚了,为此我不会再费笔墨,

只是将整个流程串一下,并写几个有价值的范例。

正文

永远记住,无论你是用SDK还是借用VCL来创建窗口,都要遵循Windows的游戏规则,即先注册窗口类,然后再创建窗口实例,在消息循环中写实现代码。你还要知道Windows已经为了我们预注册了多个窗口类,例如“Edit”、“ComboBox”,这时候我们要做的就是直接创建这些窗口,无需注册窗口类了;在Delphi中这一切更简单了,VCL全部为你做好了,你只需简单地在设计窗体上拖动你要的控件再写实现代码就可以了,是不是很cool?

一,窗口的创建

VCL中,具有句柄(Handle)属性的真正窗口控件全部继承自TWinControl,那就从TWinControl的创建开始说起。

VCL中窗口的建立不是按照我们想象中的流程创建的,即先把所有的窗口都创建好,然后再调用,而是在需要时才创建。可能你还不能理解我这句话的意思,慢慢看。继承自TWinControl的窗口控件都会有Handle属性,当代码中需要Handle值时,通过该属性的getter调用TWinControl.HandleNeeded来获得句柄,这时如果窗体已经建立,直接返回句柄,否则先创建窗口实例,再返回句柄,因此窗口创建是在TWinControl.HandleNeeded中实现的。Borland这样做的目的我想是最大程度地来节省系统资源吧。

TWinControl.HandleNeeded中有几个重要的方法,通过他们才得以创建窗口。TWinControl.HandleNeeded调用

TWinControl.CreateHandle来获得Handle。但CreateHandle只是个包装函数,它首先调用TWinControl.CreateWnd来创建窗口,CreateWnd是一个重要的过程,它先调用TWinControl.CreateParams设置创建窗口的参数,通过这些参数调用

RegisterClassAPI注册窗口类,CreateWnd然后调用TWinControl.CreateWindowHandle,CreateWindowHandle才是真正调用CreateWindowExAPI创建窗口实例的函数。CreateHandle、CreateWnd、CreateParams、CreateWindowHandle都是虚方法,派生类可以重载这些方法以获得更多的功能,其中CreateParams被重载的几率最大。

上面提到的方法源码我建议你都要仔细看一遍,加深印象,后面我提到的方法,你也都要看看源码,受益无穷呀,我将不再提示。

至此一个窗口算是建立起来了,但是还是无法正确运行,因为它还没有消息循环。

二,消息循环的实现

消息循环的实现是整个VCL消息框架中写得最精彩的地方,因为传统的Windows回调函数是一个静态函数,而VCL中的窗体是类,调用类方法时,除了函数本身的地址,还需一个Self,在它们之间建立关联真不是一件容易的事情,需要大量的代码技巧,同时消息循环还要保证每秒钟能处理几百到几万次的消息量,因此代码更需要写得精巧。研习这部分代码可能会花比较多的时间。

我们知道注册窗体类时就要提供窗体回调函数入口地址,那么可以想象到VCL中这个过程是发生在对TWinControl.CreateWnd

的调用中,在该方法中,静态函数指针@InitWndProc被赋值给WNDCLASSEX结构中的lpfnWndProc,这是VCl窗体首次建立消息循环的地

文档评论(0)

dqy118 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体上海海滋实业有限公司
IP属地上海
统一社会信用代码/组织机构代码
91310115MA7DL1JF2N

1亿VIP精品文档

相关文档