VCL -- Understanding the Message-Handling System
Understanding the Message-Handling System
http://docwiki.embarcadero.com/RADStudio/XE7/en/Understanding_the_Message-Handling_System
All VCL classes have a built-in mechanism for handling messages, called message-handling methods or message handlers.
The basic idea of message handlers is that the class receives messages of some sort and dispatches them,
calling one of a set of specified methods depending on the message received.
If no specific method exists for a particular message, there is a default handler.
The following diagram shows the message-dispatch system:
Dispatching Messages
http://docwiki.embarcadero.com/RADStudio/XE7/en/Dispatching_Messages
When an application creates a window, it registers a window procedure with the Windows kernel.
The window procedure is the routine that handles messages for the window.
Traditionally, the window procedure contains a huge case statement with entries for each message the window has to handle.
Keep in mind that "window" in this sense means just about anything on the screen:
each window, each control, and so on.
Every time you create a new type of window,
you have to create a complete window procedure.
The VCL simplifies message dispatching in several ways:
- Each component inherits a complete message-dispatching system.
- The dispatch system has default handling.
You define handlers only for messages you need to respond to specially. - You can modify small parts of the message handling and rely on inherited methods for most processing.
The greatest benefit of this message dispatch system is that you can safely send any message to any component at any time.
If the component does not have a handler defined for the message, the default handling takes care of it, usually by ignoring the message.
Tracing the flow of messages
The VCL registers a method called MainWndProc as the window procedure for each type of component in an application.
MainWndProc contains an exception-handling block, passing the message structure from Windows to a virtual method called WndProc
and handling any exceptions by calling the application class's HandleException method.
MainWndProc is a nonvirtual method that contains no special handling for any particular messages.
Customizations take place in WndProc, since each component type can override the method to suit its particular needs.
WndProc methods check for any special conditions that affect their processing so they can "trap" unwanted messages.
For example, while being dragged, components ignore keyboard events,
so the WndProc method of TWinControl passes along keyboard events only if the component is not being dragged.
Ultimately, WndProc calls Dispatch, a nonvirtual method inherited from TObject,
which determines which method to call to handle the message.
Dispatch uses the Msg field of the message structure to determine how to dispatch a particular message.
If the component defines a handler for that particular message, Dispatch calls the method.
If the component does not define a handler for that message, Dispatch calls DefaultHandler.
The WndProc Method
http://docwiki.embarcadero.com/RADStudio/XE7/en/The_WndProc_Method
WndProc is the default Windows message handling function for a given control,
and the first method that receives messages on a form.
The WndProc method can be overridden in order to implement specific message responses.
WndProc passes any unhandled messages to the Dispatch method.
VCL controls have a property called WindowProc that points to the WndProc method.
This property can be used to replace or subclass the window procedure.
Before assigning a new value to WindowProc, the original value should be stored.
After completing any specialized message handling, call the original WindowProc
to make sure the normal message processing works as expected.
Note: If you are a component writer customizing the window procedure for a descendent class, y
ou should override theWndProc method instead of replacing or subclassing it.
Note: When overriding WndProc to provide specialized responses to messages,
be sure to call the inherited WndProc method at the end,
in order to dispatch any unhandled messages.
Trapping Messages
http://docwiki.embarcadero.com/RADStudio/XE7/en/Trapping_Messages
Under some circumstances, you might want your components to ignore messages.
That is, you want to keep the component from dispatching the message to its handler.
To trap a message, you override the virtual method WndProc.
For VCL components, the WndProc method screens messages
before passing them to the Dispatch method,
which in turn determines which method gets to handle the message.
By overriding WndProc, your component gets a chance to filter out messages before dispatching them.
An override of WndProc for a control derived from TWinControl looks like this:
procedure TMyControl.WndProc(var Message: TMessage);
begin
{ tests to determine whether to continue processing } inherited WndProc(Message);
end;
The TControl component defines entire ranges of mouse messages that it filters when a user is dragging and dropping controls.
Overriding WndProc helps this in two ways:
- It can filter ranges of messages instead of having to specify handlers for each one.
- It can preclude dispatching the message at all, so the handlers are never called.
VCL -- Understanding the Message-Handling System的更多相关文章
- Android Message Handling Mechanism
转自:http://solarex.github.io/blog/2015/09/22/android-message-handling-mechanism/ Android is a message ...
- Understanding the WPF Layout System
Many people don't understand how the WPF layout system works, or how that knowledge can help them in ...
- Android Message handling (based on KK4.4)
一.几个关键概念 1.MessageQueue:是一种数据结构,见名知义,就是一个消息队列.存放消息的地方.每个线程最多仅仅能够拥有一个MessageQueue数据结构. 创建一个线程的时候,并不会自 ...
- 7.4 GRASP原则四:控制器 Controller
4.GRASP原则四:控制器 Controller What first object beyond the UI layer receives and co-ordinates (control ...
- Meandering Through the Maze of MFC Message and Command Routing MFC消息路由机制分析
Meandering Through the Maze of MFC Message and Command Routing Paul DiLascia Paul DiLascia is a free ...
- TAxThread - Inter thread message based communication - Delphi
http://www.cybletter.com/index.php?id=3 http://www.cybletter.com/index.php?id=30 Source Code http:// ...
- System IPC 与Posix IPC(semaphore信号灯)
POSIX下IPC主要包括三种: posix message queue posix semaphores posix shared memory sysytem v IPC包括: system v ...
- Exception Handling Considered Harmful
异常处理被认为存在缺陷 Do, or do not. There is no try. - Yoda, The Empire Strikes Back (George Lucas) by Jason ...
- System中记录体函数命名怪异
//1019unit System; 中发现记录体函数命名怪异//乍一看,很怪异,其实是结构体里面 的变量后面直接写 函数类型了.不像传统先定义T***Event = procedure(S ...
随机推荐
- 用vs2012的命令利用xsd文件生成对应的C#类,把xml的string类型映射到生成的类
输入命令: xsd d:\TDDOWNLOAD\atom-author-link.xsd /c /language:C# /outputdir:d:\ 含义: 将d:\TDDOWNLOAD\atom- ...
- ubuntu下 apt-get install 下载的文件存放的目录
apt-get把下载的deb包全部放在/var/cache/apt/archives下面,该目录下的文件可以删除.当然用 sudo apt-get clean 命令也可以,这个命令只会删除缓存起来的d ...
- EhCache 分布式缓存/缓存集群
开发环境: System:Windows JavaEE Server:tomcat5.0.2.8.tomcat6 JavaSDK: jdk6+ IDE:eclipse.MyEclipse 6.6 开发 ...
- [转]inux之touch命令
转自:http://www.2cto.com/os/201309/242518.html Linux学习之touch命令 Linux的touch命令一般用来更改文档或目录的日期时间,包括存取时间和 ...
- Raspberry Pi3 ~ 配置网络
Rpi3 有两个网卡 一个无线wlan 一个有线 eth0 无线的只需要在右上角的那个配置里面添加就行 有线的需要设置下静态IP.dns.等 在raspbain图形化界面里面 设置 Network P ...
- MATLAB 通过二进制读写文件
这几天在做信息隐藏方面的应用,在读写文本文件时耗费许久,故特别的上网学习一二,这里给出一常用读写,其他的都类似. 很多时候,我们都要将一个.txt以二进制方式读出来,操作后在恢复成.txt文本. ma ...
- arm tiny6410双网卡桥接问题
这几天做实验,想用arm tiny6410板子做个mesh网络节点.该板子本身自带一个lan网卡,我自己配了一个tp-link的usb无线网卡.其中wlan网卡工作在adhoc模式下,作为mesh骨干 ...
- PV3D学习笔记-导入DAE模型
网上关于PV3D导入DAE模型的例子都非常多,可惜我研究了半天,一个都没成功,或者是破面问题,或者是贴图不显示,再或者贴图乱掉了.今天晚上终于搞定,心得发上来. 制作模型的软件是SketchUp ...
- 20151007kaggle Titanic心得
Titanic是kaggle上一个练手的比赛,kaggle平台提供一部分人的特征,以及是否遇难,目的是预测另一部分人是否遇难.目前抽工作之余,断断续续弄了点,成绩为0.79426.在这个比赛过程中,接 ...
- share-jquery
html val text区别: .html()用为读取和修改元素的HTML标签 .text()用来读取或修改元素的纯文本内容 .val()用来读取或修改表单元素的value值. 这三个方法功能上的对 ...