【问题标题】:Resizing Controls in MFC在 MFC 中调整控件大小
【发布时间】:2010-09-12 18:05:29
【问题描述】:

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

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

谢谢! :)

【问题讨论】:

  • 感谢您的回复,但有人可以举个更具体的例子吗?谢谢
  • 您使用的是什么版本的 Visual Studio?

标签: c++ mfc


【解决方案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,但是您继续调整大小为无。这样,当您调整视图大小时,标题始终保持在中心。当您在资源视图中设计控件时,您必须记住,调整大小/移动的最小值是对话框/视图中控件的大小/位置。

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2016-02-12
                  • 2023-03-10
                  • 2012-05-17
                  • 1970-01-01
                  • 2010-09-15
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多