知识大全 Delphi的消息处理[2]

Posted 消息

篇首语:莫道桑榆晚,为霞尚满天。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Delphi的消息处理[2]相关的知识,希望对你有一定的参考价值。

Delphi的消息处理[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    消息的发送

    消息处理就是定义应用程序如何响应Windows的消息 在Delphi中每一个消息都有自己的处理过程 它必须是一个对象中的方法 且只能传递一个Tmessage或其他特殊的消息记录 方法声明后要有一个message命令 后接一个在 到 之间的常量

    前面我们提到的消息都是标准的Windows消息(WM_X) 除此之外还有VCL内部消息 通知消息和用户自定义消息

    VCL内部消息通常以 CM_ 开头 用于管理VCL内部的事物 如果改变了某个属性值或组件的其他一些特性后 需要通过内部消息将该变化通知其他组件 例如 激活输入焦点消息是向被激活的或被停用的组件发送的 用于接受或放弃输入焦点

    另外还有通知消息 一个窗口内的子控件发生了一些事情 需要通知父窗口 这是通过通知消息实现的 它只适用于标准的窗口控件 如按钮 列表框 编辑框等等 打开Message pas文件 在标准的Windows后就是通知消息的声明:

    const

  $EXTERNALSYM BN_CLICKED

      BN_CLICKED = ;

  $EXTERNALSYM BN_PAINT

      BN_PAINT = ;

  $EXTERNALSYM BN_HILITE

      BN_HILITE = ;

    以上是按钮的通知消息 分别表示用户单击了按钮 按钮应当重画 用户加亮了按钮

    用户也可以自己定义消息 给自己发送消息和编写消息处理过程 消息的常量值为WM_USER + 到$ FFF 这个范围是Windows为用户自定义消息保留的

    Delphi消息的发送有三种方法

    .Tcontrol类的Perform对象方法 可以向任何一个窗体或控件发送消息 只需要知道窗体或控件的实例 其声明如下

function Tcontrol Perform(Msg: Cardinal; Wparam Lparam: Longint): Longint

   .Windows的API函数SendMessage()和Postmessage() 其声明如下

  function SendMessage(hWnd: HWND; Msg: UINT wParam WPARAM; lParam: LPARAM) LRESULT stdcall

  function SendMessage(hWnd: HWND; Msg: UINT wParam: WPARAM; lParam LPARAM) LRESULT stdcall

  PostMessage函数将消息添加到应用程序的消息队列中去 应用程序的消息循环会从消息队列中提取登记的该消息 再发送到相应的窗口中

  SendMessage函数可以越过消息队列直接向窗口过程发送 所以当Windows需要立刻返回值时使用SendMessage 当需要不同的应用程序依次处理消息时使用PostMessage 而Perform从本质上和SendMessage相似 它们直接向窗口过程发送 SendMessage Postmessage函数只需要知道窗口的句柄就可以发送消息 所以它们可以向非Delphi窗体发送一条消息 但而Perform必须知道窗体或控件的实例

  VCL消息处理机制

  在Delphi应用程序的源代码中有语句Application Run 它的作用是启动消息循环 然后调用Application ProcessMessage 该函数会在应用程序的消息队列中查找一条消息 当在消息队列中检索到一条消息后 触发Application OnMessage事件 这样在Windows本身对消息处理之前 就会响应OnMessage事件的处理过程 它优于任何消息处理 而且只接收登记的消息 即前面所述的由PostMessage发送的消息 响应Application OnMessage事件的处理过程必须是TmessageEvent类型 其声明如下

    type TMessageEvent = procedure(var Msg: TMsg; var Handled: Boolean) of object;

  其中TMsg是Windows中定义的消息记录 我们可以这样声明

  procedure OnMyMessage(var Msg: TMsg; var Handled: Boolean);

  然后把此方法赋给Application OnMessage事件:

  Application OnMessage := OnMyMessage;

  OnMessage事件将捕获发送给应用程序的所有消息 这是一个非常繁忙的事件 因此在处理OnMessage事件的处理过程中设置断点进行消息处理是不明智的

  VCL对象用于接收消息的方法叫MainWndProc 它是定义在Twincontrol类中的静态方法 不能被重载 它不直接处理消息 当消息离开MainWndProc后 消息被传递给对象的WndProc方法 WndProc方法是在Tcontrol类中定义的一个虚拟方法 由它调用Dispatch方法 Dispatch根据传入的Message来寻找相应的处理方法 如果最后找不到 就继续向上到父类中寻找消息处理方法 一直到找到为止 如果找不到则调用Defaulthandler Defaulthandler方法对消息进行最后的处理 然后把消息传递给Windows的DefWindowProc函数或其他默认的窗口过程

cha138/Article/program/Delphi/201311/24882

相关参考

知识大全 用Delphi实现局域网内消息传递

用Delphi实现局域网内消息传递  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本程序介绍如何在局

知识大全 delphi 缓冲画图(内存画图)解决画图闪烁问题[2]

  到了mfc里面由于有了封装所有的hdc被隐藏在对象中做为隐藏参数传递(就是DC类的this啦~~)所以我们的关键话题就转变为了怎样得到想要的DC类而已这个过程其实大同小异的在消息响应的过程中WM_

知识大全 Delphi+Word=数据库+公文处理[2]

Delphi+Word=数据库+公文处理[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  让

知识大全 编程高手 DotNet异步消息处理方法

编程高手DotNet异步消息处理方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!如果想检索消息但

知识大全 C++BUILDER非可视组件的消息处理

C++BUILDER非可视组件的消息处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一个非可

知识大全 基于消息与.Net Remoting的分布式处理架构

基于消息与.NetRemoting的分布式处理架构  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 基于Delphi的异常处理技术探究

基于Delphi的异常处理技术探究  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb

知识大全 Delphi异常处理的基本原则和方法

Delphi异常处理的基本原则和方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一异常的来源  

知识大全 Delphi+Word=数据库+公文处理[1]

Delphi+Word=数据库+公文处理[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  D

知识大全 通过DELPHI小程序在WINDOWS下更好地使用DOS批处理

通过DELPHI小程序在WINDOWS下更好地使用DOS批处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来