在 MFC 中调整控件大小

Posted

技术标签:

【中文标题】在 MFC 中调整控件大小【英文标题】:Resizing Controls in MFC 【发布时间】:2008-09-24 14:25:58 【问题描述】:

我正在编写一个有两个窗格的程序(通过CSplitter),但是我在确定调整每个框架中的控件大小时遇到​​了问题。为简单起见,有人可以告诉我如何为带有单个 CEdit 控件的基本框架执行此操作吗?

我很确定这与 CEdit::OnSize() 函数有关...但我并没有真正做到...

谢谢! :)

【问题讨论】:

感谢您的回复,但有人可以举个更具体的例子吗?谢谢 您使用的是什么版本的 Visual Studio? 【参考方案1】:

窗口在调整大小后立即收到 WM_SIZE 消息(由 MFC 中的 OnSize 处理程序处理),因此 CEdit::OnSize 不是您要查找的。​​p>

您应该在框架类中添加 OnSize 处理程序,并在此处理程序中作为 Rob pointed out 您将获得框架客户区域的宽度和高度,然后您应该添加调整控件大小和位置的代码.

类似的东西

void MyFrame::OnSize(UINT nType, int w, int h)

    // w and h parameters are new width and height of your frame
    // suppose you have member variable CEdit myEdit which you need to resize/move
    myEdit.MoveWindow(w/5, h/5, w/2, h/2);

【讨论】:

【参考方案2】:

当您的框架收到 OnSize 消息时,它会为您提供新的宽度和高度 - 您只需调用 CEdit SetWindowPos 方法将这些值传递给它。

假设 CMyPane 是您的拆分器窗格,它包含您在 OnCreate 中创建的名为 m_wndEdit 的 CEdit:

void CMyPane::OnSize(UINT nType, int cx, int cy)

    m_wndEdit.SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);

【讨论】:

【参考方案3】:

GetDlgItem(IDC_your_slidebar)->SetWindowPos(...) // 实际上你可以移动,调整大小...等

【讨论】:

【参考方案4】:

SetWindowPos 对于这个目的有点重。 MoveWindow 正是需要的。

【讨论】:

【参考方案5】:

其他人指出 WM_SIZE 是您应该处理的消息并在此时调整子控件的大小。 WM_SIZE 在调整大小完成后发送。

您可能还想处理在调整大小进行时发送的 WM_SIZING 消息。这将允许您在用户仍在拖动鼠标时主动调整子窗口的大小。处理 WM_SIZING 不是绝对必要的,但它可以提供更好的用户体验。

【讨论】:

【参考方案6】:

我使用 CodeGuru 的 CResize 类来自动调整所有控件的大小。你告诉你希望如何调整每个控件的大小,它会为你完成这项工作。

调整大小范例是指定当对话框调整大小时控件的每一侧将移动多少。

SetResize(IDC_EDIT1, 0,   0,   0.5, 1);
SetResize(IDC_EDIT2, 0.5, 0,   1,   1);

当您拥有大量对话框控件时非常方便。

Source code

【讨论】:

【参考方案7】:

当涉及到窗口大小变化时,您可能会感兴趣的三个窗口消息:ON_WM_SIZE()ON_WM_SIZING()ON_WM_GETMINMAXINFO()

正如the official docs 所说:

ON_WM_SIZE,其消息处理器为::OnSize(),在CWnd的大小发生变化后触发; ON_WM_SIZING,其消息处理程序为::OnSizing(),当clipbord-viewer窗口的客户区大小发生变化时触发; ON_WM_GETMINMAXINFO 的消息处理程序为 ::OnGetMinMaxInfo() 时,只要窗口需要知道最大化的位置或尺寸,或者最小或最大跟踪大小,就会触发。

如果您想将cwnd 的大小限制在某个范围内,可以参考消息ON_WM_GETMINMAXINFO;如果您想实时检索尺寸变化,您可以参考其他两条消息。

【讨论】:

【参考方案8】:

最好在属性部分使用每个控件的动态布局功能。

假设您想要一个特定的控件,例如标题,始终位于视图/对话框的中心,然后您只需选择控件的动态布局属性,移动类型为水平,移动 X 为 50,但是您继续调整大小为无。这样,当您调整视图大小时,标题始终保持在中心。当您在资源视图中设计控件时,您必须记住,调整大小/移动的最小值是对话框/视图中控件的大小/位置。

这样,您可以省去几何和变换的负担。

【讨论】:

以上是关于在 MFC 中调整控件大小的主要内容,如果未能解决你的问题,请参考以下文章

调整 MFC 网格控件的大小以适应对话框?

MFC如何使控件大小随着对话框大小自动调整

MFC:从控件本身的代码限制子控件的大小

mfc 窗口大小变化时,如何让窗口内部控件也一起随比例改变位置?

如何实现控件随对话框大小变化而自动调整大小和位置

C#,实现窗口大小改变时窗口内的控件自动调整位置和大小时,groupbox内的控件为啥不自动调整