zoukankan      html  css  js  c++  java
  • Delphi 窗体创建过程

    来自大富翁.

    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事件最后才触发的.

  • 相关阅读:
    BETA 版冲刺前准备
    alpha事后诸葛亮
    alpha冲刺10
    alpha冲刺9
    alpha冲刺8
    alpha冲刺7
    alpha冲刺6
    alpha冲刺5
    第十一次作业
    Alpha冲刺一 (10/10)
  • 原文地址:https://www.cnblogs.com/huangjacky/p/1642413.html
Copyright © 2011-2022 走看看