我面临一个奇怪的问题,我需要你的帮助。我有一个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调用,并且调整大小正常工作。我想知道调整大小和WPF窗口出现了什么问题,其父级是CView。
我上传了一个说明问题的示例应用程序: http://cid-a059807de2e23c43.office.live.com/self.aspx/.Public/ResizeProblem.zip
请帮帮我。
谢谢。
答案 0 :(得分:-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窗口。