How do I resize a WPF control inside a CWnd?(如何在 CWnd 中调整 WPF 控件的大小?)
问题描述
我在 MFC CWnd 中托管 WPF UserControl.它工作得很好我现在需要弄清楚如何用它的父级调整控件的大小.我已经挂上了 OnSize 并且我正在调用 GetWindowRect 并将结果设置为我的控件,如下所示:
I'm hosting a WPF UserControl inside an MFC CWnd. It works beautifully I now need to figure out how to resize the control with its parent. I've hooked the OnSize and I'm calling GetWindowRect and setting the result to my control like so:
void CChildFrame::OnSize(UINT nType, int cx, int cy)
{
CRect rect;
this->GetWindowRect(&rect);
m_mainControl->Width = rect.Width();
m_mainControl->Height = rect.Height();
}
推荐答案
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;
/
本文标题为:如何在 CWnd 中调整 WPF 控件的大小?
- 如何对自定义类的向量使用std::find()? 2022-11-07
- 一起使用 MPI 和 OpenCV 时出现分段错误 2022-01-01
- 使用/clr 时出现 LNK2022 错误 2022-01-01
- STL 中有 dereference_iterator 吗? 2022-01-01
- 从python回调到c++的选项 2022-11-16
- C++ 协变模板 2021-01-01
- 静态初始化顺序失败 2022-01-01
- Stroustrup 的 Simple_window.h 2022-01-01
- 与 int by int 相比,为什么执行 float by float 矩阵乘法更快? 2021-01-01
- 近似搜索的工作原理 2021-01-01
