DELPHI 的消息传送机制(200分)

  • 主题发起人 主题发起人 LINCUNTAI
  • 开始时间 开始时间
L

LINCUNTAI

Unregistered / Unconfirmed
GUEST, unregistred user!
在DELPHI中,WINDOWS 消息是怎么传递的呢?

比如:单击一下按钮,WINDOWS 发送 WM_LBUTTONDOWN,WM_LBUTTONUP 等消息,但最终是怎么传递到
BUTTON控件的ONCLICK事件(即CLICK方法)的呢?
; 帮助上说,消息传递顺序是
; MAINWNDPROC->WNDPROC->DISPATCH->HANDLER 是什么意思?
; 回答时最好将事件处理的顺序(即处理事件的各方法流水线)简单写一下,本人理解能力较差,不怕写的详细.
 
好吧。详细就详细。
Delphi有一个缺省的寄存器过程在Application向系统注册WindowClass时使用的过程。这个过程
就是MainWndProc。当然这个过程不是由用户直接调用的,而是Application的消息处理模块
WndProc所用的过程。有些消息不一定是窗口消息,如网络、打印等等方面的消息。就是说首先获
得这些消息来处理的就是这个过程。TApplication的WndProc不是虚方法,当然就不能重载了。
Application获得这些消息后交给它的MainForm来处理。MainForm是TForm类型,
当然也就是TWinControl类型了。事实上除了TApplication外只有TWinControl可以捕获并处理
消息的。其它TControl处理消息都是通过TApplication或某个TForm来实现的。
TWinControl有三种方式处理消息。一个是通过一个叫WndProc的虚方法,如果重载这个方法的话
就能处理消息了。不过这很危险。如果你不在最后调用父类的WndProc的话恐怕消息就无从向下传
递了。不过似乎没有必要从这里来处理。第二种是TWinControl还有一个叫DefaultHandler的虚
方法,也可以处理消息。这个方法其实是由WndProc调用的。一般情况下似乎也不用去继承它。
再就是默认的消息处理方法,就是在TWinControl的Private部分添加消息句柄。也就是
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
之类的处理方法。这些方法自然是由DefaultHandler来调用的。

有几个单元与这些过程相关,应该好好研究并领会:
Controls:
; TWinControl
Forms:
; TApplication
; TForm
Classes:
; TComponent
Messages:
; 每个消息的格式
 
TO:BARTON;
; ; 说个具体的应用吧,比如我的窗口中有另存为按钮,点击按钮弹出另存为对话框,输入文件
名,按保存按钮,结束。如果我想改用消息来处理,使保存对话框不弹出,并且直接保存到
给定的文件名中,
; ; 上述过程如果用消息处理,我是这样理解的,在单元文件中定义一个消息处理过程,由
主窗口捕捉对话框弹出的消息,判断,如果是保存对话框,则,使对话框隐藏,并对对话框
的文件名输入框赋值,再发送一个模拟确定按钮被按下的消息,结束。
; ; 不知道我的理解是否是否正确,DELPHI关于这方面的知识介绍的太少了,如果我理解的
正确的话,那么上述过程具体又如何实现呢,代码如何写,单元文件的每个部分应该增加什
么东西,如果有可能的话,能贴出一些具体的代码出来吗,多谢了,我会给你加分的
 
大家都来讨论呀!!
 
设个断点,再看看 CallStack 就知道调用顺序和事件触发的路径了。
 
多人接受答案了。
 
后退
顶部