在MFC中调整控件的大小
我正在编写一个有两个窗格的程序(通过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_your_slidebar)-> SetWindowPos(...)//实际上,我们可以移动,调整大小...等
窗口在调整大小后立即收到WM_SIZE消息(由MFC中的OnSize处理程序处理),因此CEdit :: OnSize不是我们要的内容。
正如Rob指出的那样,我们应该在框架类中和该处理函数中添加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 veriable CEdit myEdit which you need to resize/more myEdit.MoveWindow(w/5, h/5, w/2, h/2); }
其他人指出,WM_SIZE是我们应在此时处理并调整子控件大小的消息。调整大小后发送WM_SIZE。
我们可能还想处理在调整大小时发送的WM_SIZING消息。这样,我们可以在用户仍拖动鼠标的同时主动调整子窗口的大小。处理WM_SIZING并不是绝对必要的,但是它可以提供更好的用户体验。
我使用CodeGuru的CResize类自动调整所有控件的大小。我们告诉我们如何调整每个控件的大小,并为我们完成工作。
调整大小范例是指定当调整对话框大小时控件的每一侧将移动多少。
SetResize(IDC_EDIT1, 0, 0, 0.5, 1); SetResize(IDC_EDIT2, 0.5, 0, 1, 1);
当我们有大量对话框控件时,非常方便。
源代码