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

Fre*_*ing 3 delphi vcl

如您所知,窗口控件(包括表单)的窗口句柄被视为易失性.也就是说,设置一些属性可能会导致控制以破坏其窗口句柄,然后重新创建(有一堆这种技术的实例,搜索StdCtrls对RecreateWnd).

因此,当我需要在创建后注册我的HWND OS并在销毁之前取消注册它之后我应该覆盖相应的方法对.简要介绍Controls并Forms给了我3对,所有这些都是虚拟的:

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

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

Rem*_*eau 5

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

覆盖CreateWindowHandle()以及DestroyWindowHandle()何时需要通过其他方式获取/释放HWND而不是正常的Win32 CreateWindow/Ex()和DestroyWindow()调用.例如,TForm通过向其窗口发送WM_MDICREATE和WM_MDIDESTROY消息来覆盖这些以创建/释放MDI子ClientHandle窗口.

对于任何有用的东西,我都没有见过CreateHandle()和DestroyHandle()覆盖过.

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

CreateWnd和CreateWindowHandle有什么区别?