注意:此方法会使控件等比例变化,导致失真等问题,需要保留控件原始大小详见另一篇MFC控件缩放
首先启用对话框的最大最小属性。
随后在对话框的头文件.h中定义两个成员变量用于保存界面数据
POINT m_pointOld;
CRect m_Rect
然后在对话框的初始化函数OnInitDialog中赋与成员变量界面数据初值。禁用调整大小,因为手动调整大小计算方法还不会。。。。。
GetClientRect(&m_rectInitial); //获取对话框的大小
ModifyStyle(WS_THICKFRAME, 0);//禁用调整大小
GetClientRect(&m_Rect);
m_pointOld.x = m_Rect.right - m_Rect.left;
m_pointOld.y = m_Rect.bottom - m_Rect.top;
然后添加界面的OnSize函数,在这个函数中写入如下即可满足最大化时控件自适应,
void CxxxDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if (nType==SIZE_RESTORED||nType==SIZE_MAXIMIZED) //判断窗口是不是最小化了,因为窗口最小化之后,窗口的长和宽会变为0,这样造成除以0的错误
{
float fsp[2];
POINT NewP; //获取现在对话框的大小
CRect new_rect;
GetClientRect(&new_rect);
NewP.x = new_rect.right - new_rect.left;
NewP.y = new_rect.bottom - new_rect.top;
if (m_pointOld.x == 0.0 || m_pointOld.y == 0.0)
{
return ;
}
fsp[0] = (float)NewP.x / m_pointOld.x;
fsp[1] = (float)NewP.y / m_pointOld.y;
CRect Rect;
int woc;
CPoint OldTLPoint, TLPoint;//左上角
CPoint OldBRPoint, BRPoint;//右下角
HWND hWndChild = ::GetWindow(m_hWnd, GW_CHILD); //列出所有控件
while(hWndChild)
{
woc = ::GetDlgCtrlID(hWndChild); //取得ID
GetDlgItem(woc)->GetWindowRect(Rect);
ScreenToClient(Rect);
OldTLPoint = Rect.TopLeft();
TLPoint.x = (long)(OldTLPoint.x*fsp[0]);
TLPoint.y = (long)(OldTLPoint.y*fsp[1]);
OldBRPoint = Rect.BottomRight();
BRPoint.x = (long)(OldBRPoint.x*fsp[0]);
BRPoint.y = (long)(OldBRPoint.y*fsp[1]);
Rect.SetRect(TLPoint, BRPoint);
GetDlgItem(woc)->MoveWindow(Rect, TRUE);
hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT);
}
m_pointOld = NewP;
}
}