VCL设计方法概论

1. 把Delphi对象改造成一个Windows窗口,主要是要设置Handle和回调函数。在创建一个Windows窗口后,将其句柄赋值给Delphi对象的属性,这个并不难,相当于从此以后这个Delphi控件(或称内存对象)代表了这个Windows窗口,准确的说是包含了这个Windows窗口。需要指出的是,创建Windows窗口时的许多参数,就是由Delphi对象的属性提供的,所以创建Windows窗口这个动作,只是Delphi对象的一个中间过程而已,并不是必须的。
2. 回调函数的封装比较巧妙,使之能把一个类普通函数封装成回调函数(通过TWinControl.Create里调用MakeObjectInstance函数)。这个类普通函数又包含了类的虚函数,从而达到高度的灵活性。另外,只有从TWinControl开始才有DefWndProc属性。
3. 既然把回调函数都封装成类函数了,那么理论上只要是个类,即使是图像控件类,也可拥有回调函数,并处理消息了。此时的“回调函数”(WndProc)不需要句柄,因此使用VCL体系内部的Perform方法就可以发送消息,一般不用于直接处理Windows消息(因为没有句柄)。另外Delphi语言还有内置的Dispatch方法,也可用来发送消息,对图形控件发消息更是不在话下。
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,可输出文字,看看是如何通过其父控件部分区域失效后重绘,从而达到图形控件刷新内容的效果。特别注意Transparent属性,比较有意思
2. TButton,常用按钮控件,继承自TWinControl,且使用了superclass方法包装和扩展了Button的功能,鼠标单击消息的走向很重要啊,Windows大部分功能是通过按钮提供的
3. TEdit,常用编辑控件,继承自TWinControl,且使用了superclass方法包装和扩展了Edit的功能,最简单的输入数据的地方,看看如何改变其数据
4. TPanel,一个很棒的容器,继承自TCustomControl,其效果都是自绘出来的,并非Windows标准控件,是一个有句柄的容器控件,自成一体,还有Canvas可无限自绘,潜力无限,其作用几乎等同于TForm,但是比TForm更通用。其中有一次无意中发现,QuickReport的主要控件居然就是继承自它的。
5. TSpeedButton,明明是图形控件,继承自TGraphicControl,可是外观上和使用的时候,都看不出与TButton的区别,非常特殊的效果,几乎以假乱真。也许所有的Windows标准控件都可以使用类似的手法来模仿和超越。
6. TSplitter,一个很棒的分割控件,继承自TGraphicControl,有我梦寐以求的分割效果,还可移动变化
7. TTimer,一个极简单好用的控件,继承自TComponent,封装了Windows系统的时钟功能,也许系统的大多数功能都可以被包括在这样的不可视控件中

8. TShape,超级简单,也比较实用
9. TPaintBox,还可无限作画
10. TForm,十分特殊的窗口控件,自带Canvas,本质上是一个自绘控件,所有Windows窗口的显示与绘图功能,都可以在这里实现。并且它还具有强大的控件管理功能,非常值得研究。

还有一些第三方的漂亮控件,比如Raize,Berg等等,在此不一一列举了。

自己想开发的控件:透明TPanel,不依赖Edit的TEdit,TcxDate的全年日期。

我一定要忍住不学习FireMonkey和其它技术,而是专心学会并精通VCL,做几个通用工具软件。

------------------------------------------------
备注:Object Pascal没有一个工业标准,Delphi可以任意设计其编译器,只要它自己觉得有道理。这种编译器配合框架的结果是,VCL整体代码显得十分简洁,编译速度飞快。而不像C++,虽然表现力强,但是太理论化,而且有着一个标准套着,因此什么想要实现什么东西都是繁琐不堪,速度奇慢无比。

VCL设计方法概论(自己总结了9条),以及10个值得研究的控件 good的更多相关文章

  1. vcl控件经常使用属性和方法

    TTabControl属性 DisplayRect:仅仅定该控件客户区的一个矩形 HotTrack:设置当鼠标经过页标签时,它的字是否有变化.假设为True,是字会变成蓝色Images:为每一个页标签 ...

  2. winFrom 常用控件属性及方法介绍

    目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox(文本框)控件 4.RichTextBox控件 5.NumericUpDown控件 6.Button(按钮)控件 7.Gro ...

  3. C#控件及常用设计整

    C#控件及常用设计整 1.窗体    1 2.Label 控件    3 3.TextBox 控件    4 4.RichTextBox控件    5 5.NumericUpDown 控件    7 ...

  4. 设计一个 iOS 控件

    转载自:http://blog.csdn.net/zhangao0086/article/details/45622875 代码的等级:可编译.可运行.可测试.可读.可维护.可复用 前言 一个控件从外 ...

  5. C#控件及常用设计整理

    1.窗体  1.常用属性  (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体.  (2) WindowState属性:  用来获取或设置窗体的窗口状态. 取值有三 ...

  6. C# 常用控件属性及方法介绍

      C#常用控件属性及方法介绍                                               目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox ...

  7. C#控件方法及属性大全,望补充

    C#控件及常用设计整理 1.窗体 常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体. (2) WindowState属性: 用来获取或设置窗体的窗口状态 ...

  8. C#常用控件的属性以及方法(转载)

    -----以前看别人的,保存了下来,但是忘了源处,望见谅. C#常用控件属性及方法介绍 目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox(文本框)控件 4.RichText ...

  9. wpf控件设计时支持(3)

    原文:wpf控件设计时支持(3) wpf设计时调试 编辑模型 装饰器 1.wpf设计时调试 为了更好的了解wpf设计时框架,那么调试则非常重要,通过以下配置可以调试控件的设计时代码 (1)将启动项目配 ...

随机推荐

  1. Linux 系统Telnet服务

    Linux 系统Telnet服务 telnet与ssh相比,安全性能并不高,但是在ssh版本升级或者其他的情况下还是需要开启这一项服务.linux提供服务是由运行在后台的守护进程daemon来执行的, ...

  2. 读《JavaScript语言精粹》的一些感言

    最近看了<JavaScript语言精粹>,并且连着看了两遍,如果非要用言语形容的话,那我只能用4个字来形容:相见恨晚.其中的一些经验经过这么多年的摸索其实也了然,但是作者用这么浅薄的书把有 ...

  3. struts2标签详解

    struts2标签讲解 要使用Struts2的标签,只需要在JSP页面添加如下一行定义即可:<%@ taglib prefix="s" uri="/struts-t ...

  4. C# 或 JQuery导出Excel

    首先要添加NPOI.dll文件 然后添加类:NPOIHelper.cs using System; using System.Data; using System.Configuration; usi ...

  5. 【Minimum Depth of Binary Tree】cpp

    题目: Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the ...

  6. 【String to Integer (atoi) 】cpp

    题目: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input ca ...

  7. Ext.Ajax中scope的作用

    在Ext的前台Js中使用Ajax请求,如果想让回调函数中的this作用域跟当前的类一样如何实现呢?Ajax提供了一个参数scope. 详细代码如下: layout : { type : 'accord ...

  8. NYOJ-85 有趣的数 AC 分类: NYOJ 2014-01-17 21:42 240人阅读 评论(0) 收藏

    这道题目就是,找规律,小学奥数,找规律不难吧, #include<stdio.h> int sc(int x); int main(){ int n=0; int num,cs,k; sc ...

  9. rivers ioi2005 树形dp

    说句实话,写完这道题,很想吐一口血出来,以示我心情的糟糕: 题目很简单,树形dp,正常做30分钟,硬是做了好几个小时,真是伤心. 题解不写了,只是吐个槽,网上没有用背包写的dp,全是左儿子右兄弟写法, ...

  10. 【bzoj1085】[SCOI2005]骑士精神

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1757  Solved: 961[Submit][Statu ...