调整MFC中的控件大小

时间:2008-09-24 14:25:58

标签: c++ mfc

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

我很确定它与CEdit::OnSize()功能有关......但我真的没有到达任何地方......

谢谢! :)

8 个答案:

答案 0 :(得分:11)

一个窗口在调整大小后立即接收WM_SIZE消息(由MFC中的OnSize处理程序处理),因此CEdit :: OnSize不是您要查找的内容。

你应该在你的框架类中添加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);
}

答案 1 :(得分:9)

当你的帧收到一个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);
}

答案 2 :(得分:5)

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

答案 3 :(得分:3)

SetWindowPos对于此目的来说有点重要。 MoveWindow正是需要的。

答案 4 :(得分:2)

其他人已经指出WM_SIZE是你应该处理的消息,并在那时调整子控件的大小。调整大小完成后发送WM_SIZE。

您可能还希望处理在调整大小正在进行时发送的WM_SIZING消息。这将允许您在用户仍在拖动鼠标时主动调整子窗口的大小。它不是处理WM_SIZING所必需的,但它可以提供更好的用户体验。

答案 5 :(得分:1)

我使用CodeGuru的CResize类自动调整所有控件的大小。您告诉您希望如何调整每个控件的大小,并为您完成工作。

调整大小范例是指定在调整对话框大小时控件的每一边移动的程度。

SetResize(IDC_EDIT1, 0,   0,   0.5, 1);
SetResize(IDC_EDIT2, 0.5, 0,   1,   1);

当你有大量的对话框控件时非常方便。

Source code

答案 6 :(得分:0)

关于窗口大小的更改,您可能会对以下三种窗口消息感兴趣:ON_WM_SIZE()ON_WM_SIZING()ON_WM_GETMINMAXINFO()

the official docs说:

    在更改CWnd的大小后,触发其消息处理程序为ON_WM_SIZE
  • ::OnSize()
  • 当clipbord-viewer窗口的客户区大小已更改时,将触发消息处理程序为ON_WM_SIZING
  • ::OnSizing()
  • 每当窗口需要知道最大位置或尺寸或最小或最大跟踪大小时,就会触发其消息处理程序为ON_WM_GETMINMAXINFO
  • ::OnGetMinMaxInfo()

如果要将cwnd的大小限制在某个范围内,可以参考消息ON_WM_GETMINMAXINFO;如果您想实时获取尺寸变化,则可以参考其他两条消息。

答案 7 :(得分:0)

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

假设您要在视图/对话框的中心始终拥有一个特定的控件(例如标题),然后只需选择控件的“动态布局”属性,将“移动类型”设置为“水平”并将“移动X”设置为50,但您将尺寸调整为无。这样,当您调整视图大小时,标题始终保持在中心。您必须记住,在资源视图中设计控件/对话框时,其最小尺寸/移动是对话框/视图中控件的尺寸/位置。

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