Delphi - 窗体创建过程

 

来自大富翁.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
1、TCustomForm.Create
   在 TCustomForm.Create 中调用 TCustomForm.CreateNew;
 
2、TCustomForm.CreateNew;
   调用 FCanvas := TControlCanvas.Create;
   触发 TControlCanvas.Create;
   触发 TControlCanvas.CreateHandle;
 
3、TControlCanvas.CreateHandle;
   调用 FControl.GetDeviceContext(FWindowHandle);
   即 TWinControl.GetDeviceContext(FWindowHandle);
 
4、TWinControl.GetDeviceContext(FWindowHandle);
   调用 TWinControl.GetDC(Handle);
 
此处说明一下:
   对 TWinControl 的 Handle 属性的读取会触发 TWinControl.GetHandle;
可以察看 Property Handle; 的声明。
 
5、第四步中对 Handle 进行读取,触发下述序列:(TWinControl)
    Handle->GetHandle->HandleNeeded
 
6、TWinControl.HandleNeeded 检查 FHandle 的值:
  if FHandle = 0 then
  begin
    if Parent <> nil then Parent.HandleNeeded;
    CreateHandle; // 调用 CreateHandle;
  end;
 
7、TWinControl.CreateHandle
   调用 CreateWnd;
   if FHandle = 0 then // 此时 FHandle 仍然为零
   begin
     CreateWnd;
     ...
   end;
 
8、TWinControl.CreateWnd
   调用 CreateParams(Params);
   // 让用户有机会加入新的特征参数
   CreateParams(Params);
   with Params do
   begin
     ...
     // 标准的 API 使用,注册窗口类,CreateWindowEx ...
     if Windows.RegisterClass(WindowClass) = 0 then RaiseLastWin32Error;
     ...
     CreateWindowHandle(Params);
     ...
   end;
 
9、CreateWindowHandle(Params);
   FHandle :=  CreateWindowEx(ExStyle, WinClassName, Caption, Style,
      X, Y, Width, Height, WndParent, 0, WindowClass.hInstance, Param);
   完成真正的窗口创建,并赋予 FHandle 窗口句柄。
 
10、回到第一步
   CreateNew 之后调用 DoCreate
   try
     CreateNew(AOwner);
     ...
       if OldCreateOrder then DoCreate;
   finally
     ...
   end;
 
11、DoCreate
    调用用户的 OnCreate 事件:
    if Assigned(FOnCreate) then
    try
      FOnCreate(Self); // 调用 OnCreate;
    except
      Application.HandleException(Self);
    end;
    if fsVisible in FFormState then Visible := True;

我们OnCreate事件最后才触发的.

http://www.cnblogs.com/huangjacky/archive/2010/01/08/1642413.html

Delphi窗体研究,留个爪,以后回来研究的更多相关文章

  1. delphi 窗体透明

        TransparentColor:=true;    TransparentColorValue:=clFuchsia;    Color:= TransparentColorValue;  ...

  2. Delphi窗体创建释放过程及单元文件小结(转)

    Delphi窗体创建释放过程及单元文件小结 Delphi中的窗体,有模式窗体与非模式窗体两种.两种窗体的调用方式不同,模式窗体使用ShowModal显示,非模式窗体使用Show显示.当显示模式窗体的时 ...

  3. delphi 窗体自适应屏幕分辨率

    delphi 窗体自适应屏幕分辨率 这是个困惑我很长时间的问题,到今天终于得到解决了. 话说Delphi有个很强的窗体设计器,这一点让VC粉丝垂涎三尺而不可得.但是,Delphi里设计的窗体并没有自动 ...

  4. 解决Delphi窗体缩放の疑难杂症

    http://anony3721.blog.163.com/blog/static/511974201082235754423/ 解决Delphi窗体缩放の疑难杂症 2010-09-22 15:57: ...

  5. Delphi 窗体函数GetWindow

    Delphi 窗体函数GetWindowGetWindow是计算机的函数,该函数返回与指定窗口有特定关系(如Z序或所有者)的窗口句柄,函数原型是HWND GetWindow(HWND hWnd,UIN ...

  6. delphi 窗体的位置和高宽度-TForm:Letf、Top、Width、Height、ClientWidth、ClientHeight

    delphi 窗体的位置和高宽度-TForm:Letf.Top.Width.Height.ClientWidth.ClientHeight [窗体的高度和宽度]: [客户区的高度和宽度]: [窗体在屏 ...

  7. 绘制delphi窗体的标题栏

    绘制delphi窗体的标题栏 按照设计,Delphi窗体的“标题”属性是由Windows负责绘制,标题栏在系统菜单旁边.如果你不想改变窗体的标题属性又想在窗体的标题栏添加一些自己的内容,你需要处理一个 ...

  8. switch留个爪,之后还需要再研究下

    public class SwitchDemo { public static void main (String [] args) { for(int i = 0; i < 10; i++) ...

  9. delphi 窗体的创建和释放

    Delphi中的窗体分为模式窗体和无模式窗体.二者的区别在于,用户可以在无模式窗体和其他窗体之间切换.这样,用户就可以同时工作于一个应用程序的几个部分.Delphi中窗体的初始化有两种情况,动态创建, ...

随机推荐

  1. 2017.7.1 mysql安装与启动(已验证可以使用)

    下载地址:http://learning.happymmall.com/ 之前一直用解压版安装,启动mysql服务的时候总是失败,这次用mysql installer安装一遍,终于成功启动. 1.下载 ...

  2. linux获取后台进程的控制台数据

    linux提供了一个daemon函数,使得进程能够脱离控制台执行,实现了后台执行的效果.可是进程后台执行后,原本在终端控制台输出的数据就看不到了. 那么,如何才干找回这些数据? 这里.文章主题就环绕着 ...

  3. Tomcat、Weblogic、JBoss、GlassFish、Resin、Websphere弱口令及拿webshell方法总结 [复制链接]

    1.java应用服务器    Java应用服务器主要为应用程序提供运行环境,为组件提供服务.Java 的应用服务器很多,从功能上分为两类:JSP 服务器和 Java EE 服务器.1.1  常见的Se ...

  4. SQL语句练习手册--第三篇

    一.CASE的两种用法 1.1 等值判断->相当于switch case (1)具体用法模板: CASE expression WHEN value1 THEN returnvalue1 WHE ...

  5. STL学习笔记(第五章 STL组件)

    STL组件 若干精心勾画的组件共同合作,构筑起STL的基础.这些组件最关键的是容器.迭代器和算法. 下图演示了STL组件之间的合作 容器(Containers) 容器类别(简称容器)用来管理一组元素. ...

  6. iOS: 学习笔记, 加入一个带界面约束的控制器

    1. 创建一个空iOS应用程序(Empty Application). 2. 加入加控制器类. 改动控制器类的viewDidLoad - (void)viewDidLoad { [super view ...

  7. maven生成jar包

    改了部分cas源码,想重新生成jar包,只好试着脱离eclipse,学了一下maven打jar包的命令,记录如下: 1.首先下载maven (请注意自己的jdk版本,如果使用maven2建议使用jdk ...

  8. mysql返回记录的ROWNUM(转)

      set @rownum = 0; select (@rownum := @rownum + 1) as rownum, name, scores from user order by scores ...

  9. swift 可变參数

    func sumof(numbers:Int...)->Int{  var sum = 0;  for number in numbers{   sum+=number;  }  return ...

  10. 使用php在服务器端生成图文验证码

    图文验证码的实现原理: 1):准备些许图片将其存储在数据库,每一张图片对应一个标识字段. 2):在服务器端使用数组的形式将图片与标识字段组合起来. 3):随机给客户端返回图片,并接受用户输入的字段. ...