他们有什么区别?他们什么时候应该被覆盖?
解决方法
的CreateParams();
一般来说,大部分时间您真正需要做的是覆盖CreateParams()。如果你想做的只是子类(记住Windows风格的“子类化”,请参阅Petzold在Windows编程中的开创性工作)一个现有的控件类,并将其包装在VCL控件中,您可以从CreateParams执行此操作。您还可以控制什么样的位设置和其他各种参数。我们使创建“子类”的过程非常简单。只需从CreateParams()方法调用CreateSubClass()。有关例如TCheckBox或TButton,请参阅核心VCL控件。
CreateWnd方法();
如果您需要在窗口句柄创建后再做一点更多操作,那么您将覆盖此操作。例如,如果您有某种控件是某种列表,树或其他方式需要创建后配置,则可以在此处执行。调用继承的CreateWnd,当它返回(你知道你有一个有效的句柄,如果你从CreateWnd返回,因为它会引发一个异常,如果出现问题),只需应用你的额外的魔法。常见的情况是将缓存在实例TStrings列表中的数据实际移动到底层窗口控件中。 TListBox是一个典型的例子。
CreateWindowHandle();
我不得不在这个记忆中刷新我的记忆,但似乎这是一个很少,如果有的话,被覆盖。在VCL本身的少数情况下,它似乎是用来处理特定的Windows版本和区域设置的怪物与一些控件,如TEdit和TMemo。另一个更明确的例子是TCustomForm本身。在这种情况下,它支持旧的MDI(mutli-document interface)模型。在这种情况下,无法使用普通的CreateWindowEx()API创建MDI子项,必须向MDI父框架发送消息才能实际创建句柄。因此,超越这种方法的唯一原因是如果通过与旧的试用和真实的CreateWindowEx()完全不同的手段来创建句柄的实际过程。
我确实注意到你的问题只是询问创建过程,但是有些方法在某些情况下被覆盖,因为这两种方法都被破坏,而有时围绕句柄的“巫术”则被覆盖。但这些是应该分开讨论的其他主题:-)。