如何使表单或窗口控件正确地重新识别?

时间:2014-01-09 04:47:11

标签: delphi vcl

如您所知,窗口控件(包括窗体)的窗口句柄被视为volatile。也就是说,设置一些属性可能会导致控制破坏其窗口句柄然后重新创建(有一堆该技术的示例,搜索StdCtrls RecreateWnd}。

因此,当我需要在创建后注册我的HWND与操作系统并在销毁之前取消注册时,我应该覆盖相应的方法对。简要介绍ControlsForms给了我3对,所有这些都是虚拟的:

  • CreateHandle / DestroyHandle
  • CreateWindowHandle / DestroyWindowHandle
  • CreateWnd方法/ DestroyWnd

还有对吗?我应该覆盖哪一对表格?哪一对用于一般窗口控制?

1 个答案:

答案 0 :(得分:5)

在大多数情况下覆盖CreateWnd()DestroyWnd()。覆盖DestroyWnd()进行窗口取消注册,如果csRecreating属性中存在ControlState标志,则临时保存任何与窗口相关的数据,并调用继承的DestroyWnd()(调用{ {1}})销毁HWND。覆盖DestroyWindowHandle()以调用继承的CreateWnd()(调用CreateWnd())来创建HWND,加载并丢弃以前保存的临时窗口相关数据,并进行窗口注册。

当您需要通过其他方式获取/释放HWND时,覆盖CreateWindowHandle()CreateWindowHandle(),而不是正常的Win32 DestroyWindowHandle()CreateWindow/Ex()来电。例如,DestroyWindow()会通过向TForm窗口发送WM_MDICREATEWM_MDIDESTROY消息来覆盖这些内容以创建/释放MDI子窗口。

我从未见过ClientHandleCreateHandle()覆盖任何有用的内容。

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

What's the difference between CreateWnd and CreateWindowHandle?