MFC界面全自动等比例缩放
1.在初始化里 枚举每个控件记录所有控件rect
2.在OnSize里,根据当前窗口和之前保存的窗口的宽高求比例x、y
3.枚举每个控件,根据比例x、y调整控件上下左右,并移动到新rect
struct ControlInfo {
CWnd* pControl;
CRect originalRect;
};
std::vector<ControlInfo> m_controls;
BOOL CProductionTestingDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 记录父窗口及其子窗口的原始位置和大小
CRect rect;
GetWindowRect(&rect); // 父窗口
m_controls.push_back({ this, rect });
// 获取所有子控件的信息
CWnd* pWnd = GetWindow(GW_CHILD);
while (pWnd)
{
pWnd->GetWindowRect(rect);
ScreenToClient(rect); //将屏幕坐标系中的点转换为客户端坐标系(即窗口的内容区域,去掉了边框和标题栏)中的点。
m_controls.push_back({ pWnd, rect });
pWnd = pWnd->GetNextWindow();
}
ShowWindow(SW_MAXIMIZE);
return TRUE;
}
void CProductionTestingDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// 如果没有控件,则不做任何操作
if (m_controls.empty()) return;
// 获取当前窗口大小,计算比例
CRect nowDlgRect;
GetWindowRect(&nowDlgRect);
//根据当前窗口和之前保存的窗口的宽高求比例
float xScale = (float)nowDlgRect.Width() / m_controls[0].originalRect.Width();
float yScale = (float)nowDlgRect.Height() / m_controls[0].originalRect.Height();
// 调整控件的大小和位置
for (auto& controlInfo : m_controls) {
// 跳过父窗口
if (controlInfo.pControl == this) continue;
// 根据比例计算新的矩形
CRect newRect ;
newRect.left = (int)(controlInfo.originalRect.left * xScale);
newRect.top = (int)(controlInfo.originalRect.top * yScale);
newRect.right = (int)(controlInfo.originalRect.right * xScale);
newRect.bottom = (int)(controlInfo.originalRect.bottom * yScale);
// 移动并调整控件
controlInfo.pControl->MoveWindow(newRect); //使用的是 客户区坐标
}
}