-------------------------- 分析TEdit的创建与显示过程 --------------------------
TCustomEdit = class(TWinControl) 分析TEdit的创建与显示过程(注意,它不是由TCustomControl派生而来):
TCustomEdit.Create 虽然执行inherited Create(AOwner);但除此之外只是初始化,什么都看不出来。只能研究它的父类调用了哪些虚函数,比如它覆盖了这些函数:
procedure CreateParams(var Params: TCreateParams); override;
procedure CreateWindowHandle(const Params: TCreateParams); override;
procedure CreateWnd; override;

分析:

TWinControl.CreateParams 调用 Parent.GetHandle(但是这是条件语句,不一定执行,而且创建的也是父控件的句柄,不是创建当前控件的句柄,一般情况下不是创建当前窗口的入口)
TWinControl.GetHandle 调用 HandleNeeded;
TWinControl.HandleNeeded; 调用 Parent.HandleNeeded; 和 CreateHandle; (如有还没有创建的话,所以这么多函数之间不会形成一个悖论)
TWinControl.CreateHandle; 调用 CreateWnd,并记录 SetProp,并 SetWindowPos (VCL创建窗口的真正入口,但程序员经常以CreateParams作为入口创建窗口)
TWinControl.CreateWnd(它有一个局部变量Params); 调用CreateParams,管注册,指定lpfnWndProc后调用API RegisterClass 最后调用 CreateWindowHandle(Params)和SetWindowLong

TWinControl.CreateWindowHandle 管创建,简单调用API CreateWindowEx
TWinControl.RecreateWnd; 简单调用 Perform(CM_RECREATEWND, 0, 0);

测试语句:
procedure TForm1.Button1Click(Sender: TObject);
var
t: TEdit;
begin
t:=TEdit.Create(self); // 第一个断点
t.Name:='myedit';
t.Top:=50;
t.Left:=100;
t.Parent:=self; // 第二个断点
//t.Visible:=True;
end;
并且在上面给上面一堆TWinControls的函数下断点

发现1:执行到第一个断点后,再点击执行到下一个断点,居然会跳到第二个断点,而不是TWinControls那些函数的断点,这说明在t.parent:=self之前,根本就没有创建实际句柄(只创建了TEdit实例,内部WindowHandle依然为空,Delphi只在它真正需要的时候才创建相关Windows内核对象,这一点可以通过调试的时候观察t.WindowHandle得到结论),更谈不上显示。
发现2:在一堆TWinControl.CreateXXX函数里,发现第二个断点会首先执行TWinControl.CreateHandle; 这说明这个函数才是真正的入口。

那么TWinControl.CreateHandle;是如何被执行到的呢?整个过程依次执行:
procedure TWinControl.SetParent(AParent: TWinControl); 调用 TControl.SetParent
procedure TWinControl.InsertControl(AControl: TControl);
procedure TWinControl.UpdateControlState;
procedure TWinControl.UpdateShowing; 这个函数很特殊,内有递归:

TWinControl(FWinControls[I]).UpdateShowing; // 递归
TWinControl.UpdateShowing; 在这里终于发现 if WindowHandle = 0 then CreateHandle; 而且经过若干次递归(排除已经被创建和显示的,比如界面上还有一个Button1和Label1,其中Label1不是TWinControl,这里不会管它)后会执行CreateHandle;。
CreateHandle会调用CreateWnd,但却是TCustomEdit.CreateWnd; 后者调用inherited CreateWnd; 后面还有若干次调用虚拟函数,但总的来说问题不大。以后再补充。

-------------------------- 分析TEdit的创建与显示过程 --------------------------
TCustomEdit = class(TWinControl) 分析TEdit的创建与显示过程(注意,它不是由TCustomControl派生而来):
TCustomEdit.Create 只是初始化,什么都看不出来。只能研究它的父类调用了哪些虚函数。最后发现是myEdit.parent:=Self;的时候才真正创建并显示
procedure CreateParams(var Params: TCreateParams); override;
procedure CreateWindowHandle(const Params: TCreateParams); override;
procedure CreateWnd; override;

TWinControl.CreateParams 调用 Parent.GetHandle
TWinControl.GetHandle 调用 HandleNeeded;
TWinControl.HandleNeeded; 调用 Parent.HandleNeeded; 和 CreateHandle;
TWinControl.CreateHandle; 调用 CreateWnd,并记录 SetProp,并 SetWindowPos
TWinControl.CreateWindowHandle 管创建,简单调用API CreateWindowEx

TWinControl.CreateWnd; 调用CreateParams,管注册,指定lpfnWndProc后调用API RegisterClass 比较复杂
TWinControl.RecreateWnd; 简单调用 Perform(CM_RECREATEWND, 0, 0);

TEdit的创建与显示过程的更多相关文章

  1. MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)

    属性页对话框包括向导对话框和一般属性页对话框两类,上一节讲了如何创建并显示向导对话框,本节将继续介绍一般属性页对话框的创建和显示. 实际上,一般属性页对话框的创建和显示过程和向导对话框是很类似的.将上 ...

  2. VS2010/MFC对话框:一般属性页对话框的创建及显示

    一般属性页对话框的创建及显示 本节将介绍一般属性页对话框的创建和显示. 实际上,一般属性页对话框的创建和显示过程和向导对话框是很类似的.鸡啄米将上一节中的向导对话框进行少量修改,使其成为一般属性页对话 ...

  3. VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)

    属性页对话框包括向导对话框和一般属性页对话框两类,上一节鸡啄米讲了如何创建并显示向导对话框,本节将继续介绍一般属性页对话框的创建和显示. 实际上,一般属性页对话框的创建和显示过程和向导对话框是很类似的 ...

  4. VS2010-MFC(对话框:一般属性页对话框的创建及显示)

    转自:http://www.jizhuomi.com/software/169.html 属性页对话框包括向导对话框和一般属性页对话框两类,上一节演示了如何创建并显示向导对话框,本节将继续介绍一般属性 ...

  5. ASP.NET Web API 过滤器创建、执行过程(二)

    ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...

  6. java中类的创建及初始化过程

    java中类的创建及初始化过程无外乎两种情况,其一为单类的创建及初始化,其二具有继承关系的父子类创建及初始化过程.     首先说简单的,单类的创建及初始化过程.在java中我们都知道绝大部分对象的创 ...

  7. 【转载】详解CreateProcess调用内核创建进程的过程

    原文:详解CreateProcess调用内核创建进程的过程 昨天同学接到了腾讯的电面,有一题问到了CreateProcess创建进程的具体实现过程,他答得不怎么好吧应该是, 为了以防万一,也为了深入学 ...

  8. MFC编程入门之十二(对话框:非模态对话框的创建及显示)

    上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 非模态对话框显示后,程序其他窗口仍然能正常运行,可以响应用户输入,还可以相互切换.上一讲中创建的Tip模态对话框 ...

  9. VS2010/MFC对话框:非模态对话框的创建及显示

    非模态对话框的创建及显示 上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切 ...

随机推荐

  1. 标准C程序设计七---71

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  2. unix网络编程第一章demo

    之前一直以为time_wait状态就是主动关闭的那一方产生.然后这个端口一直不可以用.实际我发现服务端监听一个端口.客户端发来连接后.传输数据后.服务端关闭客户端套接字后.用netstat -nat ...

  3. udp 多播

    先来了解下UDP UDP 是UserDatagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一 ...

  4. mysql 初始化脚本

    脚本须知: 1. 确认mysql的数据目录,二进制日志目录,中继日志的目录,安装目录的位置 2. 初始化会对前三个目录执行清空操作,不过清空前该脚本对其进行了压缩打包统一存放在/tmp目录下 3. 脚 ...

  5. AC日记——乘积最大 洛谷 P1018

    题目描述 今年是国际数学联盟确定的“2000――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得 ...

  6. HDU 5988最小网络流(浮点数)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5988 哇,以前的模版一直T,加了优先队列优化才擦边过. 建图很好建,概率乘法化成概率加法不 ...

  7. SVG动画基础篇

    参考资料: http://www.w3school.com.cn/svg/index.asp https://msdn.microsoft.com/zh-cn/library/gg193979  gi ...

  8. 手动安装windows的磁盘清理工具

    All you really need to do is copy some files that are already located on your server into specific s ...

  9. C# 获取COM对象 ProgId ClsId

    https://social.msdn.microsoft.com/Forums/vstudio/en-US/fe262fdd-a93f-427e-8771-2c64e7ac3064/getting- ...

  10. 转置卷积&&膨胀卷积

    Convolution arithmetic tutorial theano Convolution arithmetric github 如何理解深度学习中的deconvolution networ ...