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,加载和丢弃临时依赖于窗口的数据(如果以前保存过),并进行窗口注册
当您需要通过普通Win32CreateWindow/Ex()
和DestroyWindowHandle()
调用以外的其他方式获取/释放HWND时,请重写CreateWindowHandle()
和DestroyWindow()
。例如,TForm
通过向其ClientHandle
窗口发送WM\u MDI创建
和WM\u MDI销毁
消息来覆盖这些子窗口以创建/释放MDI子窗口
我从未见过CreateHandle()
和DestroyHandle()
被任何有用的内容覆盖
有关更多详细信息,请参阅此讨论: