`
mof51mof
  • 浏览: 19566 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Delphi7 windows 消息处理机制

 
阅读更多

Delphi7 windows 消息处理机制
2012年01月08日
  Delphi是Borland公司提供的一种全新的Windows编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpascal)语言,并有强大的数据库引擎(BDE),快速的代码编译器,同时又提供了众多出色的构件.受到广大编程人员的青睐.在众多的编程语言(如VB,PowerBuilder,PowERPoint等)中脱颖而出.  其中一个DELPHI强于其他编程语言(如VB4.0)的地方就是在DELPHI中可自定义消息,并可直接处理消息.这对于那些希望编写自己的构件(Component),或者希望截获.过滤消息的用户来说是必不可少的.因为编写构件一般要对相应的消息进行处理.下面就对Delphi中消息处理机制进行一下介绍。一.DELPHIVCL中消息的传递  Delphi中每一个VCL(VisualComponentLibrary)构件(如Tbutton,Tedit等)都有一内在的消息处理机制,其基本点就是构件类接收到某些消息并把它们发送给适当的处理方法,如果没有特定的处理方法,则调用缺省的消息处理句柄。其中mainwndproc是定义在Twincontrol类中的一个静态方法,不能被重载(Override)。它不直接处理消息,而是交由wndproc方法处理,并为wndproc方法提供一个异常处理模块。Mainwndproc方法声明如下:procedureMainWndProc(varMessage:TMessage);Wndproc是在Tcontrol类中定义的一个虚拟方法,由它调用dispatch方法来进行消息的分配,wndproc方法声明如下:procedureWndProc(varMessage:TMessage);virtual;dispatch方法是在Tobject根类中定义的,其声明如下:procedureTobject.dispatch(varMessage);传递给dispatch的消息参数必须是一个记录类型,且这个记录中第一个入点必须是一个cardinal类型的域(field),它包含了要分配的消息的消息号码.例如:typeTmessage=recordMsg:cardinal;wparam:word;lparam:longint;.result:longint;end;  而Dispatch方**根据消息号码调用构件的最后代类中处理此消息的句柄方法.如果此构件和它的祖先类中都没有对应此消息的处理句柄,Dispatch方法便会调用Defaulthandler方法.Defaulthandler方法是定义于Tobject中的虚拟方法,其声明如下:procedureDefaulthandler(varMessage);virtual;  Tobject类中的Defaulthandler方法只是实现简单的返回而不对消息进行任何的处理.我们可以通过对此虚拟方法的重载,在子类中实现对消息的缺省处理.对于VCL中的构件而言,其Defaulthandler方**启动WindowsAPI函数Defwindowproc对消息进行处理.二.DELPHI中的消息处理句柄  在DELPHI中用户可以自定义消息及消息处理句柄.消息处理句柄的定义有如下几个原则:  消息处理句柄方法必须是一个过程,且只能传递一个Tmessage型变量参数.  方法声明后要有一个messa***令,后接一个在0到32767之间的消息标号(整型常数).  消息处理句柄方法不需要用override命令来显式指明重载祖先的一个消息处理句柄,另外它一般声明在构件的protected或private区.  在消息处理句柄中一般先是用户自己对消息的处理,最后用inherited命令调用祖先类中对应此消息的处理句柄(有些情况下可能正相反).由于可能对祖先类中对此消息的处理句柄的名字和参数类型不清楚,而调用命令inherited可以避免此麻烦,同样如果祖先类中没有对应此消息的处理句柄,inherited就会自动调用Defaulthandler方法.(当然如果要屏蔽掉此消息,就不用inherited命令了)。消息处理句柄方法声明为:procedureMymsgmethod(varmessage:Tmessage);messageMsgtype;同样用户也可以定义自己的消息,用户自定义消息应从WM_USER开始.自定义消息及消息处理句柄举例如下:constmy_paint=Wm_user 1;typeTmypaint=recordmsgid:cardinal;msize:word;mcolor:longint;msgresult:longint;end;typeTmycontrol=class(TCustomControl)protectedprocedurechange(varmessage:Tmypaint);messagemy_paint;.....end;......procedureTmycontrol.change(varmessage:Tmypaint);beginsize:=message.msize;{设置Tmybutton尺寸属性}color:=message.mcolor;{设置Tmybutton颜色属性}{dosomethingelse}inherited;{交由Tcustomcontrol处理}end;三.过滤消息  过滤消息又称消息陷阱。在一定情况下,用户可能需要屏蔽某些消息.或者截获某些消息进行处理。由以上介绍可以看出过滤消息一般有三种途径:(1).重载构件继承的虚拟方法wndproc.(2).针对某消息编写消息处理句柄.(3).重载构件继承的虚拟方法Defhandler,在其中对消息进行处理。其中常用的方法是方法(2),在上节中已介绍过了,方法(1)与方法(3)相似,这里只简单介绍一下方法(1)。重载虚拟方法wndproc的一般过程如下:procedureTmyobject.wndproc(varmessage:Tmessage);begin{...判断此消息是否该处理..}inheritedwndproc(message);{未处理的消息交由父辈wndproc方法处理}end;  由此可以看出在wndproc方法中处理消息的优势是可以过滤整个范围内的消息,而不必为每个消息指定一个处理句柄,事实上Tcontrol构件中就是利用它来过滤并处理所有的鼠标消息的(从WM_mousefirst到WM_mouselast,如下代码示).同样利用它也可以阻止某些消息被发送给处理句柄。procedureTControl.WndProc(varMessage:TMessage);beginif(Message.Msg>=WM_MOUSEFIRST)and(Message.Msg消息}end;Dispatch(Message);{否则正常发送消息}end;下例为一简单的自定义构件例子:  Tmyedit类是从Tedit类派生出的一个新类,它的特点是在运行中不能获得焦点,不能由键盘输入(有点类似Tlabel构件).我们可在其wndproc方法中过滤出WM_setfocus,WM_mousemove消息并进行处理来达到上述要求,源程序如下:unitmyedit;interfaceusesWindows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls;typeTmyedit=class(TEdit)private{Privatedeclarations}protected{Protecteddeclarations}{otherfieldsandmethods}procedurewndproc(varmessage:Tmessage);override;public{Publicdeclarations}published{Publisheddeclarations}end;procedureReGISter;implementationprocedureRegister;beginRegisterComponents('Samples',[Tmyedit]);end;procedureTmyedit.wndproc(varmessage:tmessage);beginifmessage.msg=wm_mousemovethenbegincursor:=crarrow;{设置光标为crarrow,而不是缺省的crBeam光标}exit;end;ifmessage.msg=wm_SetFocusthenexit;{屏蔽掉WM_setfocus消息,不让Tmyedit控件获得输入焦点}inheritedwndproc(message);{其他消息交父辈wndproc处理}end;end.您可以将Tmyedit加到ComponentPalette中检验其性能。  由以上介绍可以看出,只有清楚了DelphiVCL中的消息处理机制,掌握好处理各种消息的方法和时机(必要时要借助各种工具,如winsight32,spy等),并结合OOP语言的特点,我们才可能编出高质量的构件。这当然要靠读者在实践中不断摸索,积累经验.
分享到:
评论

相关推荐

    Delphi Message 消息处理演示程序(源代码)

    2. 演示Windows窗体API的消息机制 3. 演示Delphi自带的对象Dispatch消息机制 4. 实现了传递记录体的消息机制 5. 演示了System.Messaging.TMessageManager的广播机制 6. 包含全部源代码,彻底理解Delphi的消息机制

    Delphi7 编程 100 实例

    ToolBar工具栏控件的使用 动态建立主菜单选项 窗口界面的动态分隔条...处理 在远程数据库中实现主从表关系 动态设置远程数据库的查询参数 在远程数据库中计算统计值 多线程与数据库 使用远程存储...

    Delphi7经典问题解析源码

    《Delphi 7经典问题解析》源代码 ============================== 第二章 ====== 变体类型 不使用VCL创建WINDOWS程序 过程类型 回调机制 句柄演示 第六章 ====== FLASHGET ...

    《Delphi7经典问题解析》源代码

    ------------------------------DWORD类型操作演示FlashGet URL智能拆分FoxMail信息自动填充INI文件处理WM_COPYDATA数据传递变体类型不使用VCL创建Windows程序递归查找文件复制所有文件到新目录过程类型回调机制句柄...

    Delphi 5 经典教程

    第1章 Delphi 5下的Windows编程 1 1.1 Delphi产品家族 1 1.2 Delphi是什么 3 1.2.1 可视化开发环境 3 1.2.2 编译器的速度和已编译代码的效 率 4 1.2.3 编程语言的功能及其复杂性 4 1.2.4 数据库结构的灵活性和可...

    DELPHI专题文档-程序应用

    Delphi自定义消息应用一例 显示密码编辑框中的密码 也谈Delphi中的日期输入 用修改文件时间的方法来加密文件 在DELPHI中处理时间 在Delphi中用拼音首字符序列来实现检索功能 用Delphi创建Internet快捷方式 用...

    DELPHI专题--程序应用

    Delphi自定义消息应用一例 显示密码编辑框中的密码 也谈Delphi中的日期输入 用修改文件时间的方法来加密文件 在DELPHI中处理时间 在Delphi中用拼音首字符序列来实现检索功能 用Delphi创建Internet快捷方式 用...

    DELPHI专题--API应用

    DELPHI中的消息处理机制 通过调用API确定MEMO控件中的当前行和列 充分利用WindowsAPI扩展Delphi函数 如何把文件删除到回收站中 在DELPHI中调用API函数 使用Delphi获取系统信息 生成非矩形窗口 程序不出现在...

    Delphi7编程100例

    ToolBar工具栏控件的使用 ... Delphi中的ini文件的读写 建立键盘鼠标动作记录与回放 实现指定目录下的文件查询 实现对系统的操作监视 系统级热键的实现 检测NumLock、Insert、CapsLock、ScrollLock键的状态

    《Delphi7编程100例》代码

    《Delphi7编程100例》代码目录:---------------------------------------------ToolBar工具栏控件的使用动态建立主菜单选项窗口界面的动态分隔条动态设置选项卡页面在标题栏中自定义按钮窗体开合窗帘效果Windows XP...

    delphi11(实际上是delphi10.5)补丁

    1、改进了对Windows和桌面的FMX高DPI支持,桌面UI明显优越 2、在WebBrowser组件中支持微软的WebView 2控件(Edge Chromium)。 3、支持最新的Android 30 API和最新的计费API,并迁移到使用AndroidX库 4、Android支持...

    《Delphi6彻底研究》光盘源码

    ----------------------------1,可视化设计的集成开发环境2,Object Pascal语言的认识3,Delphi的基本程序设计原理4,窗口程序的菜单设计5,窗口与窗口之间的关系与窗口的类型6,Delphi提供的图形及文件处理功能7,...

    Delphi5开发人员指南

    第1章 Delphi 5下的Windows编程 1 1.1 Delphi产品家族 1 1.2 Delphi是什么 3 1.2.1 可视化开发环境 3 1.2.2 编译器的速度和已编译代码的效 率 4 1.2.3 编程语言的功能及其复杂性 4 1.2.4 数据库结构的灵活性和可...

    DELPHI技巧集(集合各种开发源码)

    66 Message.htm DELPHI中的消息处理机制 9K 67 More_page_find.htm Delphi中多库关联查询 3K 68 More_t.htm DELPHI下的多线程程序设计 7K 69 Oficebar.htm 用Delphi4实现风Word97格的工具栏 2K 70 Open_bar....

    delphi7编程百例

    ToolBar工具栏控件的使用 动态建立主菜单选项 窗口界面的...处理 在远程数据库中实现主从表关系 动态设置远程数据库的查询参数 在远程数据库中计算统计值 多线程与数据库 使用远程...

    Delphi源码分析附书源码

    本书通过对Delphi内核(RTL)源代码进行分析,深入阐述了Delphi内核(RTL)的原理及其实现。全书从Nico Bendlin编写的著名最小化内核示例程序MiniDExe讲...初始(入口)代码、模块、内存、线程、资源、异常处理机制等。

    Delphi编程100例

    全部实例代码。目录如下: ...Delphi中的ini文件的读写 建立键盘鼠标动作记录与回放 实现指定目录下的文件查询 实现对系统的操作监视 系统级热键的实现 检测NumLock、Insert、CapsLock、ScrollLock键的状态

    096_《Delphi5高级编程丛书之二:GUI编程》(4/4)

    Win32和Delpni的消息机制;文件、目录和驱动器;各种类型的应用程序,包括MDI程序、控制台程序、服务程序、控制面板小程序;屏幕和打印机;图像,并介绍了一个绘图程序;多线程技术。本书内容全面,叙述简洁,例子...

Global site tag (gtag.js) - Google Analytics