Delphi窗体研究,留个爪,以后回来研究
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->HandleNeeded6、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

浙公网安备 33010602011771号