IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> MFC等比例放大控件与文字,等比例自适应控件位置 -> 正文阅读

[C++知识库]MFC等比例放大控件与文字,等比例自适应控件位置

原文

头文件定义

#pragma once

#include "framework.h"

#include <map>
#include <tuple>

class CScaleWnd : public CDialogEx
{
public:
	// 标准构造函数
	CScaleWnd();
	CScaleWnd(UINT nIDTemplate, CWnd* pParent = NULL);
protected:
	// 原始窗口宽高
	int m_width, m_heigth;
	// 控件ID映射原始窗口位置、字体信息
	std::map<int, CRect> m_table;
	// 控件ID映射原始字体
	std::map<int, CFont*> m_fontTable;
	// 控件ID映射原始字体
	std::map<int, CFont*> m_fontNewTable;
	// 重设刷新控件位置
	void ReSize(void);
	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
public:
	afx_msg void OnSize(UINT nType, int cx, int cy);
	DECLARE_MESSAGE_MAP()
};


具体实现

#include "pch.h"

#include "CScaleWnd.h"

CScaleWnd::CScaleWnd()
{
}

CScaleWnd::CScaleWnd(UINT nIDTemplate, CWnd* pParent) : CDialogEx(nIDTemplate, pParent)
{
}

BEGIN_MESSAGE_MAP(CScaleWnd, CDialogEx)
	ON_WM_SIZE()
END_MESSAGE_MAP()

void CScaleWnd::ReSize(void)
{
	float fsp[2]{};
	POINT Newp{}; //获取现在对话框的大小  
	CRect recta;
	GetClientRect(&recta);     //取客户区大小    
	Newp.x = recta.right - recta.left;
	Newp.y = recta.bottom - recta.top;
	fsp[0] = (float)Newp.x / m_width;
	fsp[1] = (float)Newp.y / m_heigth;
	HWND  hwndChild = ::GetWindow(m_hWnd, GW_CHILD);
	while (hwndChild) {
		int woc = ::GetDlgCtrlID(hwndChild);//取得ID  
		CRect rect = m_table[woc];
		rect.left = long(rect.TopLeft().x * fsp[0]);
		rect.top = long(rect.TopLeft().y * fsp[1]);
		rect.right = long(rect.BottomRight().x * fsp[0]);
		rect.bottom = long(rect.BottomRight().y * fsp[1]);
		GetDlgItem(woc)->MoveWindow(rect, TRUE);

		CFont* oldFont = m_fontTable[woc];
		LOGFONT lf;
		oldFont->GetLogFont(&lf);
		float change = fsp[0] > fsp[1] ? fsp[1] : fsp[0];
		lf.lfWidth = lf.lfWidth * change;
		lf.lfHeight = lf.lfHeight * change;

		CFont* font = new CFont();
		font->CreateFontIndirectW(&lf);
		GetDlgItem(woc)->SetFont(font);
		::DeleteObject(m_fontNewTable[woc]);
		delete m_fontNewTable[woc];
		m_fontNewTable[woc] = font;
		hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
	}
}

BOOL CScaleWnd::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	CRect rect;
	GetClientRect(&rect);  //获取对话框的大小
	m_width = rect.right - rect.left;
	m_heigth = rect.bottom - rect.top;
	CPoint  tlPoint, brPoint;
	HWND  hwndChild = ::GetWindow(m_hWnd, GW_CHILD);
	while (hwndChild) {
		int woc = ::GetDlgCtrlID(hwndChild);//取得ID  
		GetDlgItem(woc)->GetWindowRect(&rect);
		LOGFONT lf;
		GetDlgItem(woc)->GetFont()->GetLogFont(&lf);
		ScreenToClient(&rect);
		tlPoint = rect.TopLeft();
		brPoint = rect.BottomRight();
		rect.SetRect(tlPoint, brPoint);
		m_table.insert(std::make_pair(woc, rect));
		CFont* font = new CFont();
		font->CreateFontIndirectW(&lf);
		m_fontTable.emplace(std::make_pair(woc, GetDlgItem(woc)->GetFont()));
		m_fontNewTable.emplace(std::make_pair(woc, font));
		hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
	}
	return TRUE;
}


void CScaleWnd::OnSize(UINT nType, int cx, int cy) {
	CDialogEx::OnSize(nType, cx, cy);
	//窗口最小化不操作
	if (nType != SIZE_MINIMIZED)
	{
		ReSize();
	}
}

测试效果

  1. 初始
    ::: hljs-center

在这里插入图片描述

:::

  1. 横向拉宽
    ::: hljs-center

在这里插入图片描述

:::

  1. 纵向拉高
    ::: hljs-center

在这里插入图片描述

:::

  1. 整体缩小

::: hljs-center

在这里插入图片描述

:::

源码地址

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:04:24  更:2022-03-16 22:05:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:10:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码