delphi - CreateWnd 和 CreateWindowHandle 有什么区别?

标签 delphi components

Delphi 组件有 CreateWndCreateWindowHandle(以及 DestroyWndDestroyWindowHandle)。它们都打算被后代覆盖,对吗?并且除了底层 VCL 实现之外不会被调用?

它们有什么区别;什么时候应该覆盖它们中的任何一个?

最佳答案

到目前为止,这里的大多数答案都非常中肯,您最好听取他们的建议。然而,这个故事还有更多内容。对于您关于何时覆盖其中一个的具体问题,我将尝试简单概括一下。

CreateParams();

一般来说,大多数时候您真正需要做的就是重写 CreateParams()。如果您想做的只是对现有控件类进行子类化(还记得 Windows 风格的“子类化吗?”请参阅 Petzold 在 Windows 编程方面的开创性工作)并将其包装在 VCL 控件中,则可以通过 CreateParams 来完成此操作。您还可以控制设置哪些样式位以及其他各种参数。我们使创建“子类”的过程变得非常简单。只需从 CreateParams() 方法调用 CreateSubClass() 即可。请参阅核心 VCL 控件的示例,例如 TCheckBox 或 TButton。

CreateWnd();

如果您需要在窗口句柄创建后对其进行更多操作,则可以覆盖此句柄。例如,如果您的控件是某种列表、树或其他需要创建后配置的控件,则可以在此处执行此操作。调用继承的 CreateWnd,当它返回时(如果从 CreateWnd 返回,您就知道您有一个有效的句柄,因为如果出现问题,它会引发异常),只需应用您的额外魔法即可。一种常见的情况是获取实例 TStrings 列表中缓存的数据,并将其实际移动到底层窗口控件中。 TListBox 就是一个典型的例子。

CreateWindowHandle();

我不得不去刷新一下我对这个的内存,但似乎这个很少被覆盖。在 VCL 本身内部的少数情况下,它似乎用于通过某些控件(例如 TEdit 和 TMemo)来解决特定的 Windows 版本和区域设置怪异问题。另一个更明确的情况是 TCustomForm 本身。在这种情况下,它是为了支持旧的 MDI(多文档界面)模型。在这种情况下,无法使用普通的 CreateWindowEx() API 创建 MDI 子框架,您必须向 MDI 父框架发送消息才能实际创建句柄。因此,覆盖此方法的唯一原因是创建句柄的实际过程是否通过与旧的经过验证的 CreateWindowEx() 完全不同的方式完成。

我确实注意到您的问题只是询问创建过程,但是在某些情况下,对于句柄销毁和有时围绕句柄重新创建的“巫毒”,有一些相应的方法会被重写。但这些是其他主题,应该单独讨论:-)。

关于delphi - CreateWnd 和 CreateWindowHandle 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/582903/

相关文章:

http - 在post请求头中添加Cookie字段

javascript - 单击按钮时提醒输入框内容 - React

android - 检测 Spinner 组件时出现问题

c# - 该类未配置为支持提升激活

delphi - WaitForMultipleObjects 和 64 个线程

delphi - 加密组件

delphi - 如何捕捉父控件调整大小的时刻?

regex - 如何使用“在文件中查找”在 Delphi 中执行 bool 'AND' 搜索?

javascript - 通过组件向ReactJs函数发送数据

angular - 更新导航栏中的值而不重新加载整个页面 Angular 4