delphi - 如何使窗体或窗口控件 RecreateWnd 正确感知?

标签 delphi vcl

如您所知,窗口控件(包括表单)的窗口句柄被认为是 volatile 的。也就是说,设置某些属性可能会导致控件销毁其窗口句柄,然后重新创建(有很多该技术的示例,搜索 StdCtrls 查找 RecreateWnd )。

因此,当我需要在创建后向操作系统注册 HWND 并在销毁前取消注册它时,我应该重写相应的方法对。简要查看ControlsForms给了我 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/

相关文章:

delphi - 使用对象作为 TObjectDictionary 中的键

windows - 在 Delphi 7 中使用 WMI 内存泄漏

delphi - 使用TFileRun和regsvr32注册DLL时找不到文件

delphi - delphi 2010 的视频组件

delphi - TCustomListbox 项目的自定义绘图

delphi - 复合组件的选择框未正确绘制

delphi - 如何在 TList 中存储动态数组?

android - 如何使用 Delphi for Android 创建带圆角的 TEdit?

C++ 生成器 [C++ 错误] sysmac.h(58) : E2040 Declaration terminated incorrectly

windows - 为特定应用程序禁用 Windows 10 游戏栏