原文出处忘了
自适应大小一般分为对话框自适应大小和控件自适应大小。
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表示对话框变化的宽度。