首页 > 代码库 > VCL方法概论
VCL方法概论
VCL方法概论
1. 把Delphi对象改造成一个Windows窗口,主要是要设置Handle和回调函数。在创建一个Windows窗口后,将其句柄赋值给Delphi对象的属性,这个并不难,相当于从此以后这个Delphi控件代表了这个Windows窗口,准确的说是包含了这个Windows窗口。需要指出的是,创建Windows窗口时的许多参数,就是由Delphi对象的属性提供的,所以创建Windows窗口这个动作,只是Delphi对象的一个中间过程而已,并不是必须的。
2. 回调函数的封装比较巧妙,使之能把一个类普通函数封装成回调函数。这个类普通函数又包含了类虚函数。
3. 既然把回调函数都封装成类函数了,那么理论上只要是个类,即使是图像控件类,也可拥有回调函数,并处理消息了。
4. 图形控件类有了窗口函数以后,理论上已经可以处理消息了,但是也得收到消息才能处理啊。而Windows是不会给没有图形控件的窗口发消息的,怎么办呢,就用Windows窗口作为这些图形控件宿主,先是Windows窗口代收消息,然后使用一个十分关键的消息WM_NCHITTEST来探测产生当前消息的位置是不是落在这个Windows窗口的某个图像控件范围内,同时区分这到底是一个什么消息,知道以后就可以由这个Windows控件发给图形控件自己去执行就可以了。
正是由于WM_NCHITTEST消息,因此可以正确的区分和判断是哪个图像控件,然后就可以处理消息了。我一直在想如果没有这个消息怎么办呢,也许就没办法了。但是鼠标跑到哪里,即使什么都不点击,那系统也总的知道吧,因此有这个消息也是必然。没有这个消息,那也会提供一个函数不断提供其位置和相关信息。
5. 消息发出以后,必须要传递才能在VCL框架中正确的发挥作用,这里借助Delphi编译器的帮忙,加上了两个独特的特性,一个是inherited,可调用父类同名函数处理消息,另一个是消息索引函数,简化了消息的参数设置,消息一旦发出,可以由编译器的dispatch保证对象直接收到此消息。
6. VCL使用了三明治设计手法等等,可以做不同的执行效果和准备工作
7. VCL设计过程中,使用了Style,代表控件有没有某种能力,使用了State,代表控件当前的状态。
8. 更加独特的是,VCL定义了两个极简单的类TGraphicControl和TCustomControl,使得第三方开发控件十分容易,并且可以被自动整合进IDE,方便使用
9. 一套VCL代码可同时被程序员运行使用和IDE运行使用,只有非常少许的代码需要加上判断是否处在读取和设计状态,感觉很神奇
------------------------------------------------
如果要通过学习开发控件来理解VCL的原理,那么应该学习以下几个典型控件:
1. TLabel,简单的图像控件,继承自TGraphicControl,可输出文字,看看是如何通过其父控件部分区域失效后重绘,从而达到图形控件刷新内容的效果
2. TButton,常用按钮控件,继承自TWinControl,且使用了superclass功能包装Button,鼠标单击消息的走向很重要啊,Windows大部分功能是通过按钮提供的
3. TEdit,常用编辑控件,继承自TWinControl,且使用了superclass功能包装Edit,最简单的输入数据的地方,看看如何改变其数据
4. TPanel,一个很棒的容器,继承自TCustomControl,其效果都是自绘出来的,并非Windows标准控件,既是有句柄的容器控件,又能自成一体,还有Canvas可无限自绘,潜力无限。其中有一次无意中发现,QuickReport的主要控件居然就是继承自它的。
5. TSpeedButton,明明是图形控件,继承自TGraphicControl,可是外观上和使用的时候,都看不出与TButton的区别,非常特殊的效果,几乎以假乱真。也许所有的Windows标准控件都可以使用类似的手法来模仿和超越。
6. TSplitter,一个很棒的分割控件,继承自TGraphicControl,有我梦寐以求的分割效果,还可移动变化
7. TTimer,一个极简单好用的控件,继承自TComponent,封装了Windows系统的时钟功能,也许系统的大多数功能都可以被包括在这样的不可视控件中
还有一些第三方的漂亮控件,在此不一一列举了。
自己想开发的控件:透明TPanel,不依赖Edit的TEdit,TcxDate的全年日期。
我一定要忍住不学习FireMonkey和其它技术,而是专心学会并精通VCL,做几个通用工具软件。
------------------------------------------------
备注:Object Pascal没有一个工业标准,Delphi可以任意设计其编译器,只要它自己觉得有道理。这种编译器配合框架的结果是,VCL整体代码显得十分简洁,编译速度飞快。而不像C++,虽然表现力强,但是太理论化,而且有着一个标准套着,因此什么想要实现什么东西都是繁琐不堪,速度奇慢无比。
VCL方法概论