在 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 中调整控件大小的主要内容,如果未能解决你的问题,请参考以下文章