【问题标题】:Resizing a WPF window that is a child to a CView将作为子项的 WPF 窗口调整为 CView
【发布时间】:2011-10-06 13:58:37
【问题描述】:

我遇到了一个奇怪的问题,我需要你的帮助。我有一个 MFC MDI 应用程序,我正在尝试创建一个 WPF 窗口作为打开的 CView 的子窗口。

通过在我的 CView 中处理 OnCreate 消息并创建 WPF 窗口,我能够成功地做到这一点。我还将 CView 设置为 WPF 窗口的父级,因此它的行为与其子级一样。

这是我所做的:

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CView::OnCreate(lpCreateStruct) == -1)
       return -1;

    m_windowWrapper.Create(this->GetSafeHwnd());

    return 0;
}

void CMyWindowWrapper::Create(HWND hParent)
{ 
   m_myWindow = gcnew MyWindow();
   m_myWindow->Show();

   IntPtr^ hChildWnd = m_myWindow->GetHwnd();
   ::SetParent((HWND)hChildWnd->ToPointer(), hParent);
}

public partial class MyWindow : Window
{
    public MyWindow()
    {
       InitializeComponent();
       MouseLeftButtonDown += (o, e) => DragMove();
    }

    public IntPtr GetHwnd()
   {
      return (new System.Windows.Interop.WindowInteropHelper(this)).Handle;
   }
}

WPF 窗口按预期显示。现在,当我尝试调整 WPF 窗口的大小时,就会出现问题。突然,窗口内的控件被拉伸并重新定位,就好像 WPF 窗口的新大小是父 CView 的大小一样!我尝试处理 SizeChanged 事件,发现 NewSize 远大于 WPF 窗口的大小,很可能是包含 CView 的大小。

我尝试删除 SetParent 调用,并且调整大小工作正常。我想知道在调整大小和父级是 CView 的 WPF 窗口时出了什么问题。

我上传了一个示例应用程序来说明问题: http://cid-a059807de2e23c43.office.live.com/self.aspx/.Public/ResizeProblem.zip

请帮帮我。

谢谢。

【问题讨论】:

  • 我遇到了这个问题二。我什至迷上了::OnSize,但它没有正确调整大小。看起来很糟糕。

标签: wpf mfc interop resize mixing


【解决方案1】:

我遇到了同样的问题,在我的子窗口上使用 SetParent 后,任何 Resize 或 DragMove 都会导致 NewSize 变得巨大。我的不同之处在于我的主应用程序是 WPF,我在其中创建并在单独的线程上运行子 WPF 窗口。

我的老板发现了这个链接1,有人评论了如何使用反射将孩子的所有者设置为其父母:

typeof(System.Windows.Window).InvokeMember(“_ownerHandle”, BindingFlags.Public |      BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetField, null, YOUR_CHILD_WINDOW, new object[] { YOUR_PARENT_HANDLE });

使用此代码并删除我的 SetParent 后,我​​的问题消失了,并且能够将我的子窗口的所有者设置为在单独线程上运行的主 WPF 窗口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    相关资源
    最近更新 更多