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)将启动项目配 ...
随机推荐
- Protocol-SPI协议
说明.文章摘自:SPI协议及其工作原理浅析 http://bbs.chinaunix.net/thread-1916003-1-1.html 一.概述. SPI,Serial Peripheral I ...
- Teamwork-Week2真对必应词典和有道词典的软件分析和用户需求调查(桌面版)
经调查,现在有道词典在该领域拥有很大程度的市场占有率,所以我们将有道词典与必应词典进行对比. 核心功能一:单词本 有道词典中的单词本都只能是由用户手动添加不会的单词,而必应词典中的单词 不仅可以被自己 ...
- 常见的百度蜘蛛IP
根据不同的IP我们可以分析网站是个怎样的状态, 以下常见的百度蜘蛛IP: 123.125.68.*这个蜘蛛经常来,别的来的少,表示网站可能要进入沙盒了,或被者降权. 220.181.68.*每天这个I ...
- Python中的高阶函数与匿名函数
Python中的高阶函数与匿名函数 高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) p ...
- SQL Server性能优化(5)表设计时的注意事项
一. 是否需要冗余列 现在一些项目的数据库设计中,为了提高查询速度,把基本表的一些列也放到了数据表里,导致数据冗余.例如在热表的数据库里,原始数据表Measure_Heat里加了如房间号,单元号,楼号 ...
- jQuery的弹出窗口插件colorbox
官方网站:http://colorpowered.com/colorbox/ 支持 照片,照片组,幻灯片,ajax,内联 和 iframe 框架. 通过CSS 控制外观,使用用户可以很容易重新定制外观 ...
- Swift-6-函数
// Playground - noun: a place where people can play import UIKit // 定义和调用函数 func sayHello(personName ...
- uiview 单边圆角或者单边框
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(120, 10, 80, 80)]; view2.backgroundColor = ...
- CSS3:线上编辑工具及实用资料整理
an I Use 个人最常用的,资料比较全,桌面和移动浏览器支持HTML5,CSS3,SVG和兼容性表. 官网地址:http://caniuse.com/ CSS3 Click Chart CSS3 ...
- kerberos+ladp+hadoop-ha 安全认证部署配置
随着hadoop集群里的数据量越来越大,各业务数据都集中了里面,自然要为各业务都要提供数据支持,又希望各业务数据是相对独立安全的,这最时候就需要做安全认证了 hadoop ha 测试集群部署规划 ha ...