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通过文档类提供了大量管 理和维护数据的手段。视图是数据的用户界面, 可将文档的部分或全部内容在其窗口中显示,或 者通过打印机打印出来。视图还可提供用户与文 档中数据的交互功能,将用户的输入转化为对数 据的操作。 • 将对数据的操作与数据显示界面分离,放在不同 类的对象中处理。文档对象只负责数据的管理, 不涉及用户界面;视图对象只负责数据输出和与 用户的交互,可以不考虑数据的具体组织结构的 细节。

MFC中文档视图框架和文档模板之间的关系 四个类常用的成员函数

MFC中文档视图框架和文档模板之间的关系  四个类常用的成员函数

文档对象:是用来保存数据的。

视图对象:是用来显示和编辑数据的。

应用程序框架:框架是用来管理不同文档显示界面的。

例如你有一个数据网格显示界面,还有一个图形显示界面,它们的数据可能都来自你的文档,但是视图不同,怎么办用框架。

为什么不用视图?为的是把界面管理独立的拿出来。

文档模板:MFC把文档/视图/框架视为一体,只要你创建文档/视图框架结构的程序,必定会为你创建这三个类。

这个工作在在应用程序初始化时完成,如下:[cpp]view plaincopy1.BOOL CMyHtmlApp::InitInstance()2.{3. CSingleDocTemplate* pDocTemplate;4. pDocTemplate = new CSingleDocTemplate(5. IDR_MAINFRAME,6. RUNTIME_CLASS(CMyHtmlDoc),7. RUNTIME_CLASS(CMainFrame), // main SDI frame window8. RUNTIME_CLASS(CMyHtmlView));9. AddDocTemplate(pDocTemplate);10. }单文档:就是一次只能打开一个文件,和你的文档类型支持的多少无关。

你完全可以做一个单文档的支持所有图象格式的程序,只不过它一次只能打开一个文档罢了。

多文档:就是你可以打开多个文件,和文档类型也无关。

你也可以作一个可以同时打开多个文档的程序,但它只支持一种文档类型。

何时需要文档/视图框架结构?首先你可以不使用文档视图这种框架结构,即便是在MFC中。

你可以在你需要的时候选择使用这种方式。

你可以完成一个只有视图没有文档的程序,例如一个基于对话框的应用。

哪什么时候需要呢?当你想将你的数据层和界面层分开的时候。

通常我们对数据的操作放在文档类中,例如存取,打开,关闭。

在这里你可以尽情的对你的数据进行操作,如果你需要,在对数据进行了改变后,对视图做一下更新,那么程序会将你对数据所做的改变呈现给你的程序的用户。

vc++6.0打造单文档界面与多文档界面的编程

vc++6.0打造单文档界面与多文档界面的编程

vc++6.0打造单文档界面与多文档界面的编程VC++6中,可以利用MFC向导分别创建单文档和多文档界面的应用程序。

有了这两种类型的应用程序,您就可以实现简单的记事本,写字本和WORD的功能了。

以下介绍一个在文档中输出一段文字,点击菜单项,输入文字内容按OK按钮后可以更改输出的文字。

1.首先,点击MFC向导,选择多文档视图类型,新建一个名为MdiDemo的工程。

2.新建一个对话框。

上面放置一个Static控件和一个Edit控件,按CTRL+W,将Edit控件改成m_Caption.3.新建一个类与对话框对应,如CDlgDemo类。

4.在菜单中,增加一项Demo,并增加菜单项Test.按CTRL+W,并双击后,在消息的上面选择Doc,下面选择Command,双击就产生了对应的事件处理函数。

5.在MdiDemoDoc.cpp类中输入以下:// DlgDemo.cpp : implementation file//#include "stdafx.h"#include "MdiDemo.h"#include "DlgDemo.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////// //////////// CDlgDemo dialogCDlgDemo::CDlgDemo(CWnd* pParent /*=NULL*/): CDialog(CDlgDemo::IDD, pParent){//{{AFX_DATA_INIT(CDlgDemo)m_Caption = _T("");//}}AFX_DATA_INIT}void CDlgDemo::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CDlgDemo)DDX_Text(pDX, IDC_EDIT1, m_Caption);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CDlgDemo, CDialog)//{{AFX_MSG_MAP(CDlgDemo)// NOTE: the ClassWizard will add message map macros here //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////// //////////// CDlgDemo message handlers6.在MdiDemoView.cpp中输入以下内容:// MdiDemoView.cpp : implementation of the CMdiDemoView class//#include "stdafx.h"#include "MdiDemo.h"#include "MdiDemoDoc.h"#include "MdiDemoView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////// //////////// CMdiDemoViewIMPLEMENT_DYNCREATE(CMdiDemoView, CView)BEGIN_MESSAGE_MAP(CMdiDemoView, CView)//{{AFX_MSG_MAP(CMdiDemoView)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////// //////////// CMdiDemoView construction/destructionCMdiDemoView::CMdiDemoView(){// TODO: add construction code here}CMdiDemoView::~CMdiDemoView(){}BOOL CMdiDemoView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////// //////////// CMdiDemoView drawingvoid CMdiDemoView::OnDraw(CDC* pDC){CMdiDemoDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCRect crect;GetClientRect(&crect);CSize sizeClient=crect.Size();CString str=pDoc->strCaption;CSize sizeTextExtent=pDC->GetTextExtent(str);pDC->TextOut((sizeClient.cx-sizeTextExtent.cx)/2,(sizeClient.cy-sizeTextExtent.cy)/2,str);}/////////////////////////////////////////////////////////////////// //////////// CMdiDemoView printingBOOL CMdiDemoView::OnPreparePrinting(CPrintInfo* pInfo) {// default preparationreturn DoPreparePrinting(pInfo);}void CMdiDemoView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CMdiDemoView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////// //////////// CMdiDemoView diagnostics#ifdef _DEBUGvoid CMdiDemoView::AssertValid() const{CView::AssertValid();}void CMdiDemoView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CMdiDemoDoc* CMdiDemoView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMdiD emoDoc)));return (CMdiDemoDoc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////// //////////// CMdiDemoView message handlers6。

MFC文档视图

MFC文档视图
GetTitle() IsModified() SetModifiedFlags()
获得文档的文件名和路径,若文档未命名则返回空字符串
获得文档的标题,若文档未命名则返回空字符串 若文档未保存数据,则返回非0,否则返回0 设置或清除文档的修改标志,如果设置了修改标记,则系统自动实现关闭文档时,提示用户 是否保存对文档的修改。 文档对应多个视图时,更新所有视图,它是通过调用每个视图类的OnUpdate()函数来更新所 有当前文档关联的视图 当创建一个新文档时由应用程序框架调用(在AppWizard生成的用户程序中已自动重写该函 数)。在派生类中重定义这个函数可以实现在新文档创建之前初始化文档对象,例如为指针 申请内存空间 当从磁盘读入文档时由应用程序框架调用。在派生类中重写这个函数可以实现在新文档读入 之前初始化文档的其他非序列化数据成员 由应用程序框架调用,以删除文档内容。在派生类中重写这个函数可以实现在文档关闭之前 释放文档所占用的内存和资源 由应用程序框架调用(已自动重写)对文档进行串行化(详见后面章节),重写这个函数可 以实现特定的保存或读入文档数据
在程序的任何位置,调用全局函数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、打开文件操作的命令行 ...... //根据命令行中的信息启动程序 ......

文档和视图

文档和视图

第6章 创建和使用对话框
文档和视图
MFC应用程序的核心是文档/视图结构。在前面章节的学习中,已经接触了不少文档/视图结构的应用程序,本章将详细分析其结构和原理,并进一步学习使用复杂的文档结构、构造更加丰富的视图。
1.1 文档/视图概述 使用MFC的AppW源自zard可以创建三种类型的应用程序:
一个文档可以有多个视图,但一个视图只能对应一个确定的文档。因此,MDI应用程序需要解决的问题是多个文档的数据管理方法。在MDI应用程序中,文档模板只支持主窗口。每打开一个新文档时,都调用文档类的成员函数OnNewDocument(),建立一个由CMDIChildWnd派生的新的MDI子窗口,在子窗口中保存已打开的文档,所有这些细节都由MFC库来处理。
我们已经知道SDI应用程序由应用程序类(CWinApp)、框架窗口类(CFrameWnd)、文档类(CDocument)、视图类(CView)和文档模板类(CSingleDocTemplate)共同作用。MDI应用程序与SDI应用程序的主要差别在于:MDI有CMDIFrameWnd和CMDIChildWnd两个框架窗口类,前一个派生CMainFrame类,负责菜单等界面元素的主框架窗口管理;后一个派生CChildFrame类,负责相应的文档及其视图的子框架维护。而SDI由框架窗口类CFrameWnd 派生CMainFrame类。
(1) 单文档界面的应用程序(SDI:Single Document Interface)
(2) 多文档界面的应用程序(MDI:Multiple Documents Interface)
(3) 基于对话框的应用程序(Dialog based)
基于对话框的应用程序框架非常简单,由应用程序类、对话框类构成。通过应用程序类的 InitInstance()函数,构造一个模式对话框对象;调用DoModal()函数,让Windows对话框处理程序象通常情况一样接受和分配消息;用户退出对话框后,程序也就结束了。

win5_6MFC文档视图结构课件

win5_6MFC文档视图结构课件

三、文档视结构的运行机制(方式)
1)视图类调用GetDocument成员函数获得相关联 的文档对象指针,从文档中读取数据。
2)视图把数据显示在屏幕上用户交互数据修改。
3)视图将经过修改的数据传递给文档对象,进行数 据更新。
CDOCTEMPLATE(1)
CDocTemplate(或 CSingleDocTemplate 或 CMultiDocTemplate)支持一个对象,该 对象协调给定类型的一个或多个现有文档并 对创建该类型的正确文档、视图和框架窗口 对象进行管理。
CFrameWnd(或其变体之一)支持在文档的一个或 多个视图周围提供框架的对象。
CFRAMEWND(2)
MFC创造框架类的初衷在于:把界面管理工作独立 出来!框架窗口为应用程序的用户界面提供结构框架, 它是应用程序的主窗口,负责管理其包容的窗口。一 个应用程序启动时会创建一个最顶层的框架窗口。
Frame
应用程序类
class WinApp
二、基于文档视结构的程序框架构成
SDI
CDocument CView CWinApp CMainFrame--派生自CFrameWnd
二、基于文档视结构的程序框架构成
MDI
CDocument CView CWinApp CMainFrame--派生自CFrameWnd:主框架类 CChildFrame—派生自CMDIChildWnd:子框架类
(1)文档保留该文档的视图列表和指向创建该文档 的文档模板的指针;文档至少有一个相关联的视图, 而视图只能与一个文档相关联。
(2)视图保留指向其文档的指针,并被包含在其父 框架窗口中;
(3)文档框架窗口(即包含视图的MDI子窗口)保 留指向其当前活动视图的指针;

SDI、MDI和拆分窗口

SDI、MDI和拆分窗口

SDI、MDI和拆分窗口文档、视图和单文档界面一、文档/视图结构的程序文档/视图结构的程序不同于传统的MFC应用程序,传统的MFC应用程序体系主要包括两个对象:应用程序对象和主窗口对象,应用程序对象的主要任务是创建程序的主窗口而主窗口对象的任务主要是用来和程序用户进行交互操作。

文档/视图体系的MFC应用程序包括了应用程序对象、框架窗口对象、视图对象和文档对象四个方面。

应用程序对象和传统MFC程序当中的应用程序对象完成类似的任务:创建其余的三个对象;而框架窗口对象创建了程序窗口的框架;视图对象是一个覆盖在框架窗口对象的客户区上方的一个子窗口,在这个子窗口当中程序实现与用户的交互;文档对象主要是用来实现保存程序数据的功能。

在这个体系当中视图对象和文档对象通过文档的公有成员函数实现数据的交互。

使用文档/视图体系的好处在于通过VC所提供的应用程序向导我们可以方便的创建一个应用程序,并且向导将为我们完成程序当中内存数据和磁盘数据交互的过程,我们只需要为整个应用程序添加核心的代码就可以获得一个带有磁盘IO的强大应用程序。

二、文档文档提供了应用程序数据操作的集合,在这个类当中我们封装所有程序所需要的数据,并且为这些数据的修改和读取提供公有成员函数供视图对象和文档对象交互使用。

在文档类当中我们经常需要覆盖的基类成员函数有:OnNewDocument()这个成员函数提供了创建新文档时文档对象的数据初始化过程;之所以不使用文档对象的构造函数来完成这个功能是因为文档对象仅仅在应用程序创建之初才被创建并调用构造函数。

Serialize(CArchive& ar)这个函数提供了文档数据与磁盘IO的交互功能。

文档类当中我们经常使用的基类成员函数有SetModifiedFlag(BOOL)这个函数设置一个修改标志,如果在文档被关闭的时候这个标志为TRUE那么程序会提示用户保存数据;另一个函数是UpdateAllViews(CView *)这个函数通知与文档对象相关联的视图对象刷新他的显示。

MFC文档视图结构详解

MFC文档视图结构详解

深入浅出MFC“文档/视图”架构(1)基本概念作者:宋宝华 e-mail:21cnbao@1.引言MFC引入了“文档/视图”结构的概念,理解这个结构是编写基于MFC编写复杂Visual C++程序的关键。

“文档/视图”中主要涉及到四种类:(1)文档模板:class CDocTemplate; // template for document creationclass CSingleDocTemplate; // SDI supportclass CMultiDocTemplate; // MDI support(2)文档:class CDocument; // main document abstraction(3)视图:// views on a documentclass CView; // a view on a documentclass CScrollView; // a scrolling view(4)框架窗口:// frame windowsclass CFrameWnd; // standard SDI frameclass CMDIFrameWnd; // standard MDI frameclass CMDIChildWnd; // standard MDI childclass CMiniFrameWnd; // half-height caption frame wnd理解了这4个类各自的意义及它们纵横交错的关系也就理解了“文档/视图”结构的基本概念,在此基础上,我们还需要进一步研究“文档/视图”结构的MFC程序消息流动的方向,这样就完全彻底明白了基于“文档/视图”结构MFC程序的“生死因果”。

出于以上考虑,本文这样组织了各次连载的内容:第1次连载进行基本概念的介绍,第2~5次连载分别讲述文档模板、文档、视图和框架窗口四个类的功能和主要函数,连载6则综合阐述四个类之间的关系,接着以连载7讲解消息流动的方向,最后的连载8则以实例剖析连载1~7所讲述的所有内容。

MFC学习笔记----文档类

MFC学习笔记----文档类

文档类1 文档类相关对数据的管理CDocument-父类是CCmdTarget类,提供文档数据的管理2 文档类的使用2.1 创建过程2.1.1 调用CFrameWnd的LoadFrame函数,调用Create函数创建Frame窗口2.1.2 在Frame的OnCreate函数中,先动态创建视图对象,在根据对象动态的创建View(视图)窗口2.1.3 在View的OnCreate函数中,将View的地址保存到Document(文档)中,将Document的地址保存到View中例://文档类class CMyDocument:public CDocument{DECLARE_DYNCREATE(CMyDocument)//动态创建声明宏public:CMyDocument();CString m_strData;//保存文档中数据的成员};IMPLEMENT_DYNCREATE(CMyDocument,CDocument)//动态创建实现宏//视图类class CDocView:public CEditView{DECLARE_DYNCREATE(CDocView)//动态创建声明宏public:virtual void OnInitialUpdate();//CView中的OnInitialUpdate()虚函数};IMPLEMENT_DYNCREATE(CDocView,CEditView)//动态创建实现宏// OnInitialUpdate()虚函数的重写(为了在视图中显示文档中数据)【1】void CDocView::OnInitialUpdate(){//获取文档的指针C MyDocument *pDc=(CMyDocument*)GetDocument();//根据文档指针显示文档中定义好的数据S etWindowText(pDc->m_strData);}//应用程序类class CMainApp:public CWinApp{public:virtual BOOL InitInstance();};//主窗体类class CMainFrame:public CFrameWnd{public:};CMainApp theApp;BOOL CMainApp::InitInstance(){CMainFrame *pFrame=new CMainFrame();CCreateContext context;//定义一个结构体保存构成窗口的视图,文档等信息【2】context.m_pCurrentDoc=new CMyDocument();//动态绑定文档类保存进结构context.m_pNewViewClass=RUNTIME_CLASS(CDocView);//动态绑定视图类保存进结构//调用CFrameWnd::Create函数创建主窗体,在创建消息处理函数中动态的创建了视图//在视图的创建消息处理函数中,将视图和文档的地址相互保存进对方pFrame->LoadFrame(IDR_MENU1,WS_OVERLAPPEDWINDOW,NULL,&context);//让框架通知文档视图更新(视图根据文档中数据更新)pFrame->InitialUpdateFrame(NULL,TRUE);m_pMainWnd=pFrame;m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateData();return TRUE;}相关:【1】OnInitialUpdate视图窗口完全建立后第一个被框架调用的函数。

第6章--MFC教程

第6章--MFC教程

第6章--MFC教程第6章文档及视图内容:文档、视图、框架、应用四个类的相互作用函数如何添加window消息、菜单消息和鼠标消息捕获消息,限制鼠标的范围,定制鼠标形状,菜单(动态改变菜单)滚动操作、各种坐标第6章文档及视图§6.1文档与视图的关系一、文档/视图结构概述在典型的MFC应用中,文档和视图是成对出现的。

文档/视图的核心部分包括以下四个关键的类。

CDocument类:为文档类提供了基本的功能,用于存储或控制程序中的数据。

CView类:为视图类提供了基本的功能。

视图通常依附于文档,它是文档和用户之间的协调者。

CFrameWnd类:提供了文档中视图的框架窗口。

CDocTemplat或CSingleDocTemplate和CMultiDocTemplate类:协调一个或多个给定类型的文档,并负责创建正确的文档、视图和框架窗口对象。

二、文档模板和文档/视图⑥Window跟踪所有打开的窗口,以便给它们发送消息。

一般情况下,一个框架窗口中只包含一个视图,但在切分窗口中,同样的框架窗口可以包含多个视图指向主框架窗口的指针存储在应用对象的m_pMainWnd成员变量中。

通过一个文档模板来创建的。

框架应用使用了两个文档模板类:用于SDI应用的CSingleDocTemplate类和用于MDI应用的CMultiDocTemplate类。

CSingleDocTemplate模板类一次可以创建和存储一个特定类型的文档;CMultiDocTemplate模板类则可以保存多个已打开的特定类型的文档。

文档模板是由应用对象来创建和维护的。

在应用中的InitIntance函数的关键任务就是创建一个或多个适当的文档模板。

应用对象提供了增加文档模板的接口,系统调用AddDocTemplate函数即可增加文档模板。

当利用File菜单中的New或Open命令创建一个新的文档时,文档模板同时也创建了一个新的框架窗口来查看该文档。

第9章 单文档界面和多文档界面1

第9章 单文档界面和多文档界面1

2011-12-1
2
9.1 文档对象和视图对象
文档和视图的关系
文档用于数据处理和维护, 视图则用于数 文档用于数据处理和维护,而视图则用于数 数据处理 据的显示 在文档/视图结构的应用程序编程中 显示, 视图结构的应用程序编程中, 据的显示,在文档 视图结构的应用程序编程中, 主要的工作就是用代码操作文档对象 视图对象。 操作文档对象与 主要的工作就是用代码操作文档对象与视图对象。 在关于文档对象与视图对象的代码中一般要 调用方法Cview::GetDocument(),通过 调用方法 , GetDocument()可以返回指向联系的视图对象, 可以返回指向联系的视图对象 可以返回指向联系的视图对象, 一般地,当视图为人机交互界面时, 一般地,当视图为人机交互界面时,如果用户在 视图中对文档数据进行编辑, 视图中对文档数据进行编辑,视图将接收到此消 再发送消息通知文档对象更新文档数据, 息,再发送消息通知文档对象更新文档数据,这 时可用GetDocument()得到被操作的文档对象。 得到被操作的文档对象。 时可用 得到被操作的文档对象
2011-12-1
பைடு நூலகம்
5
习题
1.MFC中文档和视图的关系是什么? . 中文档和视图的关系是什么? 中文档和视图的关系是什么 2.文档的主要作用是什么? .文档的主要作用是什么? 3.视图的主要作用是什么? .视图的主要作用是什么?
2011-12-1
6
第9章 单文档界面和多文档界面 章
内 容 提 要
1
文档对象和视图对象
2
单文档界面
3
多文档界面
2011-12-1
1
9.1 文档对象和视图对象
文档对象:文档对象用于存储程序数据, 文档对象 文档对象用于存储程序数据,在 文档对象用于存储程序数据 应用程序中,要使数据存放到文档对象中, 应用程序中,要使数据存放到文档对象中, 就应将存储的数据作为文档对象的成员变 的文档类由Cdocument类所派生。 量。MFC的文档类由 的文档类由 类所派生。 视图对象:显示文档数据以及接受用户的输 视图对象 显示文档数据以及接受用户的输 入和编辑, 入和编辑,视图对象的一个非常重要的成 函数, 员函数是OnDraw()函数,每当窗口需要重 员函数是 函数 画时就将调用此函数, 画时就将调用此函数,MFC的视图类由 的视图类由 Cview类所派生。 类所派生。 类所派生

7.MFC单文档视图构架程序

7.MFC单文档视图构架程序

7.MFC单⽂档视图构架程序⼀、单⽂档视图构架程序 1.相关问题 只能管理⼀个⽂档(只有⼀个⽂档类对象) 2.相关类 CWinApp / CFrameWnd / CView / CDocument CDocTemplate - ⽂档模板类 CSingleDocTemplate - 当⽂档模板类 CDocManager - ⽂档管理类 3.关系图 theApp |--> m_pDocManager //⽂档管理类对象地址 |-->m_templateList //保存单⽂档模板类地址的链表 |-->CSingleDocTemplate(pTemplate) |--> m_pOnlyDoc //⽂档类对象地址 |--> m_pDocClass //⽂档类静态变量地址,RUNTIME_CLASS( CMyDoc ) |--> m_pFrameClass //框架类静态变量地址,RUNTIME_CLASS( CMyFrameWnd ) |--> m_pViewClass //视图类静态变量地址,RUNTIME_CLASS( CMyView ) 4.OnFileNew( )函数的执⾏过程 (1)通过应⽤程序类对象的成员m_pDocManager获取⽂档管理类对象地址 (2)通过⽂档管理类对象的成员m_templateList获取单⽂档模板类对象地址 (3)通过单⽂档模板类对象获取m_pDocClass(⽂档类静态变量),并⽤这个静态变量调⽤CreateObject函数创建⽂档类对象 (4)通过单⽂档模板类对象获取m_pFrameClass(框架类静态变量),并⽤这个静态变量调⽤CreateObject函数创建框架类对象 (5)利⽤框架类对象,调⽤LoadFrame函数,创建框架窗⼝ (6)在处理主框架窗⼝的WM_CREATE消息时,动态创建视图类对象,并创建视图窗⼝ (7)在处理视图窗⼝的WM_CREATE消息时,将视图类对象和⽂档类对象建⽴绑定关系 相关代码:#include "stdafx.h"class CMyDoc : public CDocument{DECLARE_DYNCREATE(CMyDoc)};IMPLEMENT_DYNCREATE(CMyDoc, CDocument)class CMyView : public CEditView{DECLARE_DYNCREATE(CMyView)};IMPLEMENT_DYNCREATE(CMyView, CEditView)class CMyFrameWnd : public CFrameWnd{DECLARE_DYNCREATE(CMyFrameWnd)};IMPLEMENT_DYNCREATE(CMyFrameWnd, CFrameWnd)class CMyWinApp : public CWinApp{public:virtual BOOL InitInstance();};CMyWinApp theApp;BOOL CMyWinApp::InitInstance(){CSingleDocTemplate *pTemplate = new CSingleDocTemplate(IDR_MENU1,RUNTIME_CLASS(CMyDoc),RUNTIME_CLASS(CMyFrameWnd),RUNTIME_CLASS(CMyView));AddDocTemplate(pTemplate);OnFileNew();m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();return TRUE;}View Code 运⾏结果: 伪代码: ////////////////////////////////////////////////////////////////////////////////////////// CSingleDocTemplate::CSingleDocTemplate( nIDResource, pDocClass, pFrameClass, pViewClass ) { //⽗类构造函数 CDocTemplate::CDocTemplate( nIDResource, pDocClass, pFrameClass, pViewClass ) { m_pDocClass = pDocClass; m_pFrameClass = pFrameClass; m_pViewClass = pViewClass; ...... } m_pOnlyDoc = NULL; } ////////////////////////////////////////////////////////////////////////////////////// CWinApp::AddDocTemplate( pTemplate ) //this为&theApp { if ( m_pDocManager == NULL ) m_pDocManager = new CDocManager; m_pDocManager->AddDocTemplate( pTemplate ) //this为⽂档管理类对象地址 { if ( pTemplate == NULL ) { ...... } else { pTemplate->LoadTemplate( ); m_templateList.AddTail( pTemplate ); } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////// OnFileNew( ) //this为&theApp { m_pDocManager->OnFileNew( ) //this为⽂档管理类对象地址 { //拿到链表头结点,因为链表只有⼀个结点,即尾节点,单⽂档模板类对象地址 CDocTemplate* pTemplate = ( CDocTemplate* )m_templateList.GetHead( ); pTemplate->OpenDocumentFile( NULL ) //this为单⽂档模板类地址 { return OpenDocumentFile( lpszPathName, TRUE, bMakeVisible ) //this为单⽂档模板类地址 { CDocument* pDocument = NULL; CFrameWnd* pFrame = NULL; pDocument = CreateNewDocument( ) //this为单⽂档模板类地址 { //动态创建CMyDoc对象并保存地址 CDocument* pDoc = ( CDocument* )m_pDocClass->CreateObject( ); //★★★ AddDocument( pDoc ) //this为单⽂档模板类地址 { CDocTemplate::AddDocument( pDoc ); m_pOnlyDoc = pDoc; //▲▲▲ } return pDoc; } pFrame = CreateNewFrame( pDocument, NULL ) //this为当⽂档模板类对象地址 { CCreateContext context; context.m_pCurrentFrame = NULL; // context.m_pCurrentDoc = pDocument; //⽂档类对象地址 context.m_pNewViewClass = m_pViewClass; //RUNTIME_CLASS(CMyView) context.m_pNewDocTemplate = this; // //动态创建CMyFrameWnd对象并保存地址 CFrameWnd* pFrame = ( CFrameWnd* )m_pFrameClass->CreateObject( ); //★★★ //创建框架窗⼝ pFrame->LoadFrame( ......, &context ); //★★★ return pFrame; } } } } }。

  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.编译、链接和运行程序如下:。

相关文档
最新文档