题
我正在编写一个有两个窗格的程序(通过 CSplitter
),但是我在弄清楚如何调整每个帧中的控件大小时遇到问题。为了简单起见,有人可以告诉我如何使用单个基本框架来完成它吗? CEdit
控制?
我相当确定这与 CEdit::OnSize()
功能...但我真的没有任何进展......
谢谢!:)
解决方案
当您的框架收到 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);
}
其他提示
窗口在调整大小后立即收到 WM_SIZE 消息(由 MFC 中的 OnSize 处理程序处理),因此 CEdit::OnSize 不是您要查找的内容。
您应该在框架类中添加 OnSize 处理程序,并在该处理程序中添加为 Rob 指出 您将获得框架客户区域的宽度和高度,然后您应该添加调整控件大小和位置的代码。
像这样的东西
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);
}
GetDlgItem(IDC_your_slidebar)->SetWindowPos(...) // 实际上你可以移动、调整大小...等
为此,SetWindowPos 的任务有点繁重。MoveWindow 正是所需要的。
其他人指出 WM_SIZE 是您此时应该处理并调整子控件大小的消息。WM_SIZE 在调整大小完成后发送。
您可能还想处理在调整大小时发送的 WM_SIZING 消息。这将允许您在用户仍在拖动鼠标时主动调整子窗口的大小。处理 WM_SIZING 并不是绝对必要的,但它可以提供更好的用户体验。
我使用 CodeGuru 中的 CResize 类自动调整所有控件的大小。您告诉您希望如何调整每个控件的大小,它就会为您完成工作。
调整大小范例是指定当调整对话框大小时控件的每一侧将移动多少。
SetResize(IDC_EDIT1, 0, 0, 0.5, 1);
SetResize(IDC_EDIT2, 0.5, 0, 1, 1);
当您有大量对话框控件时非常方便。
当谈到窗口大小变化时,您可能会对以下三种窗口消息感兴趣: ON_WM_SIZE()
, ON_WM_SIZING()
, , 和 ON_WM_GETMINMAXINFO()
.
作为 官方文档 说:
ON_WM_SIZE
其消息处理程序是::OnSize()
CWnd大小改变后触发;ON_WM_SIZING
其消息处理程序是::OnSizing()
当 Clipbord-viewer 窗口的客户区域大小发生变化时触发;ON_WM_GETMINMAXINFO
其消息处理程序是::OnGetMinMaxInfo()
每当窗口需要知道最大化位置或尺寸,或者最小或最大跟踪尺寸时就会触发。
如果你想限制大小 cwnd
一定范围内,可以参考留言 ON_WM_GETMINMAXINFO
;如果你想实时获取尺寸变化,可以参考另外两条消息。