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
在CWnd的大小更改后触发李>::OnSize()
- 当剪贴簿查看器窗口的客户端区域的大小更改时,将触发消息处理程序为
的
上的
李>:OnSizing()
- 当窗口需要知道最大位置或尺寸,或最小或最大跟踪大小时,会触发消息处理程序为
的\u WM\u GETMINMAXINFO上的
::OnGetMinMaxInfo()
- 当窗口需要知道最大位置或尺寸,或最小或最大跟踪大小时,会触发消息处理程序为
如果您想将
cwnd
的大小限制在某个范围内,可以参考_WM_GETMINMAXINFO上的消息;如果要实时检索大小更改,可以参考其他两条消息。最好在属性部分使用每个控件的动态布局功能
假设您希望有一个特定的控件,如标题,始终位于视图/对话框的中心,那么您只需选择控件的动态布局属性,将类型移动为水平,将X移动为50,但将大小调整为无。这样,调整视图大小时,标题始终保持在中心。您必须记住,在资源视图中设计控件时,调整/移动的最小值是对话框/视图中控件的大小/位置
这样,您就省去了几何体和变换的负担。谢谢您的回复,但是有人能举个更具体的例子吗?谢谢您使用的是哪个版本的Visual Studio?