【MFC】C++所有控件随窗口大小全自动等比例缩放源码(控件内字体、列宽等未调整) 20250124

时间:2025-01-26 22:25:47
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); //使用的是 客户区坐标 } }