VCL设计方法概论(自己总结了9条),以及10个值得研究的控件 good
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的更多相关文章
- vcl控件经常使用属性和方法
TTabControl属性 DisplayRect:仅仅定该控件客户区的一个矩形 HotTrack:设置当鼠标经过页标签时,它的字是否有变化.假设为True,是字会变成蓝色Images:为每一个页标签 ...
- winFrom 常用控件属性及方法介绍
目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox(文本框)控件 4.RichTextBox控件 5.NumericUpDown控件 6.Button(按钮)控件 7.Gro ...
- C#控件及常用设计整
C#控件及常用设计整 1.窗体 1 2.Label 控件 3 3.TextBox 控件 4 4.RichTextBox控件 5 5.NumericUpDown 控件 7 ...
- 设计一个 iOS 控件
转载自:http://blog.csdn.net/zhangao0086/article/details/45622875 代码的等级:可编译.可运行.可测试.可读.可维护.可复用 前言 一个控件从外 ...
- C#控件及常用设计整理
1.窗体 1.常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体. (2) WindowState属性: 用来获取或设置窗体的窗口状态. 取值有三 ...
- C# 常用控件属性及方法介绍
C#常用控件属性及方法介绍 目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox ...
- C#控件方法及属性大全,望补充
C#控件及常用设计整理 1.窗体 常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体. (2) WindowState属性: 用来获取或设置窗体的窗口状态 ...
- C#常用控件的属性以及方法(转载)
-----以前看别人的,保存了下来,但是忘了源处,望见谅. C#常用控件属性及方法介绍 目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox(文本框)控件 4.RichText ...
- wpf控件设计时支持(3)
原文:wpf控件设计时支持(3) wpf设计时调试 编辑模型 装饰器 1.wpf设计时调试 为了更好的了解wpf设计时框架,那么调试则非常重要,通过以下配置可以调试控件的设计时代码 (1)将启动项目配 ...
随机推荐
- 初探Xamarin
Xamarin是一个基于mono的商业项目,收费,而且贼贵.官网地址是:http://xamarin.com/ 就我个人理解,收费的Xamarin提供一个for visual studio 2010/ ...
- iOS 进阶 第十四天(0416)
0416 注意调用关系,如下图: 就是initWithCoder:.initWithFrame.setup方法三元组
- Spark系列—02 Spark程序牛刀小试
一.执行第一个Spark程序 1.执行程序 我们执行一下Spark自带的一个例子,利用蒙特·卡罗算法求PI: 启动Spark集群后,可以在集群的任何一台机器上执行一下命令: /home/spark/s ...
- 华为HG8240光猫-破解-联通-2016-telnet-http
序 我与大家想法基本一致,拿到联通的光猫后,心想它应该是个路由器吧,如果让它自己拨号上网就好了,即省一台路由器,又省电了.抱着这个想法,在2013年里,我搜罗了不少文章,经过Q群,搜索,询问,阅读,理 ...
- 如何让Asp.net Web Api全局预防Xss攻击
一.概述 二.什么是XSS 三.预防方法 四.在WebApi中如何实现 在实现之前,需要了解ASP.NET WEB API的pipeline机制. 如上,可以采用多种方式进行参数的过滤 1.重写Del ...
- 利用checkbox的到值,并且存到数据库修改的话要显示之前选择的
在前台当然是利用checkbox来得到复选框的语言:{% for language in languages%}<input type="checkbox" name=&qu ...
- 设计模式之组合模式(Composite)
组合模式原理:组合模式的作用是讲继承同一父类的不同子类对象组合起来,形成一个树形的结构,例如公司的部门组织 代码如下 #include <iostream> #include <st ...
- BZOJ2457 BeiJing2011 双端队列
[问题描述] Sherry现在碰到了一个棘手的问题,有N个整数需要排序. Sherry手头能用的工具就是若干个双端队列. 她需要依次处理这N个数,对于每个数,Sherry能做以下两件事 ...
- C语言预处理命令
1.#error Directive (C/C++) The #error directive emits a user-specified error message at compile time ...
- 利用 NGINX 最大化 Python 性能,第一部分:Web 服务和缓存
[编者按]本文主要介绍 nginx 的主要功能以及如何通过 NGINX 优化 Python 应用性能.本文系国内 ITOM 管理平台 OneAPM 编译呈现. Python 的著名之处在于使用简单方便 ...