当前位置: 首页 > article >正文

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

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); //使用的是 客户区坐标
	} 
}


http://www.kler.cn/a/519330.html

相关文章:

  • Doris Schema Change 常见问题分析
  • 二叉搜索树中的众数(力扣501)
  • 基于SpringBoot的网上考试系统
  • 数据结构——堆(C语言)
  • Spring整合Mybatis、junit纯注解
  • 电脑无法开机,重装系统后没有驱动且驱动安装失败
  • [LeetCode] 字符串 I — 344#反转字符串 | 541#反转字符串II | 54K替换数字
  • 如何获取小程序的code在uniapp开发中
  • 系统架构设计师教材:信息系统及信息安全
  • 读后感:《The Clean Coder: A Code of Conduct for Professional Programmers》
  • websocket实现
  • 【DGL系列】dgl中为graph指定CSR/COO/CSC矩阵格式
  • HTB:Support[WriteUP]
  • docker-制作镜像gcc添加jdk运行java程序
  • 2025-1-25 c++学习中关于static,初始化列表,友元函数和友元类的问题
  • 算法:模拟的巧妙演绎
  • 【MySQL】 表的操作
  • 思科交换机telnet配置案例
  • 第23篇:Python开发进阶:详解测试驱动开发(TDD)
  • ubuntu22.04 系统 A100显卡 深度学习环境配置记录
  • 嵌入式知识点总结 ARM体系与架构 专题提升(二)-ARM处理器
  • Smalltalk语言是何物?面向对象鼻祖Simula的诞生?Simula和Smalltalk有什么区别?面向对象设计?
  • 嵌入式C语言:回调函数
  • Java实现经典算法题之模拟双指针用法
  • xss靶场
  • 免费获取Photoshop及其他设计软件的使用权限