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

【MFC】11.MFC文档和单文档架构-笔记

MFC文档

之前我们在写字符雨的时候,将数据都存储到了视图类中,这是不合理的,视图类只负责显示,不应该存储任何数据

文档:专门存储数据用的

CDocument

文档与视图的关系:


创建一个文档类

单文档四个类都集齐了

通过LoadFrame函数来创建

我们在应用程序类中InitInstance函数中,删除掉原来的Create方法:

class MyDoc:public CDocument{}
CCreateContext pContext;
pContext.m_pNewViewClass = RUNTIME_CLASS(MyView);
pContext.m_pCurrentDoc = new myDoc;
pFrame.LoadFrame(IDR_MENU,WS_OVERLAPPEDWINDOW,NULL,&pContext);

这样写出来之后,我们发现窗口也能够运行

LoadFrame{Create/注册,修改回调函数地址
}

视图类是什么时候创建的?

视图和文档的关系绑定在什么时候?


Create注册窗口,埋了钩子,修改了回调函数

WM_CREATE消息

出发钩子函数

去消息数组里遍历有没有WM_CREATE消息,如果有的话,处理

在WM_CREATE消息中,创建了视图

视图.Create也会触发WM_CREATE消息,我们在视图类中处理:

如果视图类和文档类没有绑定,会崩溃(这里交给视图类处理WM_CREATE消息)就省略了绑定的过程,所以就没有绑定

CCreateContext pContext;
pContext.m_pNewViewClass = RUNTIME_CLASS(MyView);//视图静态结构体类信息
pContext.m_pCurrentDoc = new myDoc;//文档对象地址
//内部this指针:框架
pFrame->LoadFrame(.....,&pContext);
{Create(...pContext){CreateEx(......pContext){CREATESTRUCT cs;cs.lpCreateParams = lpParam;CreateWindowEx(cs结构体成员)}}
}

框架类WM_CREATE消息处理:

CFrameWnd::OnCreate(cs);{//取出pContextCCreateContext* pContext = (CCreateContext*)lpcs->lpCreateParams;//参数为pContextOnCreateHelper(lpcs, pContext);{OnCreateClient(lpcs, pContext){//第一个参数context结构体CreateView(pContext, AFX_IDW_PANE_FIRST){//动态创建视图CWnd* pView = (CWnd*)pContext->m_pNewViewClass->CreateObject();pView->Create(.....pContext){//this指针视图对象CreateEx(.....pContext);{CREATESTRUCT cs;cs.lpCreateParams = pContext;CreateWindowEx(cs结构体)//....又触发了WM_CREATE消息}}}}}}

视图类又处理WM_CREATE消息:

CEditView::OnCreate(cs);
{CCtrlView::OnCreate(lpcs) {//又取出了ContextCCreateContext* pContext = (CCreateContext*)lpcs->lpCreateParams;pContext->m_pCurrentDoc->AddView(视图对象);//this{//this指针 是不是文档类this->m_viewList.AddTail(pView);//视图类对象成员 保存文档pView->m_pDocument = this;	}}
}

一个文档可以绑定多个视图(多个视图可以绑定同一个文档)

afxGetApp(); MFC全局变量 --获取到应用程序类 theapp
theapp 有个变量 存储着框架类对象
m_pMainWnd 有个变量 活动视图 拿到视图类对象

  • WM_COMMAND消息处理顺序的问题

文档和视图如何交互:

文档类::UpdateAllViews 通知所有视图文档已被修改的消息

视图类::OnUpdate----如果文档类数据发生改变 你怎么绘制

	GetDocument 返回与视图相连接的文档   返回文档类对象

MFC单文档架构:

只有一个文档类

//单文档架构的模板类 
CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMFCApplication8Doc),	//文档类 类信息 RUNTIME_CLASS(CMainFrame),      	//框架类 类信息RUNTIME_CLASS(CMFCApplication8View));	//视图类类信息
{this->m_pOnlyDoc = NULL;this->m_pDocClass = pDocClass;this->m_pFrameClass = pFrameClass;this->m_pViewClass = pViewClass;
}//内部this指针应用程序类
//参数单文档模板类
this->AddDocTemplate(pDocTemplate);
{//微软未公开:文档管理//应用程序类-->有个成员是文档管理this->m_pDocManager = new CDocManager;//内部this指针文档管理m_pDocManager->AddDocTemplate(pTemplate);{//文档管理类 链表成员保存了 单文档模板地址m_templateList.AddTail(pTemplate);}
}m_nShellCommand = FileNew;ProcessShellCommand(cmdInfo)
{OnFileNew(){m_pDocManager->OnFileNew(){//多态 文档模板类 ----->单文档模板类CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();//内部this指针单文档模板类pTemplate->OpenDocumentFile(NULL){OpenDocumentFile(lpszPathName, TRUE, bMakeVisible);{CDocument* pDocument = NULL;CFrameWnd* pFrame = NULL;//动态创建文档类CDocument* pDocument = (CDocument*)m_pDocClass->CreateObject();m_pOnlyDoc = pDoc;}pFrame = CreateNewFrame(pDocument, NULL);CCreateContext context;context.m_pCurrentFrame = pOther;context.m_pCurrentDoc = pDoc;//动态创建框架类对象CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();}}}
}

相关文章:

【MFC】11.MFC文档和单文档架构-笔记

MFC文档 之前我们在写字符雨的时候,将数据都存储到了视图类中,这是不合理的,视图类只负责显示,不应该存储任何数据 文档:专门存储数据用的 CDocument 文档与视图的关系: 创建一个文档类 单文档四个类都…...

2023年“研究生科研素养提升”系列公益讲座在线测评题目与参考答案

一、单选题 1、关于参考文献的选择,说法错误的是 ( ) 参考文献的选择有原创性、必要性的原则 不能过度引用 不能故意隐藏引用来源 可以引用无关参考文献 您的答案:D 参考答案:D 答案解析:不可以引用无关参考…...

MySQL8.xx一主两从复制安装与配置

搭建环境: 查看系统版本cat /etc/redhat-release [rootwww tools]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 查看内核版本cat /proc/version 目标: 一主两从 主机IP 主机名称 端口 搭建环境 安装目录192.168.1.100 docker…...

深度学习优化器

1、什么是优化器 优化器用来寻找模型的最优解。 2、常见优化器 2.1. 批量梯度下降法BGD(Batch Gradient Descent) 2.1.1、BGD表示 BGD 采用整个训练集的数据来计算 cost function 对参数的梯度: 假设要学习训练的模型参数为W,代价函数为J(W),…...

由浅入深C系列五:使用libcurl进行基于http get/post模式的C语言交互应用开发

使用libcurl进行基于http get/post模式的C语言交互应用开发 简介环境准备在线资源示例代码测试调用运行结果 简介 大多数在linux下的开发者,都会用到curl这个命令行工具。对于进行restful api的测试等,非常方便。其实,这个工具还提供了一个C…...

高效实用小工具之Everything

一,简介 有时候我们电脑文件较多时,想快速找到某个文件不是一件容易的事情,实用windows自带的搜素太耗时,效率不高。今天推荐一个用来搜索电脑文件的小工具——Everything,本文将介绍如何安装以及使用everything&…...

【Unity每日一记】关于物体(敌方)检测—(向量点乘相关)

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…...

Elasticsearch-查询

一、查询和过滤 1.1 相关性分数 :_score 默认情况下,Elasticsearch 按相关性得分对匹配的搜索结果进行排序,相关性得分衡量每个文档与查询的匹配程度。 相关性分数是一个正浮点数,在搜索的数据字段中返回。_score越高&#xff0…...

首发 | FOSS分布式全闪对象存储系统白皮书

一、 产品概述 1. 当前存储的挑战 随着云计算、物联网、5G、大数据、人工智能等新技术的飞速发展,数据呈现爆发式增长,预计到2025年中国数据量将增长到48.6ZB,超过80%为非结构化数据。 同时,数字经济正在成为我国经济发展的新…...

Java反射获取所有Controller和RestController类的方法

Java反射获取所有Controller和RestController类的方法 引入三方反射工具Reflections <dependency><groupId>org.reflections</groupId><artifactId>reflections</artifactId><version>0.10.2</version> </dependency>利用反…...

设计模式--策略模式

目录 一.场景 1.1场景 2.2 何时使用 2.3个人理解 二. 业务场景练习 2.1业务: 2.2具体实现 2.3思路 三.总结 3.1策略模式的特点&#xff1a; 3.2策略模式优点 3.3策略模式缺点 一.场景 1.1场景 许多相关的类仅仅是行为有异&#xff0c;也就是说业务代码需要根据场景不…...

VSCode使用SSH无密码连接Ubuntu

VSCode使用SSH无密码连接Ubuntu 前提条件&#xff1a; 1. 能够正常使用vscode的Remote-ssh连接Ubuntu 2. Ubuntu配置静态ip&#xff08;否则经常需要修改Remote-ssh的配置文件里的IP&#xff09; 1. windows下 打开Win下的PowerShell&#xff0c;生成公钥和私钥 ssh-keygen…...

通过版本号控制强制刷新浏览器或清空浏览器缓存

背景介绍 在我们做 web 项目时&#xff0c;经常会遇到一个问题就是&#xff0c;需要 通知业务人员&#xff08;系统用户&#xff09;刷新浏览器或者清空浏览器 cookie 缓存的情况。 而对于用户而言&#xff0c;很多人一方面不懂如何操作&#xff0c;另一方面由于执行力问题&am…...

Redis系列(二):深入解读Redis的两种持久化方式

博客地址&#xff1a;blog.zysicyj.top Redis为什么要引入持久化机制 Redis引入持久化机制是为了解决内存数据库的数据安全性和可靠性问题。虽然内存数据库具有高速读写的优势&#xff0c;但由于数据存储在内存中&#xff0c;一旦服务器停止或崩溃&#xff0c;所有数据将会丢失…...

CNN之图像识别

文章目录 1. 图像识别1.1 模式识别1.2 图像识别的过程1.3 图像识别的应用 2. 深度学习发展2.1 深度学习为何崛起2.2 分类与检测2.3 常见的卷积神经网络 3. VGG3.1 VGG163.2 VGG16的结构&#xff1a;3.3 使用卷积层代替全连接3.4 1*1卷积的作用3.5 VGG16代码示例 4. 残差模型-Re…...

nvcc not found

检查cuda 安装成功 nvidia-smiCommand ‘nvcc’ not found, apt install nvidia-cuda-toolkitnvcc fatal : No input files specified&#xff1b; use option --help for more information # 注意是大写 V nvcc -V export PATH"/usr/local/cuda/bin:$PATH" expor…...

pdf怎么转换成jpg图片?这几个转换方法了解一下

pdf怎么转换成jpg图片&#xff1f;转换PDF文件为JPG图片格式在现代工作中是非常常见的需求&#xff0c;比如将PDF文件中的图表、表格或者图片转换为JPG格式后使用在PPT演示、网页设计等场景中。 【迅捷PDF转换器】是一款非常实用的工具&#xff0c;可以将PDF文件转换成多种不同…...

六轴机械臂码垛货物堆叠仿真

六轴机械臂码垛货物堆叠仿真 1、建立模型与仿真 clear,clc,close all addpath(genpath(.)) %建立模型参数如下&#xff1a; L(1) Link( d, 0.122, a , 0 , alpha, pi/2,offset,0); L(2) Link( d, 0.019 , a ,0.408 , alpha, 0,offset,pi/2); L(3) Link( d, …...

text-decoration 使用

text-decoration text-decoration 用于设置文本上的装饰性线条的外观。 它是 text-decoration-line、text-decoration-style、text-decoration-color 和text-decoration-thickness的缩写。 text-decoration: underline wavy red;text-decoration-line 设置文本装饰类型 可以…...

linux shell快速入门

linux shell快速入门 0 、前置1、简单使用 0 、前置 一安装linux的虚拟环境 1、简单使用 1、新建/usr/shell目录 2、新建hello.sh 文件 3、编写脚本文件# !/bin/bashecho "hello world"查看是否具备执行权限 新增执行权限 chomd x hello.sh执行hello.sh文件 /b…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...