Delphi 如何使窗体或窗口控件正确地重新创建?

Delphi 如何使窗体或窗口控件正确地重新创建?,delphi,vcl,Delphi,Vcl,正如您所知,窗口控件(包括窗体)的窗口句柄被认为是不稳定的。也就是说,设置某些属性可能会导致控件破坏其窗口句柄,然后重新创建(有许多这种技术的示例,搜索StdCtrls以查找recreatWnd) 所以,当我需要在创建之后向操作系统注册HWND,并在销毁之前注销它时,我应该重写相应的方法对。简要查看控件和表单给了我3对,都是虚拟的: CreateHandle/DestroyHandle CreateWindowHandle/DestroyWindowHandle CreateWnd/destr

正如您所知,窗口控件(包括窗体)的窗口句柄被认为是不稳定的。也就是说,设置某些属性可能会导致控件破坏其窗口句柄,然后重新创建(有许多这种技术的示例,搜索
StdCtrls
以查找
recreatWnd

所以,当我需要在创建之后向操作系统注册HWND,并在销毁之前注销它时,我应该重写相应的方法对。简要查看
控件
表单
给了我3对,都是虚拟的:

  • CreateHandle/DestroyHandle
  • CreateWindowHandle/DestroyWindowHandle
  • CreateWnd/destrownd
还有几双吗?我应该为表单覆盖哪一对?一般窗口控件的哪一对?

在大多数情况下覆盖
CreateWnd()
destrownd()
。重写
DestroyWnd()
ControlState
属性中存在
csRecreating
标志,则要执行窗口注销,请临时保存任何依赖于窗口的数据,并调用继承的
DestroyWnd()
(调用
DestroyWindowHandle()
)来销毁HWND。重写
CreateWnd()
以调用继承的
CreateWnd()
(调用
CreateWindowHandle()
)以创建HWND,加载和丢弃临时依赖于窗口的数据(如果以前保存过),并进行窗口注册

当您需要通过普通Win32
CreateWindow/Ex()
DestroyWindowHandle()
调用以外的其他方式获取/释放HWND时,请重写
CreateWindowHandle()
DestroyWindow()
。例如,
TForm
通过向其
ClientHandle
窗口发送
WM\u MDI创建
WM\u MDI销毁
消息来覆盖这些子窗口以创建/释放MDI子窗口

我从未见过
CreateHandle()
DestroyHandle()
被任何有用的内容覆盖

有关更多详细信息,请参阅此讨论: