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

文章目录

  • 单文档定义
  • 新建一个单文档应用程序
    • 单文档应用程序组成:
      • 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.mzph.cn/bicheng/74973.shtml

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

相关文章

C++ 初阶总复习 (16~30)

C 初阶总复习 (16~30) 目的16. 2009. volatile关键字的作用17. 2010.什么是多态 简单介绍下C的多态18. 2011. 什么是虚函数 介绍下C中虚函数的原理19. 2012 构造函数可以是虚函数嘛20. 2013.析构函数一定要是虚函数嘛?21. 2015. 什么是C中的虚…

第一天 Linux驱动程序简介

目录 一、驱动的作用 二、裸机驱动 VS linux驱动 1、裸机驱动 2、linux驱动 三、linux驱动位于哪里? 四、应用编程 VS 内核编程 1、共同点 2、不同点 五、linux驱动分类 1、字符设备 2、块设备 3、网络设备 六、Linux驱动学习难点与误区 1、学习难点 …

PaddleX产线集成功能的使用整理

一、环境搭建 1.1 安装paddle-gpu 需要根据安装机器的cuda的版本,选择合适的版本进行安装 #安装paddle-gpu 官网链接 https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/pip/linux-pip.html python -m pip install paddle…

docker-compese 启动mysql8.0.36与phpmyadmin,并使用web连接数据库

1、找一个文件夹,比如 E:\zqy\file\mysql,cd到这个目录下创建文件docker-compose.yml 2、将下面的代码块复制到docker-compose.yml文件中 version: 3.3 services:mysql:image: mysql:8.0.36container_name: mysqlrestart: alwaysports:- 3306:3306netw…

解决 Gradle 构建错误:Could not get unknown property ‘withoutJclOverSlf4J’

解决 Gradle 构建错误:Could not get unknown property ‘withoutJclOverSlf4J’ 在构建 Spring 源码或其他基于 Gradle 的项目时,可能会遇到如下错误: Could not get unknown property withoutJclOverSlf4J for object of type org.gradle…

mcp 接freecad画齿轮

from mcp.server.fastmcp import FastMCP import freecad.gears.commands import os from freecad import app from freecad import part mcp FastMCP("Demo")mcp.tool() def create_gear(num_teeth20,height10,double_helix True):"""创建一个渐开线…

【大前端系列19】JavaScript核心:Promise异步编程与async/await实践

JavaScript核心:Promise异步编程与async/await实践 系列: 「全栈进化:大前端开发完全指南」系列第19篇 核心: 深入理解Promise机制与async/await语法,掌握现代异步编程技术 📌 引言 在JavaScript的世界中,异步编程是无…

如何排查java程序的宕机和oom?如何解决宕机和oom?

排查oom 用jmap生成我们的堆空间的快照Heap Dump(堆转储文件),来分析我们的内存占用 用可视化工具,例如java中的jhat分析Heap Dump文件 ,它分析完会通过一个浏览器打开一个可视化页面展示分析结果 根据oom的类型来调…

什么是 OLAP 数据库?企业如何选择适合自己的分析工具

引言:为什么企业需要 OLAP 数据库? 你是否曾经经历过这样的场景: 市场部门急需一份用户行为分析报告,数据团队告诉你:“数据太大了,报表要跑 4 个小时”;业务负责人在会议中提出一个临时性分析…

测试:认识Bug

目录 一、软件测试的生命周期 二、bug 一、软件测试的生命周期 软件测试贯穿于软件的生命周期。 需求分析: ⽤⼾⻆度:软件需求是否合理 技术⻆度:技术上是否可⾏,是否还有优化空间 测试⻆度:是否存在业务逻辑错误、…

综合实验2

1、sw1和sw2之间互为备份 [sw1]interface Eth-Trunk 0 (创建聚合接口) [sw1-Eth-Trunk0]trunkport g0/0/1 (将物理接口划入到聚合接口中) [sw1-Eth-Trunk0]trunkport g0/0/2 [sw2]interface Eth-Trunk 0 [sw2-Eth-T…

【ArcGIS】ArcGIS10.6彻底卸载和ArcGIS10.2安装全过程

卸载python3后,解决了ArcGIS与python3冲突问题后,软件可以正常打开使用了 但是还是出现了问题 用ArcGIS 进行空间分析时,中间操作没有任何报错和问题,但是就是没有运行结果 在别人的软件上操作一遍可以出现运行结果 关闭确有这个,但真的不是我给它的运行时间不够,反反复复试…

Django之旅:第五节--Mysql数据库操作(一)

Django开发操作数据库更简单,内部提供了ORM框架 一、安装第三方模块 pip install mysqlclient注:最新的django框架需要使用mysqlclient模块,之前pymysql模块与django框架有编码兼容问题。 二、ORM 1、ORM可以帮助我们做两件事:…

docker部署mongodb数据库

1、下载 MongoDB 镜像 使用Docker部署MongoDB 之前,我们需要从 Docker Hub 上下载 MongoDB 镜像。这里我们下载最新版本的 MongoDB 镜像,使用以下命令进行下载: docker pull mongo:latest 下载完成后,我们就拥有了最新版本的 Mon…

Enhanced PEC-YOLO:电力施工场景安全装备检测的轻量化算法解析

目录 一、核心概述 二、核心创新点 1. ​C2F_Faster_EMA模块 2. ​SPPF_CPCA多尺度模块 3. ​BiFPN颈部网络

【人工智能】解锁大模型潜力:Ollama 与 DeepSeek 的分布式推理与集群部署实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的快速发展,其推理能力在自然语言处理、代码生成等领域展现出巨大潜力。然而,单机部署难以满足高并发、低延迟的需…

RTMP推流服务器nginx在linux上的编译部署

RTMP(Real-Time Messaging Protocol)推流确实需要服务器支持‌。RTMP推流服务器的主要功能是接收来自推流客户端的数据流,对其进行处理和转发。服务器会根据RTMP协议与客户端建立连接,处理推流数据(如转码、录制等&…

PyQt6实例_批量下载pdf工具_主线程停止线程池

目录 前置: 代码: 视频: 前置: 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头,放在 【PyQt6实例】 专栏 2 本系列涉及到的PyQt6知识点: 线程池:QThreadPool,QRunnable; 信号与…

Tomcat生产服务器性能优化

试想以下这个情景:你已经开发好了一个程序,这个程序的排版很不错,而且有着最前沿的功能和其他一些让你这程序增添不少色彩的元素。可惜的是,程序的性能不怎么地。你也十分清楚,若现在把这款产品退出市场,肯…

正则表达式-笔记

文章目录 一、正则表达式二、正则表达式的基本语法字符类普通字符非打印字符特殊字符 量词限定符锚点修饰符(标记) 三、在 Python 中使用正则表达式简单搜索提取信息替换文本 参考 从验证用户输入,到从大量文本中提取特定信息,再到…