- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
Delphi中正常窗口的实现
摘要在Delphi的VCL库中,为了使用以及实现的方便,应用对象Application创建了一个用来处理消息响应的隐藏窗口。而正是这个窗口,使得用 VCL开发出来的程序存在着与其他窗口不能正常排列平铺等显得有些畸形的问题。本文通过对 VCL的深入分析,给出了一个只需要对应用程序项目文件作3行代码的修改就能解决问题的方案,且不需要原有的编程方式作任何改变。
关键字 VCL,正常窗口,正常化
引言
用Delphi所提供的VCL类库编写的Windows应用程序,有一个明显不同于标准Windows窗口的特点--主窗口的系统菜单与任务栏上的系统菜单不相同。一般情况下,主窗口的系统菜单有六个菜单项而任务栏系统菜单只有三个菜单项。实际使用中我们发现用 VCL开发的程序有以下几个方面的尴尬:
不够美观。这是肯定的,与标准不符自然会显得有些畸形。
主窗口最小化时没有动画效果。
窗口不能正常与其它窗口排列平铺。
任务栏系统菜单具有最高的优先级。在存在模态窗口的情况下整个程序仍然可以被最小化,与模态窗口的设计相违背。
主窗口最小化动画效果的问题在Delphi5.0以后的版本中已通过Forms.pas中的ShowWinNoAnimate函数解决,但其余几个问题则一直存在。尽管多数情况下这不会对应用程序带来什么影响,但在一些追求专业效果的场合确实不可接受的。由于C++Builder与Delphi使用的是同一套类库,所以上述问题同样存在于使用 C++Builder编写的Windows应用程序中。
在以前的文章里(阿甘的家中可以找到),我已讨论过这个问题,当时的叙述看起来基本上是一种取巧的方法,而我也是在偶然之中才找到那个方法的。本文的任务就是通过对 VCL类库作一些分析,说明那样做的原理,其次再给出一个只用 3行代码的方法,完完全全地解决Delphi中这个非正常窗口的问题。
原理
应用程序的创建过程
下面是一个典型的应用程序的Delphi工程文件,我们注意到一开始就有一个对Application
对象的Initialize方法的引用,我们的分析也就从这里开始:
program
programProject1;
uses
uses
Forms,
Forms,
Unit1
Unit1inUnit1.pas{Form1};
{$R*.res}
{$R*.res}
begin
begin
Application.Initialize;
Application.Initialize;
Application.CreateForm(TForm1,Form1);
Application.CreateForm(TForm1,Form1);
Application.Run;
Application.Run;
end
end.
隐藏的窗口是由Application对象创建的,那么Application对象又从何而来呢?在Delphi的代码编辑窗口中按住Ctrl点击Application就会发现,Application对象是在Forms.pas单元中定义的几个全局对象之一。这还不够,我们想要知道的是Application对象是在什么地方创建的,因为必须成功创建了TApplication类的实例我们才能引用它。
想一下,有什么代码会在Application.Initialize之前执行呢?对了,是initialization代码段中的代码。认真调试过VCL源码就可以知道,VCL中很多单元都有initialization代码段,启动Delphi程序时,先是按照uses的顺序执行每个单元中initialization代码段的代码,完成所有的初始化动作之后才执行 Application的Initialize方法以初始化Application,所以很显然,Application对象是在某个单元的initialization代码段中创建的。
以TApplication.Create为关键字在VCL源码目录中搜索一番,我们果然在Controls.pas单元中找到了创建Application对象的代码。在Controls.pas单元的initialization代码段,有一句对InitControls过程的调用,而InitControls的实现则如下所示:
Unit
UnitControls;
…
…
initialization
initialization
...
InitControls;
InitControls;
procedure
proc
文档评论(0)