深入VCL 理解BCB的消息机制(三)

原创 2001年06月25日 02:29:00

深入VCL 理解BCB的消息机制

方法3

Written by
CKER

方法3。RH指出的来自TApplication的方法

不用我多废话,大家都知道TApplication在BCB中的重要性。在BCB的帮助中指出:TApplication、TScreen和TForm构成了所有BCB风格的win32 GUI程序的脊梁,他们控制着您程序的行为。TApplication类提供的属性和方法封装了标准Windows程序的行为。TApplication表现了在Windows操作系统中创建、运行、支持和销毁应用程序的基本原理。因此,TApplication大大简化了开发者和Windows环境之间的接口。这正是BCB的RAD特性。

TApplication封装的标准Windows行为大致包括如下几部分:
1> Windows 消息处理
2> 上下文关联的在线帮助
3> 菜单的快捷键和键盘事件处理
4> 异常处理
5> 管理由操作系统定义的程序基础部分,如:MainWindow 主窗口、 WindowClass 窗口类, 等等。

一般情况下,BCB会为每个程序自动生成一个TApplication类的实例。这部分源码可以在yourproject.cpp文件中见到(这里假定您的工程名称就叫yourproject.bpr)。

当然TApplication是不可见的,他总是在您的Form背后默默的控制着您的程序的行为。但也不是找不到蛛丝马迹。如果您新建一个程序(New Application),然后不作任何改动,编译运行的话,你会发现程序窗体的Caption是Form1,但在Windows的状态条上的Caption确写着project1的字样。这就是TApplication存在的证据。当然,这只是一种臆测,实战的方法应该打开BCB附带的WinSight来查看系统的进程。您可以清楚的看到TApplication类的存在,他的大小是0『隐藏的嘛。』,然后才是TForm1类。

好了,既然TApplication封装了消息处理的内容。我们就研究一下TApplication的实际动作吧。实际上消息到达BCB程序时,最先得到它们的就是TApplication对象。经由TApplication之后,才传递给Form的。以前的方法都是重载TForm的方法,显然要比本文所提到的方法要晚一些收到消息。对您来说,是不是希望在第一时间收到消息并处理它们呢?

要清楚的知道TApplication的处理机制还是深入VCL源码吧:

首先看一看最最普通的一段代码吧。


消息处理的具体实现不在Run方法中,很显然关键在HandleMessage方法,看看这函数名字-消息处理。只有跟进HandleMessage瞧瞧喽。
咳,这里也不是案发现场。程序先将消息交给ProcessMessage方法处理。如果没什么要处理的,就转入Application.Idle方法『程序在空闲时调用的方法』。
呼呼,再跟进ProcessMessage方法吧。
哎呀呀,终于有眉目了。ProcessMessage采用了一套标准的Windows API 函数 PeekMessage .... TranslateMessage;DispatchMessage。前一篇帖子RH
跟了几贴说
SendMessage和PostMessage最主要的区别在于发送的消息有没有通过消息队列。
原因就在这里。ProcessMessage使用了PeekMessage(Msg, 0, 0, 0, PM_REMOVE) 从消息队列中提取消息。然后先检查是不是退出消息。不是的话,检查
是否存在OnMessage方法。如果存在就转入OnMessage处理消息。最后才将消息分发出去。
这样重载Application的OnMessage方法要比前两种方法更早得到消息,可以说是最快速的方法了吧。举个例子:
现在可以简短的总结一下VCL的消息机制了。

写到这里似乎可以结束了。但如果您看过上一篇的话,一定会注意到RH的提到的Application->HookMainWindow方法。这又是怎么一回事呢?
如果您打算使用Application->OnMessage来捕获所有发送至您的应用程序的消息的话,您大概要失望了。原因已经讲过,它无法捕获使用
SendMessage直接发送给窗口的消息,因为这不通过消息队列。您也许会说我可以直接重载TApplication的WndProc方法。呵呵,不可以。因为
TApplication的WndProc方法被Borland申明为静态的,从而无法重载。显而易见,这么做的原因很可能是Borland担心其所带来的副作用。那该
如何是好呢?
查看TApplication的WndProc的pascal源码可以看到:
WndProc方法一开始先调用HookMainWindow挂钩的自定义消息处理方法,然后再调用缺省过程处理消息。这样使用HookMainWindow就可以在
WndProc中间接加入自己的消息处理方法。使用这个方法响应SendMessage发送来的消息很管用。
最后提醒一下,使用HookMainWindow挂钩之后一定要对应的调用UnhookMainWindow卸载钩子程序。给个例子:
 

这样将本文中的两种方法相结合,您就可以自如的处理到达您的应用程序的各种消息了。

版权说明:
您可以随意复制、分发、下载此文档。但未经本人同意,您不可以截取、改动本文片断,或用本文谋取任何形式的利益。

深入VCL理解BCB的消息机制2

深入VCL理解BCB的消息机制2 2012-12-25 19:54未知admin . 关键字:   重载TControl的WndProc方法   还是先谈谈VCL的继承策略。VCL中的继承链...
  • ksrsoft
  • ksrsoft
  • 2013年04月09日 15:38
  • 998

深入理解Git (三) - 微命令上篇

1 git hash-object 以前讲过Git用Hash值作为Git对象的名字,那么具体是哪个命令呢? 我们可以先修改一个文件: echo "hongchangfirst" > zhc.conf ...
  • hongchangfirst
  • hongchangfirst
  • 2015年08月12日 15:09
  • 1150

3. 深入理解递归

递归最重要的一点就是假设子问题已经解决了,现在要基于已经解决的子问题来解决当前问题。 递归之所以把问题变简单了,是因为相当于多给你了一个前提条件(尽管是假设的)。 大家都知道,...
  • DylanDong
  • DylanDong
  • 2016年11月12日 16:15
  • 688

《深入理解Android 卷III》第五章 深入理解Android输入系统

第5章 深入理解Android输入系统(节选)本章主要内容:·  研究输入事件从设备节点开始到窗口处理函数的流程·  介绍原始输入事件的读取与加工的原理·  研究事件派发机制·  讨论事件在输入系统与...
  • Innost
  • Innost
  • 2015年08月14日 13:28
  • 14367

《Inside VCL(深入核心——VCL架构剖析)》.(李维) 一

一、回到从前:1.1、多任务操作系统是如何设计和实现的? 1.1.1、系统——多个应用程序 方案1:(系统不断读取应用程序状态) 系统通过大型循环(Loop)不断坚持么一个恶用用程序是否触发了特定的事...
  • liang08114
  • liang08114
  • 2016年12月20日 21:03
  • 495

《深入理解计算机系统》笔记(三)链接知识【附图】

概述         ●该章节主要讲解的是ELF文件的结构。             ●静态库的概念         ●动态库(又叫共享库)的概念,一般用于操作系统,普通应用程序作用不大。    ...
  • hherima
  • hherima
  • 2013年05月23日 16:19
  • 3614

spring Ioc 容器深入理解<一>

IoC 概述     IOC是spring的内核,Aop、声明式事务都能功能都依赖于此功能,它涉及代码解耦,设计模式,代码优化的问题的考量。 ioc的初步理解     ioc的概...
  • wangqingqi20005
  • wangqingqi20005
  • 2016年09月08日 23:14
  • 612

深入理解Servlet

简介  Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Ser...
  • u010926964
  • u010926964
  • 2016年01月28日 15:57
  • 1874

深入理解WebView

摘要 作为Android开发者,我们都知道在手机中内置了一款高性能 webkit 内核浏览器,在 SDK 中封装为一个叫做 WebView 组件。今天就为大家讲讲Android中WebView的...
  • clx44551
  • clx44551
  • 2016年04月06日 11:44
  • 380

hibernate深入理解-点滴记录

1.什么是hibernate  方言,如何配置方言? 通常我们会在hibernate.cfg.xml文件中这样配置: org.hibernate.dialect.Oracle10gDialect ...
  • zy846771221
  • zy846771221
  • 2015年10月20日 17:14
  • 632
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入VCL 理解BCB的消息机制(三)
举报原因:
原因补充:

(最多只允许输入30个字)