MFC实验六 文档视图和单文档界面

合集下载

MFC编程之文档、视图结构应用程序

MFC编程之文档、视图结构应用程序

第2章文档/视图结构应用程序2.0 知识要点1. 文档/视图结构的思想是将数据的管理与显示分离,其中文档用于管理应用程序的数据,而视图是用户界面,用于显示、打印文档中的数据,并管理与用户的交互。

2. SDI具有文档/视图结构的应用程序框架,该框架包括应用程序类、窗口框架类、文档类和视图类,编程的任务是在文档类和视图类中添加适当的代码。

其中文档类中一个重要的成员函数是OnNewDocument(),用户在此添加代码完成对数据的初始化;而视图类中最重要的成员函数是OnDraw(),通过在该函数中添加代码实现窗口内容的输出。

3. 通过介绍几种SDI结构的典型应用程序来了解其结构及设计方法,典型应用包括:•利用画笔、画刷等工具及位图处理的方法实现文字和图形的输出。

•利用定时器控件制作动画程序。

•对鼠标和键盘进行编程的基本方法。

•文件、字体、颜色等几种通用对话框的使用方法及自定义对话框的设计、调用方法。

•菜单的设计方法。

2.1 文档/视图结构SDI 应用程序由 AppWizard 创建好后,即使没有编写一行代码,仍然可以运行,并且具有一个标准 Windows应用程序所需要的组成成份,程序员的工作就是往这个框架添加必要的代码。

以下通过一个简单实例说明文档/视图结构应用程序的创建过程。

【例2-1】创建一个如图所示的应用程序,在窗口中显示一个矩形框,框中显示“同舟共济自强不息”。

假定本例的工程名为TEST,程序创建过程如下:(1)利用 AppWizard 创建一个 SDI 应用程序框架。

(2)文档类是存放数据的主要地方,本例在其中说明一个存放矩形框数据的 CRect 类对象 r 和一个存放字符串的 CString 对象s,方法为:在工作区的“ ClassView ”中,双击 CTESTDoc 类,在该类代码中添加如下代码:public:CRect r;CString s;说明:CRect 是 MFC 定义的一个类,有 4 个数据成员: left 、 top 、 right 和bottom 。

第6章 文档与视图

第6章 文档与视图

6.3 鼠标消息处理
Windows是基于事件驱动、消息传递的操作系统。用户所 有的输入都是以事件或消息的形式传递给应用程序的,鼠标也不 例外。 鼠标驱动程序将鼠标硬件信号转换成Windows可以识别的 信息,Windows根据这些信息构造鼠标消息,并将它们发送到应 用程序的消息队列中。
6.3.1 鼠标消息
6.2.3 弹出式菜单
菜单分为两类:
依附于框架窗口的固定菜单
浮动的弹出式菜单,快捷菜单,上下文菜单 当用户单击鼠标右键,弹出式菜单出现在光标所在位置。弹出式菜单 是通过利用CMenu类和其成员函数,在程序运行过程中动态建立的。 一般而言,弹出式菜单是利用现有的菜单项来进行创建,但也可以为
弹出式菜单专门建立一个菜单资源,然后通过调用函数CMenu::LoadMenu()装
视图是文档在屏幕上的一个映像,它就像一个观景器,用
户通过视图看到文档,也是通过视图来改变文档,视图充当了文
档与用户之间媒介物。
应用程序通过视图向用户显示文档中的数据,并把用户的
输入解释为对文档的操作。
一个视图总是与一个文档对象相关联,用户通过与文档相 关联的视图与文档进行交互。当用户打开一个文档时,应用程序 就会创建一个与之相关联的视图。
6.4 工具栏和状态栏设计
6.4.1 添加工具栏按钮
我们知道单击工具栏按钮也产生命令消息。而且,事实上 工具栏按钮和菜单项的功能往往是一致的。为了使工具栏上某个
按钮的功能与某个菜单命令的功能相同,只需让该按钮的ID值与
对应菜单命令的ID值相同即可。
6.4.2 定制状态栏
状态栏用于显示当前操作的提示信息和程序的运行状态。 MFC应用程序默认的状态栏分为四个部分(也称为面板pane): 第一部分:显示菜单或工具栏的提示信息 第二部分:Caps Lock,显示键盘的大小写状态 第三部分:Num Lock,显示键盘的数字状态

单文档和多文档窗口使用方法解析

单文档和多文档窗口使用方法解析

单文档和多文档窗口使用方法解析一.实验目的掌握利用开发平台创建单文档和多文档窗口方法掌握在窗口中输出文字、图形的方法及 MFC 中相关类的使用二.实验要求1 创建一个单文档窗口,在文档类定义一个整型变量,其取值范围从 0 ~ 1000 循环,在视图的中间显示该数字,当用户点击窗口的不同区域时,变量值按不同的增量增加并显示。

提示:在修改数据后,使用 Invalidate() 函数引起 MFC 对 OnDraw() 的调用,这样就可以用修改后的数据进行画图了。

关于对文档类的访问,见本实验的技术支持。

2 创建一个单文档窗口,鼠标在窗口上单击后在鼠标的位置显示一正方形,点击 20 次后清窗口,新的点击将不再增加新的正方形,而是将已输入的正方形在原位置显示,当然,在每20 单击后要重新清窗口。

(要求用 MFC 的通用类保存单击的信息,如 CList 类)知识点:画线当单击鼠标左键时,就可以获得一个点,即线条的起点。

接着按住鼠标左键并拖动一段距离后松开鼠标,此时也可以获得一个点,即线条的终点。

也就是说,我们需要捕获两个消息,一个是鼠标左键按下消息(WM_LBUTTONDOWN),在该消息响应函数中可以获得将要绘制的线条的起点;另一个是鼠标左键弹起来的消息(WM_LBUTTONUP),在该消息响应函数中可以获得将要绘制的线条的终点。

有了这两个点就可以绘制出一条线。

利用SDK全局函数实现画线功能为了进行绘图操作,必须获得一个设备描述表(DC),因此,首先定义一个HDC类型的变量:hdc,接着调用全局函数GetDC获得当前窗口的设备描述表。

因为CWnd类有一个成员变量(m_hWnd),而CView类派生于CWnd类,因此该类也有这样的一个成员变用于保存窗口句柄,而GetDC函数可以直接把这个成员变量作为参数来使用。

利用MFC的CDC类实现画线功能该类提供一个数据成员m_hDC类用来保存与CDC相关的DC句柄。

其道理与CWnd 类提供成员变量m_hWnd保存与窗口相关的窗口句柄是一样的。

MFC文档视图结构-上机步骤

MFC文档视图结构-上机步骤

实验1 . MFC对话框应用程序练习一、上机题目:1.一个简单的单文档应用程序——记事本程序2.文档串行化编程3. 简单的班级学生查询系统(单文档多视图编程)二、上机目的:1.通过这些程序可以达到以下目的:2.文档视图框架3.文档、视图、框架之间的相互作用三、题目说明1.记事本程序利用AppWizard,自动产生一个记事本程序。

2. 文档串行化编程1)定义一个日期结构(包括年月日)置于文档对象中,在文档对象中序列化保存和读取,并在视图中显示日期信息(可以在编辑视图或普通视图中显示)。

并通过对话框修改该信息。

注:普通视图中显示文本方法:重载视图OnDraw函数,利用其中pDC->TextOut函数输出相关信息。

2)建立一个表单视图(FormView),在建立控件输入矩形的左上角和右下角,在另外一个控件中显示该视图。

注:视图会话函数:CDC* pDCTemp=m_Ctrl.GetWindowDC(); 得到视图的设备pDCTemp->Rectangle(m_x1,m_y1,m_x2,m_y2); 绘制矩形3.简单的班级学生查询系统1)建立两个视图,其中左边为一个树视图,根节点为为学院(系)(这一级至少要有两个节点如计算机学院、软件学院),二级节点为学院的系(专业)(可以只针对计算机学院输入相关二级节点,如包括网络工程、计算机科学、软件学院),右边为列表视图包含学生的姓名、学号、课程成绩等。

2)要求当选择左边的计算机学院时,右边视图显示所有计算机学院的学生信息,当选择网络工程专业,只选择网络工程专业的学生信息。

提交网站:实现步骤:例1.一个简单的单文档应用程序——记事本程序1. 只要在AppWizard的Step 6将Base Class设置为EditView,AppWizard就自动完成了一个记事本程序的设计:2. 运行程序,即可测试记事本的各种功能:3.说明:(1)打开Workshop中的Class视图,可以看到,一个简单的单文档应用程序向导自动:建立五个类(2(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.文档串行化编程将C++对象以字节流的形式保存在二进制文件中称为对象的串行化处理,经过串行化处理的称为持久对象,可以按需要在程序运行中存储和恢复。

MFC文档视图

MFC文档视图
在程序的任何位置,调用全局函数AfxGetApp()可以获得CWinApp应用程 序类指针,而通过AfxGetApp()->m_pMainWnd则可以获得框架窗口指针
应用程序对象
- 10 -
文档/视图框架—文档视图对象的创建过程
...... //注册应用程序的文档模板。 //文档模板将用作文档、框架窗口和视图之间的连接 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMytestDoc), RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口 RUNTIME_CLASS(CMytestView)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate); //分析标准外壳命令、DDE、打开文件操作的命令行 ...... //根据命令行中的信息启动程序 ......
-3-
文档/视图框架—文档/视图结构概述
框架口
文档
文档当前可视部分
文档和视图的关系
-4-
文档/视图框架—文档/视图结构概述
使用文档/视图结构的意义:
将数据操作、数据显示和用户界面分离开。这是一种“分而治之” 的思想,这种思想使得模块划分更加合理、模块独立性更强。
MFC在文档/视图结构上提供了许多标准操作。如新建文件、打 开文件、保存文件、打印等操作,它们被框架自动完成,减轻了 程序员的工作量。
-7-
文档/视图框架—单文档主要类
单文档应用程序框架中,主要包含5个类:
SDICWinApp(应用程序类) CFrameWnd(框架窗口类) CView(视图类) CDocument(文档类) CDocTemplate(类文档模板)

MFC文档与视图深入详解

MFC文档与视图深入详解

1.1 MFC 文档视图结构程序结构总揽当我们使用MFC AppWizard 生成一个MFC 程序,选用所有默认的设置(当然也是Multiple Documents ,本文讨论主要基于Multiple Documents ,对于Single Document 情况仅以简单表述提及,皆因后者和前者很多相似相同之处,但前者更为复杂,并且更加常用。

),假设你的程序名称为 A ,则你会得到CMainFrame 、CChildFrame 、CAboutDlg 、CADoc 、CAView 、CAApp 6 个类(Single Document 仅少一个CChildFrame 类,其余均同)。

这些类的具体含义将在后面给出,这里先要给出一个MFC 支持文档视图结构程序(以下简称App )的主要组成:一个App (对应类CAApp )可以包含多个文档模版(CDocTemplate ),但是MFC AppWizard (无论是SDI 还是MDI )都只是默认生成一个。

但是在实际开发中一个文档模版不够,需要自己手工添加(在后面实际项目例子提供示例)。

这个结构是通过MFC 中CWinApp 的成员变量CDocManager*m_pDocManager 实现的,我们的CAApp 正是继承自MFC 提供的CWinApp 类。

CDocManager 类则拥有一个指针链表CPtrList m_templateList 来维护这些文档模版。

这些文档模版都是在CAApp ::InitInstance ()中通过AddDocTemplate(pDocTemplate) 。

CDocTemplate 拥有3 个成员变量,分别保存着Document 、View 、Frame 的CRuntimeClass 指针,另外持有成员变量m_nIDResource ,用来指定这个Document 显示时候采用的菜单资源。

这 4 份数据都在CAApp ::InitInstance ()中CDocTemplate 的构造函数中指定。

MFC多文档和单文档视结构

MFC多文档和单文档视结构

MFC多文档和单文档视结构★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★//这一页的代码最重要了,呵呵……什么都在这里面呢;单文档新建:CWinApp_________docManager->docSingleTemplate 的OpenDocumentFile函数参数为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。

多文档新建:CWinApp_________docManager->docMultTemplate的OpenDocumentFile函数参数为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。

单文档打开:CWinApp_________docManager中经过一个打开对话框传递参数,中途还调用了APP的OpenDocumentFile,当然如果我们的APP重载了这个函数也要调用我们的但是我们的函数一定别忘记最后返回是调用父类的此函数___________docSingleTemplate的OpenDocumentFile函数参数不为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。

多文档打开:CWinApp_________docManager中经过一个打开对话框传递参数,中途还调用了APP的OpenDocumentFile,当然如果我们的APP重载了这个函数也要调用我们的但是我们的函数一定别忘记最后返回是调用父类的此函数___________docMultTemplate的OpenDocumentFile函数参数不为空,此函数完成了大部分东西,包括新建文档类框架类等______________然后是调用CDocument就没什么意思了,当然我们要是重载了CDocument的新建函数就是调用子类虚函数。

第六章 文档视图

第六章 文档视图

CView类的派生类介绍
1. CEditView 2.CRichEditView 3.CTreeView
支持类似编辑控件所要实现的功能,常见的文本操作, 支持类似编辑控件所要实现的功能,常见的文本操作,基 本上都是由该类支持实现的。值得注意的是, 本上都是由该类支持实现的。值得注意的是,该类的直接 基类不是CView类,而是类 基类不是 类 而是类CCtrlView。 。 主要提供Rich文本操作的支持(Rich文本是既可以 文本操作的支持( 主要提供 文本操作的支持 文本是既可以 为文本,也可以为图形的一种特殊格式文本。) 为文本,也可以为图形的一种特殊格式文本。) 主要提供一些树型控件所实现的功能的支持。 主要提供一些树型控件所实现的功能的支持。它使 一种数据的显示方式可以更富于变化。 一种数据的显示方式可以更富于变化。 该类与类CTreeView一样, 该类与类CTreeView一样,更多的好处在于提供 CTreeView一样 了一种简捷地实现数据的不同显示的途径。 了一种简捷地实现数据的不同显示的途径。 它主要提供视图的滚动显示。需要注意的是, 它主要提供视图的滚动显示。需要注意的是, 该类的直接基类是CView CView类 该类的直接基类是CView类。
CDocument
CFrameWnd
GetDocument GetFirstViewPosition GetNextView
GetParentFrame GetParentFrame
CView
文档视图
• 在文档/视图结构里,文档可视为一个应用程序的 数据元素的集合,MFC通过文档类提供了大量管 理和维护数据的手段。视图是数据的用户界面, 可将文档的部分或全部内容在其窗口中显示,或 者通过打印机打印出来。视图还可提供用户与文 档中数据的交互功能,将用户的输入转化为对数 据的操作。 • 将对数据的操作与数据显示界面分离,放在不同 类的对象中处理。文档对象只负责数据的管理, 不涉及用户界面;视图对象只负责数据输出和与 用户的交互,可以不考虑数据的具体组织结构的 细节。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六文档/视图和单文档界面
1.创建一个单文档界面应用程序,项目名设置为wx03.
2.在文档类CWx03Doc中添加数据成员用于保存应用程序的数据。

二维数组m_clrGrid用于保存每个方格的颜色,数据成员m_clrCurrentColor用于保存方格被单击时赋给方格的颜色。

3.在文档类CWx03Doc的OnNewDocument函数中对数据成员进行初始化:
4.向类wx03Doc添加三个成员函数,如下:
函数定义如下:
GetCurrentColor、GetSquare和SetSquare作为文档和视图之间的桥梁,视图对象通过它们可以访问文档的保护成员。

5.编辑CWx03View的OnDraw函数,在视图窗口中绘制网格,并根据文档类中保存的方格
颜色来设置方格的颜色。

6.在视图类CWx03View中添加消息处理函数WM_LBUTTONDOWN的处理函数:
7.利用菜单编辑器编辑个添加如下菜单,各菜单的属性设置如下表:
8.
9.为添加的菜单项添加命令消息处理函数和用户界面更新命令处理函数。

由于这些函数都
是针对文档数据的操作,因此将这些菜单命令的消息处理函数添加在文档类中。

10.编译、链接和运行程序,结果如下:
11.添加序列化功能,将各个方格的颜色以及当前颜色存入文件,并允许从文件中读取。

12.编写一个SDI程序,可以用鼠标在视图窗口中划线,并能将所画的线条保存。

13.定义一个新类Cline。

14.编辑类Cline,在其中添加相应的数据成员和成员函数。

15.在文档类中添加保存线段的数组。

在头文件wx03Doc.h中添加如下的数据成员和成员函
数,并包含定义类Cline的头文件和使用MFC模板类时需要的头文件:
在文档类的实现文件中编写添加的成员函数:
16.当在视图窗口中按下鼠标右键时开始画线,鼠标右键抬起时完成线段的绘制,在鼠标移
动的过程中画橡皮筋线。

因此需要记录划线的起点和终点并设置画橡皮筋线的跟踪标志。

画橡皮筋线时,需要将原来的线条删除,重新画一条从起点到当前鼠标指针坐标的线条,最简单的办法是使用R2_NOT绘图模式反转线条。

在视图类CWx03View中添加如下的数据成员和成员函数:
在视图类CWx03View的实现文件中编写函数InvertLine:
视图类中添加鼠标消息WM_RBUTTONDOWN、WM_MOUSEMOVE和WM_RBUTTONUP
的处理函数并添加如下代码:
17.为了在改变窗口大小或最小化后重新打开窗口,或在被覆盖后重新显示时保留原有的图
形,必须在OnDraw函数中重新绘制文档中线段数组中的线段。

18.在定义类Cline时实现了类的序列化,但只是一条线段的序列化,还必须保存文档类的
数据。

编写文档类wx03Doc的Serialize函数,完成对线段数组的序列化。

19.在文档类中重载DeleteContents函数:
20.编译、链接和运行程序,用鼠标在视图窗口中画线并测试保存、新建、打开等命令,运
行结果如图所示:
21.为wx03增加滚动视图功能。

执行Edit->Replace菜单命令,将视图类CWx03View头文件中所有Cview替换成CScrollView,同样将实现文件中的所有Cview替换成CScrollView。

22.在视图类CWx03View中重载虚函数OnInitialUpdate,编辑该函数。

23.修改鼠标消息处理函数,进行设备坐标与逻辑坐标之间的转换。

在文档类中保存的线段
坐标是逻辑坐标,当窗口改变大小或滚动后,调用OnDraw重绘的线段使用的是逻辑坐标。

24.在视图中画椭圆。

在视图类wx03View中增加两个数据成员,分别保存椭圆的外接矩形和颜色,同时在构造函数中进行初始化。

25.编辑视图类的OnDraw函数,绘制椭圆:
26.在视图类中添加WM_LBUTTONDBLCLK消息处理函数,当在椭圆内双击时,改变椭圆
的颜色:
27.编译、链接和运行程序如下:。

相关文档
最新文档