之前是等比例缩放,不适用于所有情况,比如界面太大的情况,控件会被等比例放大。现在记录一种可以在拖拽界面时,控件位置相对不变,也不会失真。
首先将对话框的属性进行设置 如下图
然后添加OnSize函数(mfc处理对话框大小变化自动调用此函数,可在类向导中找到),内容如下
void CHH23::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
if(GetDlgItem(IDOK) != NULL) //在控件被创建后界面变化才执行
{
CRect rect,rectCpy;
GetClientRect(&rect);
rect.DeflateRect(5,5);
rectCpy = rect;
CWnd *WND = NULL;
WND= GetDlgItem(IDC_STATIC);//groupbox
rectCpy.left = rect.right - 75;
rectCpy.bottom = rect.top + 220;
WND->MoveWindow(rectCpy,0);
WND= GetDlgItem(IDC_BUTTON1);
rectCpy.top += 22;
rectCpy.left += 10;
rectCpy.right -= 10;
rectCpy.bottom = rectCpy.top + 21;
WND->MoveWindow(rectCpy,0);
WND= GetDlgItem(IDC_BUTTON6);
rectCpy.top += 20;
rectCpy.bottom += 20;
WND->MoveWindow(rectCpy,0);
WND= GetDlgItem(IDC_BUTTON7);
rectCpy.top += 20;
rectCpy.bottom += 20;
WND->MoveWindow(rectCpy,0);
WND= GetDlgItem(IDC_BUTTON8);
rectCpy.top += 20;
rectCpy.bottom += 20;
WND->MoveWindow(rectCpy,0);
rectCpy = rect;
rectCpy.left = rect.right - 35;
rectCpy.top = rect.bottom - 35;
WND= GetDlgItem(IDCANCEL);
WND->MoveWindow(rectCpy);
rectCpy.left = rect.right - 75;
rectCpy.right = rect.right - 40;
WND= GetDlgItem(IDOK);
InvalidateRect(rect);
rect.DeflateRect(-5,-5);
}
// TODO: 在此处添加消息处理程序代码
}
OnSize中主要是对GropuBox控件做了相对位置设定,然后其区域内控件位置根据 GropuBox控件位置计算出来。
对话框界面如下
当拖动和最大最小化时界面的groupbox所在区域保持相对不变。