windows第二十章 单文档应用程序

news2025/4/2 16:53:07

文章目录

  • 单文档定义
  • 新建一个单文档应用程序
    • 单文档应用程序组成:
      • APP应用程序类
      • 框架类(窗口类)
      • 视图类(窗口类,属于框架的子窗口)
      • 文档类(对数据进行保存读取操作)
  • 直接用向导创建单文档
  • 案例演示

单文档定义

只能编辑一个文档,比如说画图,一次只能开一个,开2个就要打开2个程序,能够处理一个或者多个文件、文档、业务的程序
多文档就是类似win11的记事本程序,打开一个程序能编辑很多记事本窗口

新建一个单文档应用程序

资源添加,几个资源名可以相同在这里插入图片描述
相同的才能一起添加进去,因为创建的时候只能传1个ID

单文档应用程序组成:

在这里插入图片描述

APP应用程序类

FirstSDI.h

#pragma once
#include "pch.h"

class FirstSdiApp : public CWinApp
{
	BOOL InitInstance();
};

FirstSDI.cpp

#include "FirstSDI.h"
#include "CFirstDocument.h"
#include "MainFrame.h"
#include "CChildView.h"

BOOL FirstSdiApp::InitInstance()
{
	//SDI文档模版对象
	CSingleDocTemplate* pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,//资源ID,包含(图标,菜单,工具栏,快捷键资源)
		RUNTIME_CLASS(CFirstDocument),//文档类
		RUNTIME_CLASS(CMainFrame),//框架类
		RUNTIME_CLASS(CChildView));//视图类
	//添加文档模版对象
	AddDocTemplate(pDocTemplate);
	//解析命令行信息
	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);
	//执行命令行参数命令
	if (!ProcessShellCommand(cmdInfo))
		return FALSE;
	//显示主框架窗口
	m_pMainWnd->ShowWindow(SW_SHOW);
	m_pMainWnd->UpdateWindow();
	return TRUE;
}

FirstSdiApp theApp;

这里的命令行参数,比如你双击打开一个xxx.txt,双击的过程,就会传递一个命令行参数,就会使用文本文档这个程序打开

框架类(窗口类)

MainFrame.h

#pragma once
#include "pch.h"
class CMainFrame :
	public CFrameWnd
{
	DECLARE_DYNCREATE(CMainFrame)
};

MainFrame.cpp

#include "MainFrame.h"

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

  • 此框架类可以添加十八章做过的菜单,工具栏,状态栏
    在这里插入图片描述
  • 也可以修改标题风格,通过PreCreateWindow这个虚函数添加
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	cs.style &= ~FWS_ADDTOTITLE;//去掉标题栏
	cs.style &= ~WS_THICKFRAME;//去掉边框
	cs.cx = 300;//宽度
	cs.cy = 300;//高度

	return CFrameWnd::PreCreateWindow(cs);
}

  • 还有专门修改标题的虚函数 OnUpdateFrameTitle
void CMainFrame::OnUpdateFrameTitle(BOOL bAddToTitle)
{

	//SetWindowText(L"第一个SDI应用程序");//直接设置标题
	//CFrameWnd::OnUpdateFrameTitle(bAddToTitle);
	CDocument* pDoc = GetActiveDocument();
	if (pDoc != NULL)
	{
		SetWindowText(pDoc->GetTitle());//从文档类中获取标题
	}
}

视图类(窗口类,属于框架的子窗口)

CChildView.h

#pragma once
#include "pch.h"
class CChildView :
	public CView
{
	DECLARE_DYNCREATE(CChildView)
	virtual void OnDraw(CDC* /*pDC*/);
};

CChildView.cpp

#include "CChildView.h"
IMPLEMENT_DYNCREATE(CChildView, CView)
void CChildView::OnDraw(CDC* /*pDC*/)
{
	// TODO: 在此添加专用代码和/或调用基类
}

  • 视图也有个OnInitialUpdate虚函数,类似于对话框的OnInitDialog
void CChildView::OnInitialUpdate()
{

	CView::OnInitialUpdate();
	MessageBeep(MB_ICONASTERISK);//蜂鸣
}

  • 如果视图调用了OnPaint虚函数,那么要在虚函数里调用OnDraw
  • 视图里面设置背景
BOOL CChildView::OnEraseBkgnd(CDC* pDC)
{
	CRect rect;
	GetClientRect(&rect);
	pDC->FillSolidRect(rect, RGB(255, 0, 0));
	return TRUE;
	//return CView::OnEraseBkgnd(pDC);
}
  • 如果视图里面背景设置透明,那么就能看到下面一层框架的颜色,如果在框架类里设置了绘图,那么就能看到,只不过平时视图盖在框架上面,看不到

文档类(对数据进行保存读取操作)

跟前一章介绍的一样,只不过添加了宏
CFirstDocument.h

#pragma once
#include "pch.h"
class CFirstDocument :
	public CDocument
{
	DECLARE_DYNCREATE(CFirstDocument)
};


CFirstDocument.cpp

#include "CFirstDocument.h"
IMPLEMENT_DYNCREATE(CFirstDocument, CDocument)

直接用向导创建单文档

  1. 填入项目名在这里插入图片描述
  2. 点击创建,选择单个文档
    在这里插入图片描述
    项目样式选window 经典样式
  3. 点完成,和之前手动创建的一样,只是多了一些内容在这里插入图片描述

案例演示

涂格子游戏

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

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

相关文章

通信协议之串口

文章目录 简介电平标准串口参数及时序USART与UART过程引脚配置 简介 点对点,只能两设备通信只需单向的数据传输时,可以只接一根通信线当电平标准不一致时,需要加电平转换芯片(一般从控制器出来的是信号是TTL电平)地位…

Java入门知识总结——章节(二)

ps:本章主要讲数组、二维数组、变量 一、数组 数组是一个数据容器,可用来存储一批同类型的数据 🔑:注意 类也可以是一个类的数组 public class Main {public static class Student {String name;int age; // 移除 unsignedint…

Verilog 中寄存器类型(reg)与线网类型(wire)的区别

目录 一、前言 二、基本概念与分类 1.寄存器类型 2.线网类型 三、六大核心区别对比 四、使用场景深度解析 1.寄存器类型的典型应用 2. 线网类型的典型应用 五、常见误区与注意事项 1. 寄存器≠物理寄存器 2.未初始化值陷阱 3.SystemVerilog的改进 六、总结 …

【Linux加餐-验证UDP:TCP】-windows作为client访问Linux

一、验证UDP-windows作为client访问Linux UDP client样例代码 #include <iostream> #include <cstdio> #include <thread> #include <string> #include <cstdlib> #include <WinSock2.h> #include <Windows.h>#pragma warning(dis…

Rust vs. Go: 性能测试(2025)

本内容是对知名性能评测博主 Anton Putra Rust vs. Go (Golang): Performance 2025 内容的翻译与整理, 有适当删减, 相关数据和结论以原作结论为准。 再次对比 Rust 和 Go&#xff0c;但这次我们使用的是最具性能优势的 HTTP 服务器库---Hyper&#xff0c;它基于 Tokio 异步运…

JDBC的详细使用

1. JDBC概述 JDBC[Java Database Connectivity]是 Java 语言中用于连接和操作数据库的一套标准 API。它允许 Java 程序通过统一的方式与各种关系型数据库&#xff0c;如 MySQL、Oracle、SQL Server 等交互&#xff0c;执行 SQL 语句并处理结果。 1.1 JDBC原理 JDBC的核心原理…

瑞芯微 RKrga接口 wrapbuffer_virtualaddr 使用笔记

一、源码 官方在librga中给了很多 demo 以供参考&#xff0c;例如 imresize 操作&#xff1a; /** Copyright (C) 2022 Rockchip Electronics Co., Ltd.* Authors:* YuQiaowei <cerf.yurock-chips.com>** Licensed under the Apache License, Version 2.0 (the &qu…

【数据结构】[特殊字符] 并查集优化全解:从链式退化到近O(1)的性能飞跃 | 路径压缩与合并策略深度实战

并查集的优化 导读一、合并优化1.1 基本原理1.2 按大小合并1.3 按秩合并1.4 两种合并的区别**1.4.1 核心目标****1.4.2 数据存储****1.4.3 合并逻辑****1.4.4 树高控制****1.4.5 适用场景****1.4.6 路径压缩兼容性****1.4.7 极端案例对比****1.4.8 小结**二、查找优化2.1 路径压…

如何在 AI 搜索引擎(GEO)霸屏曝光,快速提升知名度?

虽然大多数人仍然使用 Google 来寻找答案&#xff0c;但正在发生快速转变。ChatGPT、Copilot、Perplexity 和 DeepSeek 等 LLM 已成为主流。这主要是因为每个都有自己的免费和公共版本&#xff0c;并且总是有重大的质量改进。 许多人每天都使用这些工具来提问和搜索互联网&…

VLAN综合实验二

一.实验拓扑&#xff1a; 二.实验需求&#xff1a; 1.内网Ip地址使用172.16.0.0/分配 2.sw1和SW2之间互为备份 3.VRRP/STP/VLAN/Eth-trunk均使用 4.所有Pc均通过DHCP获取IP地址 5.ISP只能配置IP地址 6.所有…

Kubernetes》k8s》Containerd 、ctr 、cri、crictl

containerd ctr crictl ctr 是 containerd 的一个客户端工具。 crictl 是 CRI 兼容的容器运行时命令行接口&#xff0c;可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序。 ctr -v 输出的是 containerd 的版本&#xff0c; crictl -v 输出的是当前 k8s 的版本&#x…

SQL语句及其应用(中)(DQL语句之单表查询)

SQL语句的定义: 概述: 全称叫 Structured Query Language, 结构化查询语言, 主要是实现 用户(程序员) 和 数据库软件(例如: MySQL, Oracle)之间交互用的. 分类: DDL: 数据定义语言, 主要是操作 数据库, 数据表, 字段, 进行: 增删改查(CURD) 涉及到的关键字: create, drop, …

算法题(111):k与迷宫

审题&#xff1a; 本题需要我们寻找迷宫中的所有出口&#xff0c;若有出口需要输出距离最近的出口的距离&#xff0c;若没有就输出-1 时间复杂度&#xff1a;由于边距为1&#xff0c;我们本题采用bfs算法&#xff0c;在最坏的情况下我们需要遍历所有位置&#xff0c;时间复杂度…

Redis-常用命令

目录 1、Redis数据结构 2、命令简介 2.1、通用命令 DEL EXISTS EXPIRE 2.2、String命令 SET和GET MSET和MGET INCR和INCRBY和DECY SETNX SETEX 2.3、Key的层级结构 2.4、Hash命令 HSET和HGET HMSET和HMGET HGETALL HKEYS和HVALS HINCRBY HSETNX 2.5、List命…

从虚拟现实到可持续设计:唐婉歆的多维创新之旅

随着线上线下融合逐渐成为全球家居与建材行业的发展趋势,全球市场对高品质、个性化家居和建材产品的需求稳步攀升,也对设计师提出更高的要求。在这一背景下,设计师唐婉歆将以产品设计师的身份,正式加入跨国企业AmCan 美加集团,投身于备受行业瞩目的系列设计项目。她将负责Showr…

音视频 四 看书的笔记 MediaPlayerService

Binder机制看这里 Binde机智 这是一个分割符 Binder机智 分割(goutou) Binder机制 MediaPlayerService多媒体框架中一个非常重要的服务。MediaPlayerService 我原称之为链接之王 图片来源 MediaPlayer 是客户端 C/S 中的CMediaPlayerService MediaPlayerService::Client 是服…

vmware 创建win10 系统,虚拟机NAT网络设置

虚拟机设置&#xff1a; 物理机本机创建桥接&#xff1a; 如何创建桥接&#xff0c;请自行脑补~

【初阶数据结构】线性表之双链表

文章目录 目录 一、双链表的概念 二、双链表的实现 1.初始化 2.尾插 3.头插 4.打印 5.判断双链表是否为空 6.尾删 7.头删 8.查找 9.在指定的位置之后插入数据 10.删除指定位置的数据 11.销毁 三、完整源码 总结 一、双链表的概念 链表的结构非常多样&#xff0…

智能路由系统-信息泄露漏洞挖掘

1.漏洞描述&#xff1a; Secnet-智能路由系统 actpt_5g.data 信息泄露&#xff0c;攻击者可利用此漏洞收集敏感信息&#xff0c;从而为下一步攻击做准备。 2.fofa搜索语句 title"安网-智能路由系统" || title"智能路由系统" || title"安网科技-智能…

表格图表切换,图表无法展示问题复盘

项目背景 103项目CPC卡使用模块在原有的表格展示数据的基础之上&#xff0c;增加环状饼图图表展示&#xff0c;采用tab切换的方式实现 问题描述 图表无法设置宽高&#xff0c;导致饼图无法渲染 具体代码 // 入口页<el-tabs type"card" class"cts_flex_t…