首先,一个窗口是否可以拖动改变大小决定于border的属性,
仅当border为Resizing是窗口可以拖动改变大小,其它属性时则不可以。
例子:
通常,主窗体上有TabCtrl控件,并且有通过TabCtrl加载的子窗口,在子窗口有ListCtrl控件和Button,那么:
当主窗体缩放时,需要同步放大TabCtrl和当前子窗口,并且当子窗口被缩放时,上面的ListCtrl个Button控件也要跟着调整大小和位置。
方法如下:
步骤一:重载主窗口的WM_SIZE方法,用于处理TabCtrl和其子窗口的缩放结果。注意不要使用WM_SIZING,否则缩放过程会闪烁。
//窗体缩放事件
void CAppConfigDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
CRect rect;
GetClientRect(&rect);
//TabCtrl缩放处理
if (m_TabCtrl.GetSafeHwnd())
{
m_TabCtrl.MoveWindow(0, 0, rect.Width(), rect.Height());
}
//子页面缩放处理
if (m_clsUploadAPK.GetSafeHwnd())
{
rect.left += 4;
rect.top += 30;
rect.right -= 3;
rect.bottom -= 3;
m_clsUploadAPK.MoveWindow(&rect);
}
}
步骤二:重载主窗口WM_SIZING方法,用于锁定窗体最小尺寸,这个需要在缩放过程中不断控制。如果不想控制最小尺寸,可以忽略此步骤。
//锁定窗口最小尺寸
void CAppConfigDlg::OnSizing(UINT fwSide, LPRECT pRect)
{
CDialogEx::OnSizing(fwSide, pRect);
// TODO: 在此处添加消息处理程序代码
if (pRect->right - pRect->left < m_nMinWidth)
{
pRect->right = pRect->left + m_nMinWidth;
}
if (pRect->bottom - pRect->top < m_nMinHeight)
{
pRect->bottom = pRect->top + m_nMinHeight;
}
}
步骤三:重载子窗口的WM_SIZE方法,用于处理子窗口上面ListCtrl和Button的位置调整
//控件位置调整
void CUploadAPK::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
//调整ListCtrl
if (m_ctrApkList.GetSafeHwnd())
{
m_ctrApkList.MoveWindow(5, 47, cx - 12, cy - 85);
}
//调整按钮
CRect rect;
((CButton*)GetDlgItem(IDC_Upload))->GetClientRect(&rect);
((CButton*)GetDlgItem(IDC_Upload))->MoveWindow(cx - rect.Width() - 10, cy - rect.Height() - 10, rect.Width(), rect.Height());
}