TControl和TWinControl

时间:2022-04-14 07:52:41

总结:
TControl有两个作用(通用鼠标消息和文字颜色属性功能):第一是定义所有图形控件和Win控件都要用到的通用功能(比如10个鼠标按钮消息),第二是定义所有图形控件都要用到的通用功能,比如InvalidateControl,SetColor,GetText,SetText等等,数不胜数
TWinControl两个作用(管理子控件功能和调用句柄API的功能):第一是定义Windows句柄控件所要用到的通用功能(使用API真正起作用),第二是管理其图形子控件的显示,很多时候也得管理其WinControl(如果Windows没有很好的直接管理它们的话)。

TControl是图形控件,它本身没有句柄,所以不能直接使用WINAPI显示,调整位置,发消息等等,只能想办法间接取得想要的效果,但是可以直接使用一些不需要句柄的API,比如InvalidateRect。
TWinControl是含有Windows句柄的窗口,它有句柄,因此所有使用句柄的WINAPI都可以直接操作它从而取得各种效果,使得Windows窗口能够被驱动从而正常的工作。所以它顺带把它的图形子控件管理起来,让它们在自己所在的一份三分地里正常的工作(我的理解:在Delphi的世界里,此时一个WinControl就相当于扮演了整个Windows的角色,用来管理它的“子窗口”控件,即TControl和TWinControl,如果说它对WinControl的管理功能还不是那么强烈和重要,但它无疑百分百的管理起了TGraphicControl,这一点非常重要)。

--------------------------------------------------------------------------

因为这个原因,TWinControl需要定义一系列的类函数,用它们包装WINAPI,使之符合Delphi的VCL整体架构,并且还更好用TControl虽然无法直接使用WINAPI驱动工作,但VCL的作者偷梁换柱使用它的父控件句柄,并使用相同的函数名称达到了相同的效果(这就是为什么李维会提到一个VCL的缺陷——TControl.Parent必须是个TWinControl,这是因为他没有意识到是Borland在有意强迫这样做,否则难道还要处处判断这个Parent是TWinControl,很可能还要多写很多异常语句,而且需要TWinControl自己的函数的时候,还要使用RTTI判断或者强行转换一下,,那样岂不是麻烦死。李维大师的思路也没有错,那是一种纯面向对象理论的思路,但他本人毕竟没有深入参与VCL开发,跟Borland的大师们还有些距离,而以他的一己之力来解释整个VCL的架构与思路,而实际上估计Borland早就考虑到了这一点,对Windows编程和OO运用的如此如火纯青的人,怎么会连这一点都想不到?所以Delphi的实现方法往往已经就是理论的完美诠释,因为它对纯理论方案的一些缺陷做了最佳的弥补和平衡,而且我感觉处处都是这样,这点也是我觉得Delphi最了不起的地方。光把理论实现一遍谁不会啊,无非就是花点时间和繁琐一点。正如有朋友说的那样,C++以外的世界很精彩,不要一辈子沉迷于C++的世界,有空还是要多学几门语言并加以思考和比较一下,我就感觉自己从Delphi的一些思想和平衡性方案里受益匪浅。当然只沉迷于Delphi的世界里也是不行的,我的下一个目标是Golang和C#,哈哈哈)。这就是为什么TControl会经常有TWinControl的同名函数,因为相同名称的函数更好用嘛!比如SetBounds函数(我就是看到这个函数时想到这层意思的):

TControl和TWinControl