在MFC中调整控件的大小

时间:2020-03-06 14:39:57  来源:igfitidea点击:

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

当我们有大量对话框控件时,非常方便。

源代码