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

MFC界面全自动等比例缩放

1.在初始化里 枚举每个控件记录所有控件rect

2.在OnSize里,根据当前窗口和之前保存的窗口的宽高求比例x、y

3.枚举每个控件,根据比例x、y调整控件上下左右,并移动到新rect

cpp 复制代码
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); //使用的是 客户区坐标
	} 
}
相关推荐
superman超哥15 小时前
Rust HashSet与BTreeSet的实现细节:集合类型的底层逻辑
开发语言·后端·rust·编程语言·rust hashset·rust btreeset·集合类型
浩瀚地学15 小时前
【Java】异常
java·开发语言·经验分享·笔记·学习
张np15 小时前
java基础-LinkedHashMap
java·开发语言
gihigo199815 小时前
基于MATLAB的周期方波与扫频信号生成实现(支持参数动态调整)
开发语言·matlab
行者9615 小时前
Flutter适配OpenHarmony:国际化i18n实现中的常见陷阱与解决方案
开发语言·javascript·flutter·harmonyos·鸿蒙
csbysj202015 小时前
RSS 阅读器:全面解析与使用指南
开发语言
xie_pin_an15 小时前
C++ 从入门到进阶:核心知识与实战指南
java·c++·算法
溪海莘15 小时前
如何部署使用uv管理依赖的python项目 ?
开发语言·python·uv
我送炭你添花15 小时前
Python与串口:从基础到实际应用——以Pelco KBD300A模拟器项目为例
开发语言·python·自动化·运维开发
No0d1es15 小时前
2025年12月 GESP CCF编程能力等级认证C++八级真题
开发语言·c++·青少年编程·gesp·ccf