仅当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()); }