Delphi组件具有CreateWnd
和CreateWindowHandle
(以及DestroyWnd
和DestroyWindowHandle
)。它们都被后代所取代,对吗?是否不打算通过底层VCL实现调用它?
它们之间有什么区别?什么时候应该覆盖它们?
最佳答案
到目前为止,这里的大多数答案都差不多了,您最好听从他们的建议。但是,这个故事还有更多内容。关于您何时会覆盖一个或另一个的特定问题,我将尝试概括一下。
CreateParams();
通常,大多数时候,您真正需要做的就是重写CreateParams()。如果您要做的只是对现有控件类进行子类化(还记得Windows风格的“子类化?”,请参阅Petzold关于Windows编程的开创性工作)并将其包装在VCL控件中,则可以通过CreateParams进行。您还可以控制设置哪些样式位以及其他各种参数。我们简化了创建“子类”的过程。只需从CreateParams()方法调用CreateSubClass()。有关示例,请参见核心VCL控件,例如TCheckBox或TButton。
CreateWnd();
如果在创建窗口句柄后还需要对窗口句柄做更多的操作,则可以覆盖此窗口。例如,如果您的控件是某种列表,树或其他需要后创建配置的控件,则可以在此处进行操作。调用继承的CreateWnd,并在其返回时(您知道从CreateWnd返回时具有有效的句柄,因为如果出现问题,它将引发异常),只需施加额外的魔力即可。一种常见的情况是获取缓存在实例TStrings列表中的数据,然后将其实际移到基础窗口控件中。 TListBox是一个典型的例子。
CreateWindowHandle();
我不得不在这一点上刷新我的记忆,但是似乎这是很少被覆盖的东西,如果曾经被覆盖的话。在VCL本身内部的少数情况下,似乎可以使用它来解决特定Windows版本和某些控件(例如TEdit和TMemo)的语言环境的问题。另一个更明确的情况是TCustomForm本身。在这种情况下,它可以支持旧的MDI(多文档接口(interface))模型。在这种情况下,无法使用常规的CreateWindowEx()API创建MDI子级,您必须向MDI父帧发送一条消息以实际创建该句柄。因此,覆盖此方法的唯一原因是创建句柄的实际过程是否通过与旧的,久经考验的CreateWindowEx()完全不同的方法完成。
我确实注意到您的问题只是在询问创建过程,但是在某些情况下,对于句柄销毁和有时围绕句柄娱乐的“伏都教”,有些方法被覆盖了。但是这些是其他主题,应该分别讨论:-)。
关于delphi - CreateWnd和CreateWindowHandle有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/582903/