如您所知,窗口控件(包括表单)的窗口句柄被认为是 volatile 的。也就是说,设置某些属性可能会导致控件销毁其窗口句柄,然后重新创建(有很多该技术的示例,搜索 StdCtrls
查找 RecreateWnd
)。
因此,当我需要在创建后向操作系统注册 HWND 并在销毁前取消注册它时,我应该重写相应的方法对。简要查看Controls
和Forms
给了我 3 对,都是虚拟的:
- 创建句柄/销毁句柄
- 创建窗口句柄/销毁窗口句柄
- 创建Wnd/销毁Wnd
还有更多的吗?我应该为表单覆盖哪对?哪对用于一般窗口控制?
最佳答案
覆盖CreateWnd()
和DestroyWnd()
在大多数情况下。覆盖DestroyWnd()
要进行窗口注销,请暂时保存任何与窗口相关的数据,如果 csRecreating
标志存在于ControlState
中属性,并调用继承的DestroyWnd()
(调用 DestroyWindowHandle()
)来销毁 HWND。覆盖CreateWnd()
调用继承的CreateWnd()
(调用 CreateWindowHandle()
)创建 HWND,加载和丢弃临时窗口相关数据(如果之前保存过),并进行窗口注册。
覆盖CreateWindowHandle()
和DestroyWindowHandle()
当您需要通过普通 Win32 以外的其他方式获取/释放 HWND CreateWindow/Ex()
和DestroyWindow()
来电。例如,TForm
通过发送 WM_MDICREATE
覆盖这些以创建/释放 MDI 子窗口和WM_MDIDESTROY
向其 ClientHandle
发送消息窗口。
我从来没见过CreateHandle()
和DestroyHandle()
覆盖任何有用的东西。
有关更多详细信息,请参阅此讨论:
What's the difference between CreateWnd and CreateWindowHandle?
关于delphi - 如何使窗体或窗口控件 RecreateWnd 正确感知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21011780/