MFC 多文档视图架构

news2024/11/20 8:25:38

目录

多文档视图架构

模仿多文档视图架构

执行流程


多文档视图架构

一个多文档视图架构运行后会是下面的样子:

内部的子框架窗口就相当于一个单文档视图架构,多文档视图架构就相当于在外面套一层框架窗口。

特点:可以管理多个文档(可以有多个文档类对象,即可以有多个数据)区别于单文档视图架构

模仿多文档视图架构

参与架构的类:CMDIFrameWnd(主框架窗口)、CMDIChildWnd(子框架窗口)、CWinApp(应用程序类)、CView(视图类)、CDocument(文档类)

需要用到的类:CDocTemplate(文档模板类)、CMultiDocTemplate(多文档模板类,文档模板类的子类)、CDocManager(文档管理类)

代码如下:

#include <afxwin.h>
#include "resource.h"

class CMyDoc : public CDocument{
	DECLARE_DYNCREATE( CMyDoc )
};
IMPLEMENT_DYNCREATE( CMyDoc, CDocument )

class CMyView : public CView{
	DECLARE_DYNCREATE( CMyView )
public:
	virtual void OnDraw( CDC* pDC );
};
IMPLEMENT_DYNCREATE( CMyView, CView )

// 视图类必须重写OnDraw虚函数
void CMyView::OnDraw( CDC* pDC ){
	pDC->TextOut( 100, 100, "我是视图窗口" ); 
}
class CMyChild : public CMDIChildWnd{ 
	DECLARE_DYNCREATE( CMyChild )
};
IMPLEMENT_DYNCREATE( CMyChild, CMDIChildWnd )

// 继承主框架窗口类的类不能使用动态创建机制
class CMyFrameWnd : public CMDIFrameWnd{ //自己造主框架窗口类的对象
};

class CMyWinApp : public CWinApp{//自己造应用程序类的对象
public:
	virtual BOOL InitInstance( );
};
BOOL CMyWinApp::InitInstance( ){
	CMyFrameWnd* pFrame = new CMyFrameWnd;  // new一个主框架窗口类对象
	pFrame->LoadFrame( IDR_MENU1 );  // 给主框架窗口挂上菜单
	m_pMainWnd = pFrame;           // theApp->m_pMainWnd =  主框架窗口类对象
	pFrame->ShowWindow( SW_SHOW );
	pFrame->UpdateWindow( );

	// new一个多文档类对象
	CMultiDocTemplate* pTemplate = new CMultiDocTemplate( 
		IDR_MENU2,  // 给子框架窗口挂上菜单
		RUNTIME_CLASS(CMyDoc),
		RUNTIME_CLASS(CMyChild),
		RUNTIME_CLASS(CMyView)
	);

	// 
	AddDocTemplate( pTemplate );

	OnFileNew( );//创建文档类对象,创建子框架类对象,创建子框架窗口,创建视图类对象,创建视图窗口,文档类对象和视图类对象关联
	OnFileNew( );//创建文档类对象,创建子框架类对象,创建子框架窗口,创建视图类对象,创建视图窗口,文档类对象和视图类对象关联
	OnFileNew( );//创建文档类对象,创建子框架类对象,创建子框架窗口,创建视图类对象,创建视图窗口,文档类对象和视图类对象关联

	return TRUE;
}


CMyWinApp theApp;  //爆破点 

运行结果:

注意:需要给一个字符串资源,用于(父、子)框架窗口的标题命名

执行流程

在这里下断点,看看主框架窗口类对象的创建,this指针是pFrame主框架窗口类对象

调用函数LoadFrame(),this指针是pFrame主框架窗口类对象

调用Create函数创建

调用CreateEx函数,接下来就是之前分析的:

  • 给 CREATESTRUCT cs; 结构体成员赋值
  • 调用 PreCreateWindow(cs) :(1)注册窗口类(2)cs为空的成员重新赋值
  • AfxHookWindowCreate(this); (1)埋个钩子,类型是WHCBD  (2)this是pFrame,保存到全局变量_AFX_THREAD_STATE中
  • 调用WIN API函数CreateWindowEx  创建主框架消息,消息会被钩子处理函数勾走。(1)pFrame对象与框架句柄绑定 (2)调用AfxWndProc函数

创建一个多文档模板类对象,触发构造函数,this指针是pTemplate

进入构造函数,接下来会调用父类的构造函数

赋值给多文档模板类对象的成员变量

m_doclist是多文档模板类对象pTemplate的成员变量,保存多个文档类对象地址

断言判断要求必须是空,之后的文档类对象会保存到这里

调用函数AddDocTemplate(),this指针是theApp

theApp对象的一个成员变量是m_pDocManager

调用函数AddDocTemplate(),this指针是m_pDocManager

把多文档模板类对象保存到m_templateList中

函数执行完毕,就形成下面的关系

调用函数 OnFileNew( );this指针是theApp

调用函数 OnFileNew( );this指针是theApp的成员m_pDocManager,文档管理类对象地址

取出多文档模板类对象地址,存储在pTemplate

调用函数OpenDocumentFile,函数内部this为多文档模板类对象地址

函数内部this为多文档模板类对象地址,调用函数CreateNewDocument();this指针是多文档模板类对象地址

动态创建文档类对象,并返回对象地址;

调用函数AddDocument()函数内部this为多文档模板类对象地址

将文档类对象扔到多文档模板类的链表成员中

调用CreateNewFrame函数内部this为多文档模板类对象地址

动态创建框子架类对象,并返回对象地址  

创建子框架窗口

所以OnFileNew()函数,创建文档类对象,创建子框架类对象,创建子框架窗口,创建视图类对象,创建视图窗口,文档类对象和视图类对象关联

 

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

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

相关文章

【hcie-cloud】【21】容器详解【容器网络说明、容器存储说明、容器镜像说明、dockerfile详述、缩略词】【下】

文章目录 容器介绍&#xff0c;容器工作机制、容器常用命令说明容器网络容器网络简介容器常用网络类型 - Bridge容器常用网络类型 - Host容器常用网络类型 - None其他容器网络类型【Macvlan、Overlay、IPvlan】容器网络相关配置 容器存储容器中应用数据的存储容器持久化存储配置…

猫粮的选择:买主食冻干猫粮要注意什么

由于猫咪是肉食动物&#xff0c;对蛋白质的需求很高&#xff0c;如果摄入的蛋白质不足&#xff0c;就会影响猫咪的成长。而冻干猫粮本身因为制作工艺的原因&#xff0c;能保留原有的营养成分和营养元素&#xff0c;所以冻干猫粮蛋白含量比较高&#xff0c;营养又高&#xff0c;…

控制障碍函数(Control Barrier Function,CBF) 三、代码

三、代码实现 3.1、模型 这是一个QP问题&#xff0c;所以我们直接建模 这其实还是之前的那张图&#xff0c;我们把这个大的框架带入到之前的那个小车追击的问题中去&#xff0c;得到以下的一些具体的约束条件 CLF约束 L g V ( x ) u − δ ≤ − L f V ( x ) − λ V ( x ) …

速学python·输入输出

和用户交互 程序与用户交互工程中 用户把信息传送给程序的过程是 输入 程序把结果展示给用户的过程是 输出 输入输出的最简单的方法是利用控制台 例如 和 都是控制台,进行输入和输出的作用 但是: 我们常见的交互界面,例如QQ,浏览器,Wegame等,都不需要输入命令,大大简化了操…

热度不减!一周61篇,二区以上近一半!| 孟德尔随机化周报(12.27-01.02)

欢迎报名2024年孟德尔随机化方法高级班课程&#xff01; 郑老师团队开设的孟德尔随机化高级班2024年1月20-21日开课&#xff0c;欢迎报名 孟德尔随机化,Mendilian Randomization&#xff0c;简写为MR&#xff0c;是一种在流行病学领域应用广泛的一种实验设计方法&#xff0c;利…

selenium爬取多个网站及通过GUI界面点击爬取

selenium爬取代码 webcrawl.py import re import time import json from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.common.exceptions import TimeoutException, Stale…

Java:手工触发FullGC及堆占用过高常用分析方法

目录 一、手工触发FullGC方式 1、通过代码 2、通过工具 二、堆占用过高常用分析方法 1、查看堆占用情况 2、手工触发FullGC 3、查看对象占用堆的情况 4、分析可疑对象 使用如下命令查看java进程中内存的使用情况 jstat -gcutil <pid> 5000 发现运行中的java进程堆…

07、Kafka ------ 消息生产者(演示 发送消息) 和 消息消费者(演示 监听消息)

目录 Kafka --- 消息生产者★ 消息★ 消息的分发机制★ 分发到哪个分区★ 轮询策略&#xff08;round-robin&#xff09;★ 使用命令行工具发送消息演示添加消息 Kafka --- 消息消费者★ 消息消费者命令▲ 监听 【指定主题】 的所有消息:▲ 监听 【指定主题、指定分区】的所有消…

AI与低代码解锁无限可能

前言 近年来&#xff0c;人工智能&#xff08;AI&#xff09;和低代码开发技术逐渐成为数字化转型的重要推动力。AI作为一项具有革命性潜力的技术&#xff0c;正在改变我们生活的方方面面。而低代码开发则提供了一种快速构建应用程序的方法&#xff0c;使得开发者无需深入编写…

【刷题日记】青少年CTF-A2 Crypto(全)

Caesar 题目难度&#xff1a;★ 题目描述&#xff1a;凯撒大帝在很早的时候发明了这个&#xff0c;你能解密出来吗&#xff1f;flag格式为&#xff1a;qsnctf{xxx}。 下载附件&#xff0c;题目提示告诉我们是凯撒了&#xff0c;一个简单的移位操作。 使用在线解码网站&#…

C语言基础语法跟练

题源&#xff1a;牛客网 1、输出"Hello Nowcoder!"。开始你的编程之旅吧。 #include <stdio.h>int main() {printf("Hello Nowcoder!");return 0; } 2、KiKi学会了printf在屏幕输出信息&#xff0c;他想输出一架小飞机。请帮他编写程序输出这架小…

react native中使用tailwind并配置自动补全

使用的第三方库是tailwind-react-native-classnames&#xff0c;同类的也有tailwind-rn&#xff0c;但是我更喜欢前者官方demo&#xff1a; import { View, Text } from react-native; import tw from twrnc;const MyComponent () > (<View style{twp-4 android:pt-2 b…

智能化配网故障定位技术:未来发展趋势与应用前景

在当今这个科技高速发展的时代&#xff0c;智能化技术已经渗透到了我们生活的方方面面。作为电力行业的重要组成部分&#xff0c;配电网的自动化和智能化水平也在不断提高。本文将重点介绍一种基于成熟的行波测距技术的智能化配网故障定位技术——配网行波型故障预警与定位系统…

iPhone语音备忘录怎么导出?这3种方法任你选择!

作为iPhone用户&#xff0c;我们应该会经常使用语音备忘录来记录一些重要的信息。有时候&#xff0c;我们可能需要将这些语音备忘录导出&#xff0c;以方便分享或备份。iphone语音备忘录怎么导出&#xff1f;今天&#xff0c;小编将为大家介绍3种导出iPhone语音备忘录的方法&am…

PyTorch: torch.nn 子模块及其在循环神经网络中的应用

目录 torch.nn子模块详解 nn.utils.rnn.PackedSequence 参数说明 注意事项 示例代码 nn.utils.rnn.pack_padded_sequence 参数说明 返回值 注意事项 示例代码 nn.utils.rnn.pad_packed_sequence 参数说明 返回值 注意事项 示例代码 nn.utils.rnn.pad_sequence …

FPGA之按键消抖

目录 1.原理 2.代码 2.1 key_filter.v 2.2 tb_key_filter.v 1.原理 按键分为自锁式按键和机械按键&#xff0c;图左边为自锁式按键 上图为RS触发器硬件消抖&#xff0c;当按键的个数比较多时常常使用软件消抖。硬件消抖会使用额外的器件占用电路板上的空间。 思路就是使用延…

XS5018B是一款针对 CMOS 图像传感器的高性价比图像信号处理芯片

产品概述 XS5018B 是一款针对 CMOS 图像传感器的高性价比图像信号处理芯片&#xff0c;支持 1M/2M 像素 图像传感器&#xff0c;一组 10-bit DVP 输入接口&#xff0c; ISP 具备优异的 3D 降噪功能&#xff0c;标清模拟输出支持 960H &#xff0c; 高清模拟输出支…

NR cell配置带宽时,如何设置carrierBandwidth?

NR中带宽在38.101中有规定。 如上是FR1 38.101-1中与带宽设定有关的table&#xff0c;协议中根据SCS规定的传输带宽和可以配置的RB 数如上表&#xff0c;也就是说在实网下或者lab测试配置带宽时要根据上表内容去配置&#xff0c;举例如下。 如上图分别是几种带宽的配置参数&…

设备管理系统建设方案书

1.设备管理系统 1.1.系统概述 需求描述 建立设备信息库&#xff0c;对设备相关档案的登录、整理。通过建立完善的设备档案&#xff0c;将设备的各类原始信息进行信息化统一管理&#xff0c;使设备档案查询工作方便快捷&#xff0c;维修管理&#xff0c;针对维修计划、维修工单…

2024律师课程推荐:iCourt律师执行实务集训营(赠《执行实务大礼包》)

律师行业竞争激烈&#xff0c;想要突破困境&#xff0c;就一定要把握蓝海机遇&#xff0c;实现提早布局。 如今&#xff0c;还有哪些业务是尚未被“卷起来”的“蓝海业务”&#xff1f; 从数据来看&#xff0c;执行业务一定是其中之一。 在 Alpha 系统中&#xff0c;以“执行…