我正在编写一个有两个窗格的程序(通过 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;如果你想实时获取尺寸变化,可以参考另外两条消息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top