更新时间:2023-10-03 17:36:10
Eureka!解决方法是将 HwndSource.SizeToContent
设置为 SizeToContent.WidthAndHeight
.这似乎违反直觉,因为 SizeToContent
涉及视口调整其包含内容的能力,但它确实有效.我的想法是它改变了控件重绘的方式.如果有人想要,整体解决方案如下:
Eureka! The solution is to set the HwndSource.SizeToContent
to SizeToContent.WidthAndHeight
. This seems counter intuitive as SizeToContent
is involved with a viewport's ability to size to what it contains, but it worked. My thinking is that it changes the way the control is repainted. The solution as a whole, if anyone wants it is as follows:
创建和获取 WPF 用户控件句柄的函数.在这种情况下称为 MyControl
:
HWND CChildFrame::GetMyControlHwnd(HWND a_parent, int a_x, int a_y, int a_width, int a_height)
{
HWND mainHandle = AfxGetMainWnd()->GetSafeHwnd();
IntPtr testHandle = IntPtr(mainHandle);
HwndSource^ test = HwndSource::FromHwnd(testHandle);
Global::Bootstrap(IntPtr(mainHandle));
HwndSourceParameters^ sourceParameters = gcnew HwndSourceParameters("MyControl");
sourceParameters->PositionX = a_x;
sourceParameters->PositionY = a_y;
sourceParameters->Height = a_height;
sourceParameters->Width = a_width;
sourceParameters->ParentWindow = IntPtr(a_parent);
sourceParameters->WindowStyle = WS_VISIBLE | WS_CHILD | WS_MAXIMIZE;
m_hwndSource = gcnew HwndSource(*sourceParameters);
m_myControl = gcnew MyControl();
// *** This is the line that fixed my problem.
m_hwndSource->SizeToContent = SizeToContent::WidthAndHeight;
m_hwndSource->RootVisual = m_myControl;
return (HWND) m_hwndSource->Handle.ToPointer();
}
在宿主窗口的 OnCreate
中调用 GetMyControlHwnd
.该函数通过设置 HwndSource.ParentWindow
属性自行创建父子关系.
Call GetMyControlHwnd
in the OnCreate
of the host window. The function creates the parent child relationship itself by setting the HwndSource.ParentWindow
property.
int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
return -1;
m_hMyControl = GetMyControlHwnd(this->GetSafeHwnd(), 0, 0, lpCreateStruct->cx, lpCreateStruct->cy);
//// create a view to occupy the client area of the frame
//if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
// CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
//{
// TRACE0("Failed to create view window
");
// return -1;
//}
return 0;
}
当 ChildFrame
调整大小时,我只需更改控件的宽度和高度.
When ChildFrame
resizes I simply change the width and height of the control.
void CChildFrame::OnSize(UINT nType, int cx, int cy)
{
CRect rect;
this->GetWindowRect(&rect);
m_myControl->Width = cx;
m_myControl->Height = cy;
}
我在头文件中有以下私有字段:
// Fields
private:
gcroot<HwndSource^> m_hwndSource;
gcroot<MyControl^> m_myControl;
HWND m_hMyControl;
知道这是在 MFC C++/CLI 代码文件中包含 CLR 命名空间的方式,这很有帮助:
using namespace System;
using namespace System::Windows;
using namespace System::Windows::Interop;