原文出处忘了
自适应大小一般分为对话框自适应大小和控件自适应大小。
1.对话框自适应大小
//在屏幕中央 高度和宽度是屏幕的一半 int cx = GetSystemMetrics( SM_CXSCREEN ); int cy = GetSystemMetrics( SM_CYSCREEN ); ::MoveWindow(m_hWnd,cx/8,cy/8,cx*3/4,cy*3/4,true);
其中的m_hWnd 为对话框的句柄,cx、cy是屏幕的高度和宽度;MoveWindow()函数是移动对话框到起点为:(cx/8,cy/8),大小为(cx*3/4,cy*3/4),最后的true是重画整个对话框,如果为false,则不重画真个对话框。
2.控件自适应大小
响应 WM_SIZE消息
void CCVDeviceOnlineTblCompareDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if(nType == SIZE_MINIMIZED) return;
// 原本窗体大小尚没有初始化,则直接退出
if (m_RectOrigi.Width() != 0 &&
m_RectOrigi.Height()!= 0 ){
CRect rectNew;
GetWindowRect(&rectNew);
// 如果新的窗体宽度与原本的窗体宽度不同或是高度小于原本宽度,则恢复原本的窗体大小;
// 即:只允许用户拉伸窗体高度。
if( (rectNew.Width() != m_RectOrigi.Width())) {
MoveWindow(rectNew.left, rectNew.top, m_RectOrigi.Width(), rectNew.Height());
return;
}
if( (rectNew.Height() < m_RectOrigi.Height())) {
MoveWindow(rectNew.left, rectNew.top, rectNew.Width(), m_RectOrigi.Height());
return;
}
}
// 与上一次窗体高度或是宽度的相差
CSize SizeOff(cx - m_OldSize.cx, cy-m_OldSize.cy);
// 改变窗体内控件的位置,参数即为offset值
::EnumChildWindows(GetSafeHwnd(), EnumProc, (LPARAM)&SizeOff);
if(GetDlgItem(IDD_CVDEVICEONLINETBLCOMPARE_DIALOG)->GetSafeHwnd())
{
if(nType == SIZE_MAXIMIZED)
GetDlgItem(IDD_CVDEVICEONLINETBLCOMPARE_DIALOG)->ShowWindow(SW_HIDE);
else
GetDlgItem(IDD_CVDEVICEONLINETBLCOMPARE_DIALOG)->ShowWindow(SW_SHOW);
}
// 更新窗体旧大小,用于下一次做比较。
m_OldSize =CSize(cx,cy);
Invalidate();
if (bInitOK == TRUE)
{
OnCbnSelchangeComboStandardpoc();
}
// TODO: Add your message handler code here
}
其中的EnumChildWindows为全局函数,定义如下:
BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam) { CWnd* pWnd = CWnd::FromHandle(hwnd); CSize* pSizeOff =(CSize*)lParam; CCVDeviceOnlineTblCompareDlg* pDlg = (CCVDeviceOnlineTblCompareDlg*)pWnd->GetParent(); if(!pDlg) return FALSE; CRect rect; pWnd->GetWindowRect(rect); pDlg->ScreenToClient(rect); //比较站CListCtrl拉长 if( hwnd == pDlg->m_ComparePoc.GetSafeHwnd()) { pWnd->MoveWindow( rect.left, //左上坐标不变 rect.top, //右上坐标不变 rect.Width()+pSizeOff->cx, //宽度拉长 rect.Height(), //高度不变 FALSE); } //全选按钮 if( hwnd == pDlg->m_AllSelectButton.GetSafeHwnd()) { pWnd->MoveWindow( rect.left+pSizeOff->cx, rect.top, rect.Width(), rect.Height(), FALSE); } //比较内容 if( hwnd == pDlg->m_CompareShow.GetSafeHwnd()) { pWnd->MoveWindow( rect.left, rect.top, rect.Width()+pSizeOff->cx, rect.Height()+pSizeOff->cy, FALSE); } //比较按钮 if( hwnd == pDlg->m_CompareButton.GetSafeHwnd()) { pWnd->MoveWindow( rect.left, rect.top+pSizeOff->cy, rect.Width(), rect.Height(), FALSE); } //仅差异按钮 if( hwnd == pDlg->m_OnlyDifferenceButton.GetSafeHwnd()) { pWnd->MoveWindow( rect.left, rect.top+pSizeOff->cy, rect.Width(), rect.Height(), FALSE); } //退出按钮 if( hwnd == pDlg->m_QuitButton.GetSafeHwnd()) { pWnd->MoveWindow( rect.left+pSizeOff->cx, rect.top+pSizeOff->cy, rect.Width(), rect.Height(), FALSE); } return TRUE; }
其中if语句块即为控件的拉伸和移动,pSizeOff->cx为对话框变化的长度,pSizeOff->cy表示对话框变化的宽度。