vc第11章 单文档多文档
Visual C++语言:第11章 单文档多文档
▪ WriteString
写入字符串
▪ ReadString
读取字符串
▪ ReadClass
读取类信息
▪ WriteClass
写入类信息
▪ Read
读取字节内容
▪ Write
写入字节内容
2020/12/12
CDocument——文档串行化
❖CArchive类的常用成员
▪ operator <<
将基本类型写入流中
当前位置
访问位置
文档
视图
视图
文档
视图
框架
框架
视图
框架
文档
任何位置 应用程序
任何位置 主框架
访问方法 GetFirstViewPosition GetNextView GetDocument
GetParentFrame
GetActiveView
GetActiveDocument
AfxGetApp
AfxGetMainWnd
2020/12/12
CView——的子类
2020/12/12
❖CEditView
▪ 简单的文本编辑器,类似Notepad
❖CScrollView
▪ 支持滚动条的视图
❖CFormView
▪ 窗体视图,支持在上边使用对话框控件
5. Doc/View访问方法
2020/12/12
❖Doc/View结构的几个基本成员经常需要互 相访问,假设某个视图想要获得文档,或 某个框架需要获得活动视图,可以通过下 表提供的方法进行解决。
ON_COMMAND(ID_OPER_SHOW, OnOperShow) //}}AFX_MSG_MAP END_MESSAGE_MAP()
第11章 多文档窗体
11.2 创建多文档窗体
2)MDI窗体的鼠标双击事件DblClick 例如,要想在双击MDI窗体时,实现卸载该MDI窗 体,需要编写的代码如下: Private Sub MDIForm_DblClick() Unload MDIForm1 End Sub 3.Arrang方法 当在MDI窗体中显示多个子窗体或子窗体图标时, 可以根据不同情况改变子窗体的布置方式,Arrang方 法的语法格式为: 对象.Arrang Arrangement
11.2 创建多文档窗体
【例11-1】设计一个在带有子窗体Form1的MDI窗体工 程,通过执行文件菜单的“打开”命令,可以打开多个子 窗体。MDI窗体的菜单如图11-6所示,运行结果如图117所示。(演示)
图11-6 MDI窗体中添加的菜单
图11-7 执行四次“打开”命令的MDI窗体
11.2 创建多文档窗体
应用程序的用户界面主要分为两种形式: 单文档界面(SDI,Single Document Interface)和多文档 界面(MDI,Multiple Document Interface)。 单文档界面并不是指只有一个窗体的界面,而是指应用程序 的各窗体是相互独立的,它们在屏幕上独立显示、移动、最小化 或最大化,与其他窗体无关。在前面创建的所有程序都是单文档 界面。 多文档界面由多个窗体组成,但这些窗体不是独立的。其中 有一个窗体称为父窗体,其他窗体称为他的子窗体。
第11章 多文档窗体
学习目标:
认识单文档窗体与多文档窗体的区别 掌握多文档窗体的创建 了解多文档窗体的属性与事件 掌握多文档窗体的应用
第11章 多文档窗体
11.1 单文档窗体与多文档窗体 11.2 创建多文档窗体
11.3 一个简单的文档编辑器
VC实验讲义--单文档应用程序
第三课MFC单文档应用程序实现举例创建单文档应用程序的一般步骤:利用AppWizard创建单文档应用程序框架。
在文档类中声明保存文档数据所需要数据对象。
完成文档类的OnNewDocument函数,初始化新文档。
完成文档类的Serialize函数,保持和加载文档数据。
完成视类的OnInitialUpdate函数,初始化显示。
完成视类的OnDraw函数,显示当前文档内容。
在视类中加入可以使用户编辑文档数据所需的代码。
本实验指导通过以下 4 个实验循序渐进演示创建单文档应用程序的基本操作,在前一个例子中演练过的操作,在后面的中出现时不再重复描述。
例1 一个简单的单文档应用程序——记事本程序例2 简单文本和图形输出例3 利用定时器输出滚动字幕例1 一个简单的单文档应用程序——记事本程序1. 只要在AppWizard的Step 6将Base Class设置为EditView,AppWizard就自动完成了一个记事本程序的设计:2. 运行程序,即可测试记事本的各种功能:3.说明:(1)打开Workshop中的Class视图,可以看到,一个简单的单文档应用程序向导自动建立五个类:((3)每个类的主要函数:void CAboutDlg::DoDataExchange(CDataExchange* pDX)int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)//创建窗体的工具栏,状态栏等BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)BOOL CXxxApp::InitInstance()void CXxxApp::OnAppAbout()BOOL CXxxDoc::OnNewDocument()//初始化文档字符数据、字体信息等void CXxxDoc::Serialize(CArchive& ar)BOOL CXxxView::PreCreateWindow(CREATESTRUCT& cs)void CXxxView::OnDraw(CDC* pDC)BOOL CXxxView::OnPreparePrinting(CPrintInfo* pInfo)//弹出打印对话框void CXxxView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)void CXxxView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)CXxxDoc* CXxxView::GetDocument() // non-debug version is inline例2 简单文本和图形输出建立一个简单的单文档应用程序SimpleTextPicture,通过修改OnDraw函数在视(View)中输出信息或画图。
单文档与多文档解析
使用AppWizard创建 SDI和MDI界面的应 用程序的过程几乎完 全一样 主 要 差 别
在创建SDI界面的应用程序时,不生成 CChildFrame类,CMainFrame类的基类 为CFrameWnd
在创建MDI界面的应用程序时, CMainFrame类的基类为 CMDIFrameWnd
3
视图是文档的不同表现形式,一个*.html 语言的文件,在浏览器里和在记事本中打 开的表现形式是不同的但它们操作的是同 一个文件这就是一个文档对应两视图
Doc/View框架虽然可以调用成百上千个不 同的类,但是核心类只有五个: CWinApp CDocument CView CDocTemplate CFrameWnd
10
11.2.1 CWinApp 类
CWinApp类代表主程序,CWinApp本身是不可见的,它 负责维护进程的启动、终止、消息循环、命令行参数、 资源管理
视图把数据显示 于计算机屏幕上
视图通过相关联的文档类 的成员函数将经过修改的 数据传递给文档对象
文档对象获得修改过的数据之后,对 其进行必要的修改,最后保存到永久 介质(如磁盘文件)中
用户通过与视图的 交互来查看数据并 对数据进行修改
6
SDI文档/视图应用程序示意图
7
11.1.3 SDI程序中文档、视图对象的创建过程
成员 m_pszAppName M_lpCmdLine M_pMainWnd M_pszExeName M_pszProfileName M_pszRegistrKey LoadCursor LoadIcon 描述 应用程序名 命令行参数 应用程序主窗口指针 可执行文件名 配置INI文件名 配置注册表主键值 加载光标资源 加载图标资源
vc++第11章
10
本章小结
串行接口是PC机上的一种最常见的外部接口,能够以双工 的方式进行通信工作;成本低,编程比较容易;数据传输 安全可靠;但速度相对于USB等新型接口慢。适用于工业 控制领域或两台PC之间的通信。微软所发布的串行通信编 程组件MSComm,封装了串行通信编程所需要的基本功 能。利用MSComm组件进行编程,可以大大简化程序的 复杂性。
9
11.3串口编程实例
基于对话框的串口I通信程序 新建基于对话框的应用程序,项目名为“comm” 打开对话框资源IDD_COMM_DIALOG,在属性窗口设置 属性和事件,在右键菜单中选则“添加变量”,添加成员 变量。 在对话框上右键菜单中选“插入ActiveX控件”,在弹出 的选择框中选中串口组件Microsoft Communications Control Version 6.0,并确认。 打开“类视图”,选择对话框类,在成员列表中选择发送 按钮的映射函数,打开函数的代码段,在其中加入“发送” “接收”等按钮映射函数的程序语句
6
11.2.1 MSComm组件的导入
打开对话框资源,在对话框上打开鼠标右键菜单,在其中 选“插入ActiveX控件”,出现一个ActiveX组件选择框, 在其中选“Microsoft Communications Control (version6.0)”,并确认。 选中对话框上的MSComm组件,在鼠标右键菜单中选“ 添加变量”,在加成员变量的对话框中填入变量名称。至 此,程序中会出现一个新类CMsComm1,导入工作完成 。
Visual C++.NET 程序设计
第十一章 串行通信编程
建议学时:2
学习重点:理解串口相关概念
掌握MSComm使用
VC单文档程序结构
1)初始化函数(OnInitDialog)中,初始化按钮(主要是外观)和调用复位状 态扫描函数(ScanHomeStatus) 2)在OnShowWindow()函数中调用SetTimer() 3)Ontimer函数——调用复位状态扫描函数(ScanHomeStatus) 4)在复位按钮函数OnBtnHomeStart()中调用复位函数StartThreadHoming()
Page 6
Sheet2
adHoming()
Page 7
Sheet2
Page 8
12
DlgHome.cpp
Page 1
Sheet2
13
DlgSettingContainer.cpp
14
DlgSettingLoad.cpp
15
DlgSettingUnload.cpp
16
DlgSettingLaser.cpp
17
DlgSettingImage.cpp
Page 2
17
DlgSettingImage.cpp
Page 3
Sheet2 注释 1)限制程序在分辨率小于800*600的电脑上运行; 2)判断程序是否在电脑的后台隐形运行;(可以不要) 3)初始化运动卡; 4)启动硬件扫描线程(一般是运动卡)——StartThreadHardwareScan() 5)启动运行状态线程(一般是塔灯的状态)——StartThreadPilot() 6)初始化硬件状态(主要是气缸,真空阀以及其他需要初始化的硬件)—— InitalHardwareStatus() 7)用于登录处理 1)创建存储数据的文件(Parameter.ini);——OnNewDocument() 2)Load马达速度和位置参数;——UpdateMotionSetting() FindWindowInCurrentProcess()——具体用法有待研究,不一定要用到 存放资源 主要是在其头文件StdAfx.h中包含程序的一些头文件和声明全局变量 1)视图分割——OnCreateClient() 2)在OnCreate()中添加Toolbar按钮的“名称” 3)硬件扫描线程——StartThreadHardwareScan() 4)运行状态线程——StartThreadPilot() 5)复位线程——StartThreadHoming() 6)视图重绘功能——OnSize(), OnViewRelayout() 7)Menu和Toolbar菜单的按钮操作功能,如:OnMnuToolSettingLoad() 运动类(根据具体牌子的卡和自己需要的功能写运动类),包括卡的初始 化,轴的初始化,轴的复位函数,轴的运动函数,轴的JOG函数,轴停止 函数,轴的Limit函数,轴的IO函数(如果用到运动卡的IO),等等 读取和保存ini文件的数据 读取和保存ini文件的数据
《单文档与多》课件
目录
CONTENTS
• 单文档概述 • 多文档概述 • 单文档与多文档的比较 • 如何选择单文档与多文档 • 单文档与多文档的发展趋势
01 单文档概述
单文档的定义
01
单文档是指一个独立的、完整的 文档,通常用于记录、描述或说 明某一主题或事项。
02
它是一个独立的文件,可以在各 种应用程序中打开、编辑和保存 。
内容管理和编辑工具的完善
多文档将进一步优化内容管理和编辑工具,提供更加丰富的格式设置、
图表展示和多媒体插入等功能,提高文档制作效率和质量。
03
智能化和自动化程度提高
未来的多文档将更加注重智能化和自动化技术的应用,通过自然语言处
理、机器学习和人工智能等技术手段,实现文档的自动化分类、标签化
和搜索等功能。
根据工作习惯选择
总结词
顺应习惯更高效
详细描述
根据个人的工作习惯选择单文档或多 文档PPT课件。习惯于简洁、直接表 达的人更适合单文档;而喜欢分点、 有条理展示的人则更适合多文档。
根据实际需要选择
Байду номын сангаас总结词
实际需要决定形式
详细描述
根据实际需要选择单文档或多文档PPT课件。例如,如果需 要在短时间内传达大量信息,多文档可能更合适;如果需要 强调整体与部分的关系,单文档更能突出重点。
单文档的特点
01
02
03
结构简单
单文档通常只有一个主标 题和若干段落、列表等子 内容,结构相对简单。
易于编辑
单文档可以在各种文本编 辑器或办公软件中打开, 进行编辑和修改。
易于分享
单文档可以通过电子邮件 、云存储等方式轻松分享 给他人。
《单文档与多文档》课件
文档的版本控制
01
02
03
版本记录
对文档进行版本控制,记 录每个版本的修改时间和 修改内容,以便追踪和回 溯。
版本比较
通过比较不同版本的文档 ,可以快速识别出改动的 内容和改动的作者,有助 于协作和冲突解决。
版本分支
在多文档编辑时,可以使 用版本分支来管理不同版 本的文档,便于并行工作 和合并操作。
保存与关闭单文档
保存单文档
在编辑完单文档后,可以通过“文件 ”菜单选择“保存”来保存单文档, 也可以选择“另存为”来选择不同的 保存位置或文件名。
关闭单文档
完成编辑后,可以通过“文件”菜单 选择“关闭”来关闭单文档。
02
多文档编辑
打开与创建多文档
打开多个文档
在PPT中,您可以通过“文件”菜单下的“打开”选项,同时打开多个PPT文 档。
合并与比较多文档
合并文档
如果您需要将多个PPT文档合并成一个,可以先打开这些文档,然后使用“文件 ”菜单下的“保存为”选项,选择一个新的文件名和位置进行保存,这样就可以 将多个文档的内容合并在一起。
比较文档
如果您需要比较两个PPT文档之间的差异,可以使用“审阅”菜单下的“比较” 选项,将两个文档进行比较,高亮显示不同之处。
创建新的文档
您也可以通过“文件”菜单下的“新建”选项,创建一个新的PPT文档,并在其 中进行编辑。
切换与同步多文档
切换文档
在同时打开多个PPT文档时,您可以使用快捷键Ctrl+Tab或 者在任务栏上点击相应的文档图标来切换不同的文档。
同步编辑
如果您需要在多个文档之间同步编辑,可以使用“视图”菜 单下的“窗口”选项,将多个文档水平或垂直排列,以便同工作需要,为不同用 户或角色设置不同的文档 访问和编辑权限,确保文 档的安全性和完整性。
VC++讲义第11单元 资源
第11单元资源本单元教学目标介绍资源的概念以及图标、位图、菜单、工具栏和状态栏等资源的编程方法。
学习要求掌握Developer Studio的各种资源编辑器的用法,能在应用程序中添加图标、位图、菜单和工具条等资源并进行相应的编程工作。
授课内容除了文档对象的数据成员和变量外,典型的Windows 应用程序还会用到一些称为资源的数据,包括确定应用程序的用户界面的一些文本和图形,如菜单、加速键、位图、光标、图标、对话框、控件、字符串和工具栏等。
当Windows调用一个应用程序时就从程序的可执行文件中读取程序代码和初始化数据,并将其复制到分配的内存中。
然而,除了一些特殊情况,资源数据仍保留在硬盘上的可执行文件中。
实际上,当应用程序创建窗口、显示对话框或装载位图时,才从EXE文件或DLL文件中读取相应的资源数据。
Developer Studio提供了几种资源编辑器,可以通过它们创建或编辑应用项目的资源数据。
本单元介绍在应用程序中首先会遇到的几种界面元素,包括图标、位图、菜单、工具栏、加速键和状态栏。
对话框和控件分别放在第14单元和第15单元讨论。
11.1 资源脚本文件和资源头文件项目在一个扩展名为.rc的文件中定义资源,资源文件常与项目同名。
资源文件是文本文件,可用文本编辑器编辑阅读,然而更方便的方法是通过Developer Studio的各种资源编辑器进行编辑。
在资源文件中定义了菜单脚本和字符串等内容,但不包含位图和图标的图形数据。
图形资源保存在单独的文件中,在资源文件中只保存了它们的名字和位置。
在项目中,资源通过资源标识符加以区别。
通常在使用资源编辑器建立资源或将一外部资源插入项目时为资源命名标识符。
标识符的命名有一定的规则,如IDR_MAINFRAME代表主框架窗口的菜单和工具栏,IDD_ABOUTBOX代表About(关于)对话框。
通常将一个项目中所有的资源标识符均放在头文件Resource.h中定义,因此在源代码文件中要包含此头文件。
VC操纵WORD文档详解
1.打开VC2.单击File->New3. 在Projects标签下选择MFC AppWizard(exe),在右边Project name中填好项目名称:VcToWord,单击OK4.在MFC AppWizard – Step 1中,选中单选框Dialog based,单击Finish5.在New Project Information对话框中单击OK6.删除VcToWord对话框上多余按钮和文本,添加一个按钮,ID改为IDC_GEN_WORD,Caption改为“生成WORD”7.双击该按钮,弹出以下对话框,单击OK8.得到以下代码9.按下快捷键Ctrl+W,弹出MFC ClassWizard对话框,单击Add Class…,选择From a type library…,弹出Import from Type Library对话框,找到你OFFICE软件的安装文件夹(默认是在C盘的Program Files中),在其中找到MSWORD.OLB,单击打开10.在Confirm Classes中按下Ctrl键选中_Application,Documents,_Document,InlineShapes 和Selection,单击OK11.再次单击MFC ClassWizard对话框中的OK,可以看到多了以下几个类12.在VcToWord.cpp的头部添加#include "msword.h"13.在VcToWordDlg.cpp的头部添加#include "msword.h"14.在CvcToWordApp类在InitInstance函数里添加以下几行代码15.由于IDP_OLE_INIT_FAILED未定义,故需在Resource.h中定义如下16.回到OnGenWord函数,在其中添加如下代码17.记得将本文件夹下的csdn.bmp图片复制到C盘的根目录中17.编译链接运行程序,单击“生成WORD”,在C盘根目录中得到VcToWord.doc18.打开VcToWord.doc完毕!!!。
VC++多文档编程
VC++多文档编程教案2007 ~2008 学年第一学期主讲教师课程名称面向对象程序设计(VC++)课程类别专业基础课学时及学分80、4授课班级使用教材VC++的使用及面向对象软件工程实例分析系(院、部)教研室(实验室) 计算机应用教研室课时授课计划课次序号:一、课题:ch6 多文档编程二、课型:讲授三、目的要求:1、理解多文档程序的结构,熟悉多文档窗口的特点。
2、掌握多文档程序的设计方法。
3、熟悉视图分割的方法和应用。
四、重点、难点:重点:多文档程序的结构和设计方法。
难点:多文档程序中视图与文档的交互作用较难理解。
五、教学方法及手段:案例式教学:设计目标、关键技术、结合实例讲解语法、总结。
六、参考资料:《面向对象程序设计与VC++实践》揣锦华编著,西安电子科技大学出版社,第11章《C++面向对象程序设计》李涛编著,高等教育出版社,第9章七、作业:习题6.2 6.3 6.4 6.6八、授课记录:九、授课效果分析:十、教学进程(教学内容、教学环节及时间分配等)1、复习多文档程序的框架结构:5个主要的类比如,创建多文档程序ex_mdi,包含的主要类有:CmainFrame Cex_mdiView Cex_mdiDoc Cex_mdiApp CchildFrame 与单文档程序相比,多了一个子窗口类类CchildFrame2、导入课题多文档程序可以运行用户同时打开和使用多个文档,比单文档程序更方便,比如Word、Excel等。
3、教学内容ch6.1 多文档程序的结构和多文档窗口特点[通过实例分析]例6-1:建立一个多文档应用程序,用户能打开多个文档,并能在多个文档中输入信息,并可以利用“保存/另存为”保存每个文档中输入的信息,也可以利用“打开”新建的子窗口显示文件的内容。
关键技术:利用视图类的ONCHAR消息映射函数OnChar实现键盘输入;利用文档的串行化实现数据的保存、文件的打开。
实现过程:(1)建立单文档应用程序ex_mdi(2)为文档类Cex_mdiDoc添加一个字符串变量,用于保存输入的字符串。
c_11_file
banana 25 2.0
orange 30
要求编一程序将该文件中的内容打印在 屏幕上。
/*exp15_1.c*/ #include<stdio.h> main( ) { FILE *fp; char ch; fp=fopen("data.txt", "r"); if (fp= =NULL) printf("file open error\n"); else while((ch=fgetc(fp))!=EOF) putchar(ch); fclose(fp); }
§11.2 数据的层次结构 一、数据
· 计算机处理的数据:0和1的组合 · 人处理数据的习惯思维:十进制数、 字符、字符集
每个字符用一个8位的二进制数表示, 占一个字节 · 位字节字段复杂记录 就构成了 计算机处理数据的层次结构。 如:企事业管理中的人事数据、资 金数据等。
二、文件
计算机可处理的文件:源程序,图形文件、音 频文件、数据文件等等。
第十一章
本章目标
文件处理
1.能够建立新文件和更新文件内容
2.能够从顺序文件中读取数据 3.了解对文件进行操作的步骤
4.熟悉对顺序文件进行操作的方式 5.了解对随机文件进行操作的方式 6.了解对文件的低级读写操作
§11.1
引言
文件的作用:长期保存数据 程序与文件的关系: 可通过程序来建立和更新文件内容 程序中处理的数据可以从文件中获得
例1:#include <stdio.h> main()
{ FILE *p;
p=fopen("test.txt", "r"); if (p==NULL) printf("file open error \n"); else
单文档程序转成多文档的方法
1。
首先增加一个从CMDIChildWnd派生的CChildFrame,它将作文转换后的字窗口框架。
2。
将程序中从CFrameWnd派生的主框架CMainFrame改为由CMDIFrameWnd派生。
注意要改动IMPLEMENT_DYNAMIC和BEGIN_MESSAGE_MAP宏,另外成员函数中有调用CFrameWnd方法的要改为调用CMDIFrameWnd方法。
否则你可能有幸得到畸形的框架。
3。
在CMyAp::InitInstance()中将CSingleDocT emplate* pDocT emplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMyDoc),RUNTIME_CLASS(CMainFrame), // main SDI frame windowRUNTIME_CLASS(CMyView));AddDocTemplate(pDocTemplate);改为:CMultiDocTemplate* pDocT emplate;pDocTemplate = new CMultiDocTemplate(IDR_*****, //换成你要的子类资源RUNTIME_CLASS(CMyDoc),RUNTIME_CLASS(CChildFram e), // main SDI frame windowRUNTIME_CLASS(CMyView));AddDocTemplate(pDocTemplate);由于主框架没有加到文档模版中,所以必须自己创建框架窗口在上面一行后面加:CMainFrame* pMainFrame = new CMainFrame;if (!pMainFrame->LoadFrame(IDR_MAINFRAME))return FALSE;m_pMainWnd = pMainFram e;另外,有些多文档程序可能不需要一启动就打开一个文档,可以用下面方法修改:CCommandLineInfocmdInfo;ParseCommandLine(cmdInfo);//下面一行为新增if(cmdInfo.m_nShellCommand==CCommandLineInfo::FileNew)cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing;4。
c11文件
17
Class is over.
Bye!
7
使用文件方式及符号含义:
方式 “r” "w" "a" "rb" "wb" "ab" 意义 只读,为输入打开一个文本文件 只写,为输出打开一个文本文件 追加,向文本文件添加数据 只读,为输入打开一个二进制文件 只写,为输入打开一个二进制文件 追加,向二进制文件添加数据
“r+”
"w+" "a+" "rb+" "wb+" "ab+"
A、键盘 B、显示器 C、软盘 D、硬盘
C 3、函数rewind的作用是_______。 A、使位置指针指向文件的末尾。 B、将位置指针指向文件中所要求的特定位置。 C、使位置指针重新返回文件的开头。 D、使位置指针自动移到下一个字符位置。 4、若以“a+”方式打开一个已存在的文件,则以下叙述正确的 A 是_______。 A、文件打开时,原有文件内容不被删除,位置指针移到文 件末尾,可作添加和修改操作。 B、文件打开时,原有文件内容不被删除,位置指针移到文 件开头,可作重写和读写操作。 C、文件打开时,原有文件内容被删除,只可作写操作。 D、以上皆非。
9
文件的读写
C语言中,对文件的读写都是用库函数来实现的。 1、fscanf(文件指针,“格式描述符” ,变量表) 从文件中读出数据 例:fscanf(fp, “%d%d”, &m1,&m2) 指文件指针在当前位置读两个整型数存入变量m1、m2中。 2、fprintf(文件指针,“格式描述符” ,变量表) 从文件中写入数据 例:fprintf(fp, “%f%f”, m1,m2) 指文件指针在当前位置写入两个浮点数据m1、m2。 3、exit函数是关闭所有文件,终止正调用的过程。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文档/视图结构
• 1、应用程序对象---CWinApp的派生类
– (1)管理应用程序的初始化; – (2)保持文档、视图和框架窗口之间的关系; – (3)接收Windows消息,进行消息的调度;
• 2、框架窗口对象---CFrameWnd的派生类
– (1)提供应用程序主窗口; – (2)工具栏、状态栏的创建、初始化和销毁;
11.3. MFC菜单设计
• 在视图类CDemoView头文件加入如下声明:
– COLORREF m_nColors[3]; // 可选颜色数组 – DWORD m_nColorIndex; // 当前颜色索引 – CString m_strShow; // 显示的内容 – BOOL m_bShow; // 是否显示
CCmdUI
• (1) 禁止或者允许该菜单项
– void Enable( BOOL bOn = TRUE );
• (2)设置菜单项/工具条按钮的check状态, 显示标志为“√”
– void SetCheck( int nCheck = 1 );
• (3)与SetCheck功能类似,显示标志为“•‖
访问位置 视图 文档 框架 视图 文档 应用程序
访问方法 GetFirstViewPosition GetNextView GetDocument GetParentFrame GetActiveView GetActiveDocument AfxGetApp
任何位置
主框架
AfxGetMainWnd
Visual C++
第十一章 单文档与多文档
11.1 概述
• MFC AppWizard支持的应用程序类型
– 1. 单文档界面(SDI) ——只有一个窗口
• 每一个文档可以有多个视图 • 每个视图只能对应于一个确定的文档
– 2. 多文档界面(MDI) ——有多个子窗口,同时 对多个文档进行操作
• 解决多个文档的数据管理方法 • 每次打开一个新文档派生的新的MDI子窗口
– 视图在文档和用户之间起中介作用
• 接收用户的输入,并接受用户的修改 • 直接或间接的访问文档类中的成员变量,从文档类 中(不是从存储介质中)取数据并显示 • 通过调用文档和视图的接口将修改的信息反馈给文 档类,实际的数据更新仍然是由文档来完成的。
命令消息(WM_COMMAND)
• 产生
– 选择菜单项 – 单击快捷键 – 工具条按钮
CDocument——文档串行化
• CArchive类的常用成员
– operator << 将基本类型写入流中 – operator >> 从流中读取基本类型 – ReadObject 读取串行化对象 – WriteObject 写入串行化对象 – Flush 将缓冲区中的数据强制写入流中
(4) CView
• 视图类(CView)是从 CWnd类下派生的,视图 类具有CWnd的所有功能 如:创建、移动、显示和 隐藏窗口等。 • CView类可以接收任何 Windows消息,而 CDocument类则不行。
CView——常用方法
• OnDraw
– 由MFC调用发出文档到设备描述表 – 在屏幕发生变化或因为焦点的变化需要重绘时 调用,没有该函数,就不可能在程序的切换后 保证屏幕的正确显示。 – 若想在数据更新的时强制视图更新,可调用 Invalidate方法和UpdateWindow方法来实现。
• 串行化:
– 将对象写入字节流和从字节流恢复对象的操作。 – 串行化除了可以使用文件保存对象之外,还可 以通过网络、串口传输对象,因此使用字节流。 – 串行化处理通常是通过CArchive类来完成的。
CDocument——文档串行化
• CArchive类的常用成员
– WriteString – ReadString – ReadClass – WriteClass – Read – Write 写入字符串 读取字符串 读取类信息 写入类信息 读取字节内容 写入字节内容
• MFC菜单设计---绘图代码
CDemoView::OnDraw(CDC *pDC) { if(m_bShow) { pDC->SetTextColor( m_nColors[m_nColorIndex]); pDC->TextOut(100,100,m_strShow); } }
MFC菜单设计---消息映射
• 处理
– 框架窗口(大多数命令) – 视图、文档、文档模板、 应用程序类也可以处理
• 注意
– 窗口消息和控件通知消息 只能由窗口和视图处理。
文档/视图结构
• 程序基本结构:
– 应用程序对象(CWinApp) – 框架窗口对象(CFrameWnd) – 文档对象(CDocument) – 视图对象(CView) – 文档模板对象(CDocTemplate)
– 支持滚动条的视图
• CFormView
– 窗体视图,支持在上边使用对话框控件
5. Doc/View访问方法
• Doc/View结构的几个基本成员经常需要互 相访问,假设某个视图想要获得文档,或 某个框架需要获得活动视图,可以通过下 表提供的方法进行解决。
当前位置 文档 视图 视图 框架 框架 任何位置
• 1、ON_COMMAND消息映射宏
– 语法:ON_COMMAND(ID,func) – 说明:处理WM_COMMAND消息。 – 参数:
• (1) ID:WM_COMMAND消息附带的控件ID; • (2) func:消息处理函数,原型为: • void func(void);
• 对WM_COMMAND消息的响应: protected: //{{AFX_MSG(CDemoView) afx_msg void OnOperShow(); //}}AFX_MSG • ID_OPER_SHOW对应的WM_COMMAND消息的映射 BEGIN_MESSAGE_MAP(CDemoView, CView) //{{AFX_MSG_MAP(CDemoView) ON_COMMAND(ID_OPER_SHOW, OnOperShow) //}}AFX_MSG_MAP END_MESSAGE_MAP()
– void SetRadio( BOOL bOn = TRUE );
• (4) 设置菜单项的Caption属性
– void SetText( LPCTSTR lpszText );
CDocument——视图管理
• 视图遍历
– 用户可通过函数GetFirstViewPosition()和 GetNextView()得到和文档关联的视图的指针。 – POSITION GetFirstViewPosition() const; – CView* GetNextView(POSITION& rPosition);
CView——常用方法
• OnInitialUpdate()
– 在类第一次构造后由MFC调用
• OnUpdate()
– 由MFC调用对文档的修改进行响应
• GetDocument()
– 获取文档指针
CView——的子类
• CEditView
– 简单的文本编辑器,类似Notepad
• CScrollView
10
(1) CWinApp
• CWinApp类代表主程序,负责维护进程的启 动、终止、消息循环、命令行参数、资源管 理。可以调用AfxGetApp获取CWinApp类型 指针。
成员 m_pszAppName m_lpCmdLine m_pMainWnd m_pszExeName m_pszProfileName InitInstance ExitInstance 描述 应用程序名 命令行参数 应用程序主窗口指针 可执行文件名 配置INI文件名 MFC程序的入口 MFC程序的出口
(2) CFrameWnd
• 框架窗口维护了很多幕后的工作,例如工 具条、菜单、状态条的显示、更新,视图 的位置和显示,其它可停靠控件的停靠和 动态尺寸调整。 • 许多默认为MFC应用程序应该具备的基本 功能都是CFrameWnd类在完成。
(3) CDocument
• 视图操作
– void AddView(CView* pView); – void RemoveView(CView* pView); – void UpdateAllView(CView* pSender, LPARAM lHint=0L, CObject* pHint=NULL);
文档/视图结构
• 3、文档对象:CDocument的派生类
– (1)管理和维护数据,串行化功能; – (2)处理WM_COMMAND消息;
• 4、视图对象:CView的派生类
– (1)文档和用户的中介; – (2)读取文档中的数据,显示到屏幕上;
文档/视图结构的工作机制
视图通过 GetDocument成员函 数获得指向相关联 的文档对象的指针 通过该指针调用 文档类的成员函 数来从文档中读 取数据 视图把数据显 示于计算机屏 幕上
CDocument——视图管理
• 视图遍历
– // 得到视图列表头的位置 POSITION pos = GetFirstViewPosition(); while(pos != NULL) { //获得视图指针 CView *pView = GetNextView(pos); … }
CDocument——文档串行化
视图通过相关联的文 档类的成员函数将经 过修改的数据传递给 文档对象
文档对象获得修改过的数据之 后,对其进行必要的修改,最 后保存到永久介质(如磁盘文 件)中
用户通过与视 图的交互来查 看数据并对数 据进行修改
11.2.Doc/View框架的主要成员