逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法

本节课在线学习视频(网盘地址,保存后即可免费观看):

​​​​https://pan.quark.cn/s/a165bd3ba6f3​​

Microsoft Foundation Class (MFC) 是用于创建基于 Windows 的应用程序的 C++ 库。它提供了丰富的类库来简化 Windows 编程,使得开发者可以更方便地创建图形用户界面 (GUI)。本文将介绍如何在 MFC 中进行视图分割以及如何在窗口程序中添加图标,并通过多个代码案例展示具体实现。

1. 视图分割

视图分割是一种将窗口区域划分为多个子区域的方法,每个子区域可以显示不同的内容。MFC 提供了 ​​CSplitterWnd​​ 类来实现视图的分割。

1.1 基本视图分割

首先,我们将介绍如何在 MFC 中实现基本的视图分割。

案例1:水平和垂直分割视图
  1. 创建一个 MFC 应用程序。
  2. 在 ​​MainFrm.h​​ 文件中,添加分割窗口成员变量:
class CMainFrame : public CFrameWnd {
protected:CSplitterWnd m_wndSplitter;public:virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);...
};
  1. 在 ​​MainFrm.cpp​​ 文件中,实现 ​​OnCreateClient​​ 方法:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {// 创建一个静态分割窗口,垂直分为两部分if (!m_wndSplitter.CreateStatic(this, 1, 2)) {AfxMessageBox(_T("Failed to create splitter window"));return FALSE;}// 在分割窗口的两个部分中创建视图if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMyView), CSize(200, 200), pContext) ||!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMyView), CSize(200, 200), pContext)) {AfxMessageBox(_T("Failed to create views"));return FALSE;}return TRUE;
}

在这个例子中,我们创建了一个静态的分割窗口,并将其垂直分为两部分,每个部分都包含一个视图。

1.2 动态视图分割

动态视图分割允许用户在运行时调整分割窗口的大小。

案例2:动态调整视图分割

在 ​​MainFrm.cpp​​ 中,修改 ​​OnCreateClient​​ 方法:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) {// 创建一个动态分割窗口,水平分为两部分if (!m_wndSplitter.CreateStatic(this, 2, 1)) {AfxMessageBox(_T("Failed to create splitter window"));return FALSE;}// 在分割窗口的两个部分中创建视图if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMyView), CSize(200, 200), pContext) ||!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CMyView), CSize(200, 200), pContext)) {AfxMessageBox(_T("Failed to create views"));return FALSE;}return TRUE;
}

在这个例子中,我们创建了一个动态的分割窗口,并将其水平分为两部分,每个部分都包含一个视图。

2. 在窗口程序中添加图标

在 Windows 窗口程序中添加图标可以增强用户界面的视觉效果。MFC 提供了简单的方法来设置窗口的图标。

2.1 添加资源文件

首先,确保在资源文件中添加了所需的图标文件(例如,​​IDI_MYICON​​)。

2.2 在窗口程序中设置图标

在 ​​CMainFrame​​ 类中设置图标。

案例3:在主窗口中添加图标
  1. 在 ​​MainFrm.h​​ 文件中,添加成员变量:
class CMainFrame : public CFrameWnd {
protected:HICON m_hIcon;public:virtual BOOL PreCreateWindow(CREATESTRUCT& cs);...
};
  1. 在 ​​MainFrm.cpp​​ 文件中,加载并设置图标:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {if (!CFrameWnd::PreCreateWindow(cs))return FALSE;// 加载图标m_hIcon = AfxGetApp()->LoadIcon(IDI_MYICON);cs.hIcon = m_hIcon;return TRUE;
}int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CFrameWnd::OnCreate(lpCreateStruct) == -1)return -1;// 设置小图标和大图标SetIcon(m_hIcon, TRUE);  // 大图标SetIcon(m_hIcon, FALSE); // 小图标return 0;
}

在这个例子中,我们在 ​​PreCreateWindow​​ 方法中加载了图标,并在 ​​OnCreate​​ 方法中设置了窗口的小图标和大图标。

2.3 在对话框中添加图标

如果需要在对话框中添加图标,可以在对话框类中进行设置。

案例4:在对话框中添加图标
  1. 在对话框类的头文件中,添加成员变量:
class CMyDialog : public CDialogEx {
protected:HICON m_hIcon;public:virtual BOOL OnInitDialog();...
};
  1. 在对话框类的实现文件中,加载并设置图标:
BOOL CMyDialog::OnInitDialog() {CDialogEx::OnInitDialog();// 加载图标m_hIcon = AfxGetApp()->LoadIcon(IDI_MYICON);// 设置小图标和大图标SetIcon(m_hIcon, TRUE);  // 大图标SetIcon(m_hIcon, FALSE); // 小图标return TRUE;
}

在这个例子中,我们在 ​​OnInitDialog​​ 方法中加载了图标,并设置了对话框的小图标和大图标。

3. 注意事项

  • 确保图标文件添加到资源中:在设置图标之前,确保所需的图标文件已经正确添加到资源文件中。
  • 使用正确的资源ID:在加载图标时,使用正确的资源ID(例如 ​​IDI_MYICON​​)以确保图标能够正确加载。
  • 处理错误情况:在加载和设置图标时,处理可能的错误情况,例如加载图标失败等。

结语

本文详细介绍了如何在 MFC 中进行视图分割以及如何在窗口程序中添加图标。通过这些案例,可以帮助你更好地理解和应用 MFC 提供的功能,提高代码的可读性和复用性。在实际开发中,合理运用这些技术,可以显著提升应用程序的用户体验和开发效率。希望这些示例和注意事项能帮助你更好地掌握 MFC 的使用技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/29213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开发工具】git服务器端安装部署+客户端配置

自己安装一个轻量级的git服务端,仅仅作为代码维护,尤其适合个人代码管理。毕竟代码的版本管理是很有必要的。 这里把git服务端部署在centos系统里,部署完成后可以通过命令行推拉代码,进行版本和用户管理。 一、服务端安装配置 …

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 内存访问热度分析(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 &#x1f…

windows环境下,怎么查看本机的IP、MAC地址和端口占用情况

1.输入ipconfig,按回车。即查看了IP地址,子码掩码,网关信息。 2.输入ipconfig/all,按回车。即查看了包含IP地址,子码掩码,网关信息以及MAC地址 3.我们有时在启动应用程序的时候提示端口被占用,如何知道谁占有了我们需要…

Vue57-组件的自定义事件_解绑

给谁绑的自定义事件,就找谁去触发;给谁绑的自定义事件,就找谁去解绑; 一、解绑自定义事件 1-1、解绑一个自定义事件 到student.vue组件中去解绑。 1-2、解绑多个自定义事件 使用数组来解绑多个。 1-3、解绑所有的自定义事件 二、…

Android Studio无法连接夜神模拟器的解决方案

一、AS检测不到夜神模拟器 1、问题描述 在按照教程【如何安装和使用Android夜神模拟器】进入夜神的bin目录,输入连接命令回车后,终端显示的already connected to 127.0.0.1:62001,但是AS的Running Devices并没有显示夜神模拟器。 2、解决方…

Node.js 入门:

Node.js 是一个开源、跨平台的 JavaScript 运行时环境,它允许开发者在浏览器之外编写命令行工具和服务器端脚本。以下是一些关于 Node.js 的基础教程: 1. **Node.js 入门**: - 了解 Node.js 的基本概念,包括它是一个基于 Chro…

Arm和高通的法律之争将扰乱人工智能驱动的PC浪潮

Arm和高通的法律之争将扰乱人工智能驱动的PC浪潮 科技行业高管和专家表示,两大科技巨头之间长达两年的法律大战可能会扰乱人工智能驱动的新一代个人电脑浪潮。 上周,来自微软(Microsoft)、华硕(Asus)、宏碁(Acer)、高通(Qualcomm)等公司的高管在台北举行…

IPV6 地址分类1

1、单播地址(ABC) 一对一 只有单播地址能作为源地址,也可作为目标地址 2、多播(组播)地址 (224——239) 一对多 作为目标地址 3、任意播地址-----一到最近 单播地址 1、AGUA 全球…

【HarmonyOS NEXT】如何通过h5拉起应用(在华为浏览器中拉起应用)

华为浏览器支持拉起外部应用 浏览器访问网页经常会遇到deeplink的场景。当前处理方案统一为使用AMS系统能力startAbility去隐式拉起。传递的want参数为 { "actions": "ohos.want.action.viewData", "uri": deeplink链接 } 网页需要给自己的应用拉…

计算机毕业设计Python+Vue.js知识图谱音乐推荐系统 音乐爬虫可视化 音乐数据分析 大数据毕设 大数据毕业设计 机器学习 深度学习 人工智能

开发技术 协同过滤算法、机器学习、LSTM、vue.js、echarts、django、Python、MySQL 创新点协同过滤推荐算法、爬虫、数据可视化、LSTM情感分析、短信、身份证识别 补充说明 适合大数据毕业设计、数据分析、爬虫类计算机毕业设计 介绍 音乐数据的爬取:爬取歌曲、…

clip_en的使用学习

代码分析 import torch import cn_clip.clip as clip from PIL import Image from cn_clip.clip import load_from_name, available_modelsprint("Torch version:", torch.__version__) device "cuda" if torch.cuda.is_available() else "cpu"…

第 10 章 监控系统 | 实战案例 - Nginx 监控

👉 本文目标:为 Nginx 安装 nginx-prometheus-exporter,实现对 Nginx 的监控。 👀 本文内容: 安装 Nginx Prometheus Exporter,暴露 Nginx 指标配置 Prometheus 抓取 Nginx Prometheus Exporter 暴露的指标数据【配置 Recording Rule,便于缓存/加速 Dashboard 频繁访问…

深度学习推理显卡设置

深度学习推理显卡设置 进入NVIDIA控制面板,选择 “管理3D设置”设置 "低延时模式"为 "“超高”"设置 “电源管理模式” 为 “最高性能优先” 使用锁频来获得稳定的推理 法一:命令行操作 以管理员身份打开CMD查看GPU核心可用频率&…

【如何使用python获取excel中sheet页的样式】

如何使用python获取excel中sheet页的样式 要获取Excel中sheet页的样式,特别是单元格的样式,如字体、颜色、边框等,你可以使用openpyxl库,但需要深入一些底层的操作,因为openpyxl的主要API不直接暴露这些样式信息。 以…

云计算 | (四)基本云安全

文章目录 📚基本云安全🐇云安全背景🐇基本术语和概念⭐️风险(risk)⭐️安全需求🐇威胁作用者⭐️威胁作用者(threat agent)⭐️匿名攻击者(anonymous attacker)⭐️恶意服务作用者(malicious service agent)⭐️授信的攻击者(trusted attacker)⭐️恶意的内部人员(mal…

Web自动化测试框架(基础篇)--Selenium WebDriver工作原理和环境搭建

文章目录 引言一、Selenium WebDriver简介二、Selenium WebDriver工作原理2.1 架构概述2.2 通信机制2.3 支持的浏览器 三、环境搭建3.1 安装Python3.2 安装pip3.3 安装Selenium3.4 下载WebDriver 四、编写第一个测试脚本4.1 导入Selenium库4.2 启动WebDriver4.3 打开网页4.4 执…

有趣且重要的JS知识合集(22)树相关的算法

0、举例&#xff1a;树形结构原始数据 1、序列化树形结构 /*** 平铺序列化树形结构* param tree 树形结构* param result 转化后一维数组* returns Array<TreeNode>*/ export function flattenTree(tree, result []) {if (tree.length 0) {return result}for (const …

开发一个python工具,pdf转图片,并且截成单个图片,然后修整没用的白边

今天推荐一键款本人开发的pdf转单张图片并截取没有用的白边工具 一、开发背景&#xff1a; 业务需要将一个pdf文件展示在前端显示&#xff0c;但是基于各种原因&#xff0c;放弃了h5使用插件展示 原因有多个&#xff0c;文件资源太大加载太慢、pdf展示兼容性问题、pdf展示效果…

CSDN 自动上传图片并优化Markdown的图片显示

文章目录 完整代码一、上传资源二、替换 MD 中的引用文件为在线链接参考 完整代码 完整代码由两个文件组成&#xff0c;upload.py 和 main.py&#xff0c;放在同一目录下运行 main.py 就好&#xff01; # upload.py import requests class UploadPic: def __init__(self, c…

力扣每日一题 6/17 枚举+双指针

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 522.最长特殊序列II【中等】 题目&#xff1a; 给定字符串列表 strs &…