如您所知,窗口控件(包括窗体)的窗口句柄被视为volatile。也就是说,设置一些属性可能会导致控制破坏其窗口句柄然后重新创建(有一堆该技术的示例,搜索StdCtrls
RecreateWnd
}。
因此,当我需要在创建后注册我的HWND与操作系统并在销毁之前取消注册时,我应该覆盖相应的方法对。简要介绍Controls
和Forms
给了我3对,所有这些都是虚拟的:
还有对吗?我应该覆盖哪一对表格?哪一对用于一般窗口控制?
答案 0 :(得分:5)
在大多数情况下覆盖CreateWnd()
和DestroyWnd()
。覆盖DestroyWnd()
进行窗口取消注册,如果csRecreating
属性中存在ControlState
标志,则临时保存任何与窗口相关的数据,并调用继承的DestroyWnd()
(调用{ {1}})销毁HWND。覆盖DestroyWindowHandle()
以调用继承的CreateWnd()
(调用CreateWnd()
)来创建HWND,加载并丢弃以前保存的临时窗口相关数据,并进行窗口注册。
当您需要通过其他方式获取/释放HWND时,覆盖CreateWindowHandle()
和CreateWindowHandle()
,而不是正常的Win32 DestroyWindowHandle()
和CreateWindow/Ex()
来电。例如,DestroyWindow()
会通过向TForm
窗口发送WM_MDICREATE
和WM_MDIDESTROY
消息来覆盖这些内容以创建/释放MDI子窗口。
我从未见过ClientHandle
和CreateHandle()
覆盖任何有用的内容。
有关详细信息,请参阅此讨论:
What's the difference between CreateWnd and CreateWindowHandle?