-------------------------- TControl主要用来管理以下消息 --------------------------
鼠标消息
显示隐藏刷新
控件状态 ControlState/ControlStyle (待续,需要详细分析)
位置标题移动 Touch/Hint/Help/Drag/Action/WindowText/AutoSize/Dock,
颜色字体可见对齐 Color/Font/Visible/ScreenToClient/BringToFront/Bounds/Alignment/Anchors/BiDiMode/ClientRect
事件 OnClick/OnMouseDown/OnResize
procedure WndProc(var Message: TMessage); virtual; 处理鼠标消息
function DesignWndProc(var Message: TMessage): Boolean; dynamic;
procedure DefaultHandler(var Message); override; 只处理WM_GETTEXT消息
function Perform(Msg: Cardinal; WParam: WPARAM; LParam: PChar): LRESULT; overload;
最重要属性(内部):待续
最重要属性(外部):待续
原因是以上属性/事件/方法,都是可以被所有可视控件所通用,不管有没有句柄。
而不可视控件完全不需要这些消息,也就是TComponent不需要载入这些消息,所以TControl提出来单独作为VCL的一层,而且是重要的一层。Delphi的Windows编程从这里开始!所以WndProc也在这里才首次出现。尽管TObject有Dispatch和DefaultHandler可以给所有的子类发消息,但其实用处不大,也许只是为了扩展性强,到底哪里真的需要这两个函数有待考察。另外,TControl之所以成为单独一层,除了从这层开始处理消息(对上负责,上级不需要处理消息),同时也把TWinControl和TGraphicControl的公共属性都提取出来了(对下负责,否则这么多事件和属性难道写两遍),而且可能有那么点跨平台的意思,毕竟到这层位置,没有有平台深刻相关(没有出现句柄,没有强烈依赖的WinAPI,只有鼠标颜色对齐拖动什么的,即使用到了API也容易轻易改写,因为各个平台都有这些东西)。有空考察一下Kylix的TControl做什么就都知道了。可惜FireMonkey没有用到TControl,处理消息完全是通过模拟。