Delphi 当HWND在组件的生命周期内被销毁和重新创建时?

Delphi 当HWND在组件的生命周期内被销毁和重新创建时?,delphi,components,hwnd,Delphi,Components,Hwnd,对此,雷米在评论中说: TWinControl.Handle属性提供的HWND不是持久性的。它可以在组件的生命周期内被销毁和重新创建,甚至多次。每次TShellListView分配新的HWND时,都必须再次调用DragAcceptFiles(TRUE)。重写CreateWnd()允许您这样做。为了更好地衡量,您还应该在销毁HWND之前重写DestroyWnd()以调用DragAcceptFiles(FALSE) 直到现在我才意识到这一点,我想了解破坏和重建HWND的机制。发生这种情况的情况是什么

对此,雷米在评论中说:

TWinControl.Handle属性提供的HWND不是持久性的。它可以在组件的生命周期内被销毁和重新创建,甚至多次。每次TShellListView分配新的HWND时,都必须再次调用DragAcceptFiles(TRUE)。重写CreateWnd()允许您这样做。为了更好地衡量,您还应该在销毁HWND之前重写DestroyWnd()以调用DragAcceptFiles(FALSE)


直到现在我才意识到这一点,我想了解破坏和重建HWND的机制。发生这种情况的情况是什么?为什么

它通常发生在样式更改需要时。使用调试单元调试应该很容易。这在很大程度上取决于控件。除了含糊不清之外,很难做任何事情。如果您需要一个不受限制的窗口,请使用AllocateHWnd。阅读问题的注释。然后查看TWinControl的VCL源代码以及在该源代码中进行的重新创建WND的调用。@KenWhite,这并不能真正让您达到目的。Remy提到的实际控件是
TShellListView
,因此除了
TWinControl
的功能外,它很可能有自己的调用来重新创建窗口。马鲁斯似乎要求的不仅仅是控制。此外,您还需要了解父项链中的每个控件,因为当重新创建窗口时,所有的子项都是如此。@David:如果没有遇到断点,您就知道没有重新创建。当然,你不会发现所有可能的情况。只是那些你关心的人,在你的特殊情况下。但这不是问题所在。他想知道一般情况下什么需要这样的娱乐。这通常发生在风格改变需要的时候。使用调试单元调试应该很容易。这在很大程度上取决于控件。除了含糊不清之外,很难做任何事情。如果您需要一个不受限制的窗口,请使用AllocateHWnd。阅读问题的注释。然后查看TWinControl的VCL源代码以及在该源代码中进行的重新创建WND的调用。@KenWhite,这并不能真正让您达到目的。Remy提到的实际控件是
TShellListView
,因此除了
TWinControl
的功能外,它很可能有自己的调用来重新创建窗口。马鲁斯似乎要求的不仅仅是控制。此外,您还需要了解父项链中的每个控件,因为当重新创建窗口时,所有的子项都是如此。@David:如果没有遇到断点,您就知道没有重新创建。当然,你不会发现所有可能的情况。只是那些你关心的人,在你的特殊情况下。但这不是问题所在。他想知道一般情况下什么需要这样的娱乐。