【问题标题】:Force BuildWindowCore member of a HwndHost derived class to be called强制调用 HwndHost 派生类的 BuildWindowCore 成员
【发布时间】:2011-06-22 21:09:26
【问题描述】:

我使用从 HwndHost 派生的类来承载 Win32 窗口。它又在用户控件中使用。除非成功创建内部 Win32 窗口,否则不会显示该用户控件(可见性)。但是,除非 HwndHost 窗口可见,否则似乎不会调用 BuildWindowCore 方法,所以我有一个鸡和蛋的情况。

如果 HwndHost 派生类不可见,是否有其他方法可以调用它的 BuildWindowCore 方法?

【问题讨论】:

  • 为什么要先创建Win32 Window?您是否希望该过程以某种方式失败?
  • 简而言之,是的,它的创建可能会失败。总而言之,它与我们的遗留代码及其运作方式有关。

标签: wpf visibility hwndhost


【解决方案1】:

嗯,一个月过去了,没有答案。看来我难倒了所有人,包括我自己。

因此,从 .NET 4.0 开始,答案是“不,无法在框架准备好调用 BuildWindowCore 之前强制调用它。”

【讨论】:

    【解决方案2】:

    您可以自己创建 Win32 窗口,只需使用 HwndHost 作为包装器,如下例所示。

    ref class MyHost : HwndHost 
    {
    private:
       HWND  m_hWnd;
    public:
       MyHost(HWND hWnd)
       {
          m_hWnd = hWnd;
       }
    protected: 
      virtual HandleRef BuildWindowCore(HandleRef hwndParent) override 
      {
         // Simply re-parent the window
         SetParent(m_hWnd, (HWND) hwndParent.Handle.ToPointer());
         return HandleRef(this, (IntPtr) m_hWnd);
      } 
    
      virtual void DestroyWindowCore(HandleRef hwnd) override
      {
         ::DestroyWindow(m_hWnd);
      }
    };
    

    【讨论】:

    • 这可能真的有效。今天早上我突然觉得自己像个初级程序员,因为我自己没有想到这一点。谢谢。
    • 现在我记得为什么我不能这样做。非托管窗口创建其他子窗口,消息开始在它们之间飞来飞去。我需要在 MyHost 中处理其中的一些。这就是为什么在 BuildWindowCore 之前我无法创建窗口。
    • 虽然是一篇旧文章,但我想添加评论。当我尝试上述方法时,我在调用 BuildWindowCore 时遇到了问题。我怀疑 BuildWindowCore 被 WPF 消息处理循环调用,并且 BuildWindowCore 以某种方式最终等待处理循环处理消息。但是我对此完全不确定,只是想让阅读此内容的人知道您可能会看到相同的内容
    猜你喜欢
    • 2019-11-13
    • 1970-01-01
    • 2012-05-17
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2013-10-08
    • 2018-11-30
    相关资源
    最近更新 更多