繁体   English   中英

在 MFC 中调整控件大小

[英]Resizing Controls in MFC

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

我相当确定它与CEdit::OnSize()函数有关......但我并没有真正到任何地方......

谢谢! :)

窗口在调整大小后立即收到 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);
}

当您的框架收到 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);
}

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

为此,SetWindowPos 有点繁重。 MoveWindow 正是需要的。

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

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

我使用 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-查看器窗口的客户区的大小已经改变被触发;
  • ON_WM_GETMINMAXINFO其消息处理程序为::OnGetMinMaxInfo()每当窗口需要知道最大化位置或尺寸,或者最小或最大跟踪尺寸时触发。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM