如何调整 CWnd 内 WPF 控件的大小?

2024-04-20

我正在托管 WPFUserControlMFC 内部CWnd。它工作得很好,我现在需要弄清楚如何与其父控件一起调整控件的大小。我已经迷上了OnSize我正在打电话GetWindowRect并将结果设置为我的控件,如下所示:

void CChildFrame::OnSize(UINT nType, int cx, int cy)
{
    CRect rect;
    this->GetWindowRect(&rect);

    m_mainControl->Width = rect.Width();
    m_mainControl->Height = rect.Height();
}

尤里卡!解决方案是设置HwndSource.SizeToContent to SizeToContent.WidthAndHeight。这似乎违反直觉SizeToContent涉及视口调整其包含内容大小的能力,但它有效。我的想法是它改变了控件重新绘制的方式。如果有人想要的话,整个解决方案如下:

创建并获取 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();
}

Call GetMyControlHwnd in the OnCreate主机窗口的。该函数通过设置来创建父子关系本身HwndSource.ParentWindow财产。

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\n");
    //  return -1;
    //}

    return 0;
}

When ChildFrame调整大小我只需更改控件的宽度和高度。

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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何调整 CWnd 内 WPF 控件的大小? 的相关文章

随机推荐

  • 使用正则表达式验证英国邮政编码

    我想用英国邮政编码验证字段 可以使用什么正则表达式来验证该字段 A Z 1 2 0 9 0 9A Z 0 1 0 9 A Z 2 GIR 0AA 确实显得有效 因为它有例外GIR 0AA 所以 请帮我写一个没有任何异常的表达式 如果你指的是
  • 如何注册新的payum支付方式并添加操作?

    我创建了一个 payum 付款方式 我设置了一个存储付款详细信息的付款表单 然后生成付款安全令牌 到目前为止 一切似乎都正常 payum 会在存储中生成令牌 但是 我似乎无法注册它 我不知道应该在哪里添加操作 以便在加载付款方式时使用它们
  • 如何同时循环多个数组(并行)

    好吧 我不知道为什么这这么难 我找到的所有信息仅适用于像 array combine 这样的两个数组 我有 3 个从表单中动态创建的输入字段获取的数组 所以现在我想检索数据并将其打印出来 如下所示 Item1 array1 Item1 ar
  • 如何在 Flutter 中对文本的 fontSize 进行动画处理?

    有什么方法可以动画增加 减少fontSize in a Text widget 可能更简单的解决方案是使用AnimatedTextStyle double size 10 override Widget build BuildContext
  • 如何将 HTML 代码导入到 JSF 页面?

    我正在尝试导入这个page http dl dropbox com u 5714646 Highcharts 2 2 0 examples pie donut index htm到我的 JSF 页面 该页面将有数据库来获取数据 以更具交互性
  • Rabl、Jbuilder 或手动 json 构建 api?

    要为大规模应用程序构建 api 就性能而言 哪种方法更好 我应该使用 Rabl Jbuilder 还是手动构建 json 对象 我正在为移动应用程序构建 api endpoints 在性能方面 您应该尝试创建一些基本的性能测试 并对它们进行
  • 无法在同一查询中运行 Insert 和 Select LAST_INSERT_ID() 吗?

    我正在使用节点连接到 mysql 我需要运行插入 然后立即运行 select last insert id insert into data temp values null test id 12 otherdata x otherdata
  • OpenCV(C++/Qt)-cornerSubPix 错误

    Hello 我在使用 imgproc hpp 文件中的cornerSubPix 方法时遇到问题 我不明白缺少哪个库或者有什么错误 我在 OS X 10 10 3 上使用 Qt 5 4 1 并使用 OpenCV 3 0 0 C 库 这是我的代
  • 在 PHP 的 require_once 中使用查询字符串

    在我的其中一个页面上有一个require once path to url page php 没有任何问题 当我添加查询字符串时require once path to url page php var test 它将不再包含该文件 只是一
  • Web 应用程序的计划任务

    为 Web 应用程序创建计划任务 无论是否有单独的 Web 桌面应用程序 有哪些不同的方法 如果我们谈论的是 Microsoft 平台 那么我总是会开发一个单独的 Windows 服务来处理此类批处理任务 您始终可以引用 Web 应用程序正
  • 无法在 Scala 中使用 Apache Commons CLI Option.builder()

    在 Spark shell 或应用程序 用 Scala maven 构建编写 中 我无法使用 Apache Commons CLI 包中的静态构建器方法 我已确认我将 jar 包含在类路径中并且可以访问Option类以及包中的其他类 例如O
  • 我可以将 jQuery UI 对话框置于 div 中心吗?

    我有一个主要内容 div 我想将对话框置于该 div 的中心 而不是页面的中心 有任何想法吗 我知道有一个位置实用程序 但我不知道如何将它与对话框位置选项一起使用 你是对的 position http jqueryui com demos
  • 将 hibernate 投影结果映射到 java POJO 模型

    在过去的几周里 我一直在使用 spring 和 hibernate 并且我一直在那里学习新的东西 现在我有一个问题想用 Hibernate 中的投影来解决 假设有一个模型Person这个模型有很多Car 以下是类定义的大致样子 public
  • 计算机状态(睡眠、休眠、锁定等) Windows 10

    我需要检查当前状态 计算机的 休眠 睡眠 待机锁定等 我只是想问一下如何使用C 获取我的计算机的当前状态 我已经通过检测 LockApp 进程知道计算机何时被锁定 但我无法知道它是否处于睡眠模式或休眠模式 我想尝试一个将使用任务计划程序运行
  • Solr 管理控制台中模式浏览器屏幕中的字段

    上面是特定索引的架构浏览器屏幕的屏幕截图 该字段是品牌 字段类型定义如下
  • 属性“user”在类型“Request>”上不存在

    请帮助 我收到此错误 src app middlewares authentication ts 16 17 error TS2339 Property user does not exist on type Request
  • css 旋转与过渡似乎会影响其他元素的不透明度?

    我遇到了使用 1s 过渡通过 CSS3 变换旋转 DIV 的问题 在 OSX 10 7 5 上的 Chrome 23 和 Safari 6 中 在 rotate divs 转换期间 其他容器中的字体会稍微变暗 关于造成这种情况的原因以及如何
  • 当前位置权限对话框消失得太快

    我的应用程序获取用户位置 获取坐标 并提供往返目的地或出发地的距离 所有这些可能的目的地都显示在表格视图中 因此我在填充表格的同时获取用户坐标 唯一的问题是 询问用户位置的警报视图出现然后消失得如此之快 以至于无法单击它 有什么方法可以在应
  • 使用 openmp 优化 N-queen

    我正在学习 OPENMP 并编写以下代码来解决 n 皇后问题 Full Code https github com Shafaet Codes blob master OPENMP Parallel 20N Queen 20problem
  • 如何调整 CWnd 内 WPF 控件的大小?

    我正在托管 WPFUserControlMFC 内部CWnd 它工作得很好 我现在需要弄清楚如何与其父控件一起调整控件的大小 我已经迷上了OnSize我正在打电话GetWindowRect并将结果设置为我的控件 如下所示 void CChi