(1)改变窗口大小,会响应WM SIZING——OnSizing(),WM GETMINMAXINFO——OnGetMinMaxInfo(),WM SIZI——OnSize()三个消息函数;
如何添加消息函数:
在对话框属性中点击消息图标,会弹出所有的WM消息;
找到对应的消息,右边选择<Add> OnSize即可;
具体实现:
1、在*Dlg.h文件中添加CList<CRect, CRect&> m_listRect;
2、在OnInitDialog()添加以下代码,记录默认窗口和控件大小
CRect rect;
GetWindowRect(&rect);
m_listRect.AddTail(rect);//对话框的区域
CWnd* pWnd = GetWindow(GW_CHILD);//获取子窗体
while (pWnd)
{
pWnd->GetWindowRect(rect);//子窗体的区域
m_listRect.AddTail(rect); //CList<CRect,CRect> m_listRect成员变量
pWnd = pWnd->GetNextWindow();//取下一个子窗体
}
3、添加消息函数OnSizing(),并在函数内添加以下代码,用于调整控件大小;
void CcounterDlg::OnSizing(UINT fwSide, LPRECT pRect)
{
CDialogEx::OnSizing(fwSide, pRect);
if (m_listRect.GetCount() > 0)
{
CRect dlgNow;
GetWindowRect(&dlgNow);
POSITION pos = m_listRect.GetHeadPosition();//第一个保存的是对话框的Rect
CRect dlgSaved;
dlgSaved = m_listRect.GetNext(pos);
ScreenToClient(dlgNow);
float x = dlgNow.Width() * 1.0 / dlgSaved.Width();//根据当前和之前保存的对话框的宽高求比例
float y = dlgNow.Height() * 1.0 / dlgSaved.Height();
ClientToScreen(dlgNow);
CRect childSaved;
CWnd* pWnd = GetWindow(GW_CHILD);
while (pWnd)
{
childSaved = m_listRect.GetNext(pos);//依次获取子窗体的Rect
childSaved.left = dlgNow.left + (childSaved.left - dlgSaved.left) * x;//根据比例调整控件上下左右距离对话框的距离
childSaved.right = dlgNow.right + (childSaved.right - dlgSaved.right) * x;
childSaved.top = dlgNow.top + (childSaved.top - dlgSaved.top) * y;
childSaved.bottom = dlgNow.bottom + (childSaved.bottom - dlgSaved.bottom) * y;
ScreenToClient(childSaved);
pWnd->MoveWindow(childSaved);
pWnd = pWnd->GetNextWindow();
}
}
return;
// TODO: 在此处添加消息处理程序代码
}
特别注意:要注意给控件的ID命新名,否则控件不会随着主界面同比例变化。