C++ 在MFC中调整控件的大小

C++ 在MFC中调整控件的大小,c++,mfc,C++,Mfc,我正在编写一个有两个窗格的程序(通过CSplitter),但是我在确定每个帧中控件的大小时遇到了问题。为了简单起见,有人能告诉我如何使用单个CEdit控件来实现基本帧吗 我很确定这与CEdit::OnSize()函数有关。。。但我真的没有什么进展 谢谢!:) 当您的帧收到OnSize消息时,它将为您提供新的宽度和高度-您只需调用CEdit SetWindowPos方法将这些值传递给它即可 假设CMyPane是您的拆分器窗格,其中包含您在OnCreate中创建的名为m_wndEdit的CEdit:

我正在编写一个有两个窗格的程序(通过
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);
}

为此,SetWindowPos的负载有点重。MoveWindow正好满足需要。

GetDlgItem(IDC\u your\u slidebar)->SetWindowPos(…)//实际上,您可以移动、调整大小……等等。

窗口在调整大小后立即接收WM\u大小消息(由MFC中的OnSize处理程序处理),因此CEdit::OnSize不是您想要的

您应该在frame类中添加OnSize处理程序,并在该处理程序中获得框架的客户端区域的宽度和高度,然后您应该添加调整控件大小和位置的代码

像这样的

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);
}

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


您可能还希望处理在调整大小过程中发送的WM_大小消息。这将允许您在用户仍在拖动鼠标时主动调整子窗口的大小。处理WM_大小调整并非绝对必要,但它可以提供更好的用户体验。

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

调整大小范例用于指定调整对话框大小时控件每一侧的移动量

SetResize(IDC_EDIT1, 0,   0,   0.5, 1);
SetResize(IDC_EDIT2, 0.5, 0,   1,   1);
当您有大量对话框控件时,非常方便


当涉及到窗口大小的更改时,您可能会对三条窗口消息感兴趣:
关于\u WM\u size()
关于\u WM\u size()
,以及
关于\u WM\u GETMINMAXINFO()

正如上面所说:

  • 消息处理程序为
    的\u WM\u SIZE
    上的
    ::OnSize()
    在CWnd的大小更改后触发
  • 当剪贴簿查看器窗口的客户端区域的大小更改时,将触发消息处理程序为
    上的
    :OnSizing()
  • 当窗口需要知道最大位置或尺寸,或最小或最大跟踪大小时,会触发消息处理程序为
    的\u WM\u GETMINMAXINFO上的
    ::OnGetMinMaxInfo()

如果您想将
cwnd
的大小限制在某个范围内,可以参考_WM_GETMINMAXINFO
上的消息
;如果要实时检索大小更改,可以参考其他两条消息。

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

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


这样,您就省去了几何体和变换的负担。

谢谢您的回复,但是有人能举个更具体的例子吗?谢谢您使用的是哪个版本的Visual Studio?