2011-10-06 102 views
2

我正面临一个奇怪的问题,我需要你的帮助。我有一个MFC MDI应用程序,并且我试图创建一个WPF窗口作为打开的CView的子项。将一个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调用,并调整大小工作正常。我不知道在调整大小和WPF窗口的父级是CView时会出现什么问题。

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

请帮助我。

谢谢。

+0

我有这个问题两个。我甚至迷上了':: OnSize',它没有正确调整大小。它看起来很糟糕。 – Jordan

回答

-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窗口运行在一个单独的线程。