第10章与视图样式编辑母版文本样式_第1页
第10章与视图样式编辑母版文本样式_第2页
第10章与视图样式编辑母版文本样式_第3页
第10章与视图样式编辑母版文本样式_第4页
第10章与视图样式编辑母版文本样式_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于案例的Visual C+程序设计教程1本讲主要内容利用向导建立一个单文档应用程序框架 向导生成的核心类及其功能 文档/视图 在客户区显示文本使用菜单 基于MFC进行应用程序开发使用VC+的应用程序向导MFC AppWizard可以开发:Single document(单文档)(单文档)Multiple document(多文档)Dialog based(基于对话框)三种类型的应用程序。本讲开始学习单文档应用程序的开发技术10.1 文本显示案例的描述利用MFC建立一个单文档应用程序,主要用于在客户区显示文本。程序的主要功能包括:u使用菜单命令u按照输入的文本内容和坐标位置在客户区显示文本u保

2、存文本内容等。10.2 单文档应用程序的基本结构单文档(Single Document Interface,SDI)应用程序是指程序运行后出现标准的Windows界面,并且同一时间只能打开一个文档的应用程序。Windows界面由框架(包括菜单栏、工具栏、状态栏)和客户区组成。10.2.1 利用向导建立一个SDI框架【例10-1】利用MFC AppWizardexe向导生成一个单文档应用程序MyTextOut。【编程步骤】(1)在Visual C+ IDE中执行File|New命令,打开New对话框。在项目类型列表框中选择MFC AppWizardexe项,在Project name框中输入项目

3、名称,本例为MyTextOut。(2)设置完成后,单击OK按钮,出现MFC AppWizard-Step 1对话框。在该对话框中选择Single document项,向导将会创建一个单文档应用程序框架。 在本例中,以下的各个步骤使用向导提供的默认选项即可。例10-1框架代码运行界面利用MFC AppWizardexe向导创建应用程序MyTextOut的框架后,用户无须添加任何代码,就可以对程序进行编译、连接,生成一个应用程序并且运行。运行结果如下图所示。框架(菜单栏、工具栏、状态栏) 客户区单文档程序要包含文档,并且一次只能打开一个文档,其框架是指菜单栏、工具栏、状态栏等界面元素,客户区则用于

4、展示用户文档。10.2.2 向导生成的核心类及其功能 MFC应用程序框架实质上是一个标准的Windows应用程序,它具有标准的窗口、菜单栏和工具栏。MFC AppWizardexe向导为一般的SDI应用程序生成了五个核心类,它们分别是:应用程序类应用程序类CMyTextOutApp框架窗口类框架窗口类CMainFrame文档类文档类CMyTextOutDoc视图类视图类CMyTextOutView文档模板类文档模板类CSingleDocTemplate应用程序框架中类的命名 一般应用程序框架中所有类的名字由MFC AppWizardexe向导根据一定的规则自动命名,但用户可以在向导的第6步改变

5、类名和有关类的文件名。除了框架窗口类CMainFrame和文档模板类CSingleDocTemplate,应用程序框架中类的命名一般遵照如下规则: Class Name = C + ProjectName + ClassType五个MFC基类 应用程序框架是生成一般的应用程序所必需的各种组件的集成,是类库的一种超集。应用程序框架可以调用成百上千个不同的类,但是核心类只有上述五个。它们的MFC基类分别是:应用程序类CWinApp、框架窗口类CFrameWnd、文档类CDocument、视图类CView以及文档模板类CDocTemplate。五个MFC基类 (1)应用程序类CMyTextOutAp

6、pCMyTextOutApp类是MFC的CWinApp类的派生类。它的主要功能有:应用程序的初始化应用程序的初始化程序的启动程序的启动程序运行结束时的清理工作程序运行结束时的清理工作应用程序对象theApp是一个唯一的全局变量,它的主要功能是通过调用WinMain()主函数启动程序的运行。(2)框架窗口类CMainFrameCMainFrame类是MFC的CFrameWnd类的派生类。它主要负责创建标题栏、菜单栏、工具栏和状态栏。对于不同的SDI应用程序,框架窗口类名均为CMainFrame,该类的两个支持文件的文件名在不同的工程中也都是一样的。CMainFrame类中声明了框架窗口中的工具栏

7、m_wndToolBar、状态栏m_wndStatusBar两个成员变量和四个成员函数。五个MFC基类 五个MFC基类 (3)文档类CMyTextOutDoc类CMyTextOutDoc是MFC的CDocument类的派生类,它用于管理和维护数据,包括应用程序数据的保存和装载,即实现文档的序列化。(4)视图类CMyTextOutView类CMyTextOutView是MFC的CView类的派生类,它主要负责客户区文档数据的显示,以及如何进行人机交互。五个MFC基类 (5)文档模板类CSingleDocTemplate框架窗口对象、文档对象、视图对象如何联系在一起为一个应用程序服务呢?这就是另一

8、个核心类:文档模板类CSingleDocTemplate的工作。文档、视图、框架类和所涉及的资源形成了一种固定的联系,这种固定的联系就称为文档模板。也就是说,文档模板描述了相对应每一种类型文档的视图和窗口的风格类型。上述五个SDI应用程序核心类的MFC基类的类层次关系如图所示。CObjectCCmdTargetCWinThreadCDocumentCWinAppCDocTemplateCWndCSingleDocTemplateCFrameWndCView10.2.3 文档/视图结构一般的应用开发都会涉及到数据处理。为了统一和简化数据处理,基于MFC的应用程序通常采用文档/视图结构。在MFC文

9、档/视图结构中,有关数据处理的工作可以分为数据的处理和数据的显示两个部分。文档负责数据的处理、数据的维护以及数据的存储;视图则负责数据的显示和数据的编辑,客户区消息的响应和处理等工作,即充当了文档与用户之间的交互界面。文档与视图文档(document)是MFC应用程序中所处理数据的集合,包括文本、图形、图像和表格等类型。视图(view)是文档在应用程序窗口中的一个映像。视图就如一个观景器,用户通过视图看到文档,通过视图修改文档。一个视图是一个没有边框的窗口,它位于主框架窗口中的客户区。视图是文档对外显示的窗口,但它并不能完全独立,它必须依存在一个框架窗口内。 文档模板文档、视图、框架类和所涉及

10、的资源形成了一种固定的联系,这种固定的联系就称为文档模板。也就是说,文档模板描述了对应每一种类型文档的视图和窗口的风格类型。当打开某种类型的文件时,应用程序必须确定哪一种文档模板用于解释这种文件。在初始化程序时,必须首先注册文档模板,以便程序利用这个模板来完成主框架窗口、视图、文档对象的创建和资源的装入。例10-1中相关代码BOOL CMyTextOutApp:InitInstance() CSingleDocTemplate* pDocTemplate; /声明文档模板指针声明文档模板指针pDocTemplate = new CSingleDocTemplate( /创建文档模板对象创建文档

11、模板对象IDR_MAINFRAME, /文档模板使用的资源文档模板使用的资源IDRUNTIME_CLASS(CMyTextOutDoc), /创建文档对象创建文档对象RUNTIME_CLASS(CMainFrame), / 创建主创建主SDI框架窗口对象框架窗口对象RUNTIME_CLASS(CMyTextOutView); /创建视图对象创建视图对象AddDocTemplate(pDocTemplate); /将文档模板加入文档模板链表将文档模板加入文档模板链表 MFC应用程序框架中各个对象之间的相互访问方法当前位置被访问的位置访问方法文档视图GetFirstViewPosition()Ge

12、tNextView()UpdateAllViews()文档模板GetDocTemplate()视图文档GetDocument()视图框架GetParentFrame()框架视图GetActiveView()框架文档GetActiveDocument()MDI主框架MDI子框架MDIGetActive()MDI子框架MDI主框架GetParentFrame()任何位置应用程序AfxGetApp()任何位置主框架AfxGetMainWnd()10.3 文字的显示【例10-2】以例10-1的单文档应用程序MyTextOut为基础,添加代码实现文本输出。 程序运行后在视图窗口显示文本串“这是我的第一个

13、单文档应用程序!”。例10-2【编程步骤】(1)本例需要在视图类的成员函数OnDraw()中添加显示文本的代码来实现屏幕输出。 打开Workspace窗口并单击ClassView标签,找到CMyTextOutView类,单击其左边的“+”展开该类,双击其成员函数OnDraw(),在编辑窗口出现该成员函数代码,在指定位置手工添加如下代码。例10-2void CMyTextOutView:OnDraw(CDC* pDC)CMyTextOutDoc* pDoc = GetDocument(); /获得文档类对象的指针获得文档类对象的指针 ASSERT_VALID(pDoc); /检查该指针是否为空检

14、查该指针是否为空/ TODO: add draw code for native data here /在视图内的设备坐标在视图内的设备坐标(50,50)位置输出文本位置输出文本pDC-TextOut(50,50,这是我的第一个单文档应用程这是我的第一个单文档应用程序序!);使用使用MFC开发程序,有开发程序,有一部分代码是向导自动一部分代码是向导自动生成的,另外一部分代生成的,另外一部分代码是需要手工添加的。码是需要手工添加的。TextOut()是是CDC类的成员函数。其功能是在指定的类的成员函数。其功能是在指定的位置输出文本串。函数原型如下:位置输出文本串。函数原型如下:CDC: Text

15、Out( int x, int y, const CString& str )其中参数其中参数x,y指定文本输出位置坐标。指定文本输出位置坐标。 参数参数str指定输出内容。指定输出内容。MFC应用程序通常在视图类的成员函数应用程序通常在视图类的成员函数OnDraw()中实现屏幕输出,中实现屏幕输出,因为在重画窗口时会自动调用函数因为在重画窗口时会自动调用函数OnDraw(),这样才能保证显示,这样才能保证显示的内容在每次重画窗口时都能显示出来。的内容在每次重画窗口时都能显示出来。GetDocument()是视图类的成员函数,调用它是视图类的成员函数,调用它可以返回与视图相关联的文档对

16、象的指针,利可以返回与视图相关联的文档对象的指针,利用这个指针可以访问文档类及其派生类的公有用这个指针可以访问文档类及其派生类的公有成员。通常的用法如下:成员。通常的用法如下:CMyTextOutDoc* pDoc = GetDocument();ASSERT_VALID(pDoc); ASSERT_VALID()是是MFC库中的断言库中的断言 。ASSERT_VALID()的的用法是用法是:ASSERT_VALID(一个从一个从CObject类派生的类对象指针类派生的类对象指针)功能:用于对功能:用于对C+对象或指针进行有效性判断,如果出错,会弹出带对象或指针进行有效性判断,如果出错,会弹出

17、带断言信息(程序,模块,断言信息(程序,模块, assertion行)的对话框。对话框有行)的对话框。对话框有3个按钮:个按钮:“Break”,“Repeat”(“Debug”),), 和和“Continue”(“Ignore”)。)。 执行Build(F7)命令编译连接程序,程序运行后将在程序视图区域显示文本串。程序运行结果如图所示。例10-2运行结果Windows的设备环境DC在Windows中,凡绘图操作之前一定要先获得一个DC。DC是一种包含设备信息的数据结构,它可能代表全部屏幕,也可能代表一个窗口。DC包含了物理设备所需的各种状态信息。DC实际上是一个关于如何绘制图形的方法的集合。它

18、可以确立在应用窗口中绘制图形的方式,包括坐标系统(映射模式)、绘图工具(如画笔、画刷、颜色)等等。当应用程序需要在某个图形设备上绘图时,首先要获取绘图窗口区域的一个设备环境DC,之后才能选取合适的绘图工具进行绘图工作。图形设备接口GDI为了方便图形绘制,Windows把与绘图相关的操作都制作成函数,这些函数的集合称为图形设备接口(graphical device interface,GDI)。GDI提供了各种绘图函数,例如GDI中有绘制矩形的函数Rectangle()、绘制文本的函数DrawText()等。GDI还提供了一套绘图工具,如Pen(画笔)、Brush(画刷)、Font(字体)等。由

19、于在Windows屏幕上看到的所有内容都是图形,所以在应用窗口中每次进行显示和编辑操作时,都必须调用特定的GDI函数。 CDC类MFC将DC和GDI函数封装到一起形成了两种重要的图形处理的类:设备环境类(CDC类),用于访问设备属性、设置绘图属性和绘制图形;绘图对象类,封装了各种GDI绘图对象,包括画笔、画刷、字体、位图、调色板和区域。MFC中,设备环境DC是由CDC类对象来表示的,并且可以调用CDC类的成员函数来完成各种各样的绘图操作,它提供了170多个成员函数。CDC类中的成员函数(部分)函数功能说明Arc()画圆弧BitBlt()把一个DC中的位图复制到另一个DC中Ellipse()画椭

20、圆FillRect()用参数指定的画刷来填充矩形LineTo()从当前位置画直线到参数指定的位置MoveTo()从当前位置把画笔移动到参数指定的位置Rectangle()画矩形SelectObject()把参数指定的绘图工具选入绘图环境SetTextColor()设置文本的颜色TextOut()绘制字符串设备环境描述类CDC类是CObject的直接派生类,CDC类除了作为通用的设备环境类来使用,还派生了几种特定的设备环境描述类,包括:CClientDC类CPaintDC类CMetaFileDC类CWindowDC类CDC类的几个派生类及其作用类名作用CClientDC该设备描述表提供对窗口客户

21、区域的图形访问。在窗口中画图时可使用此类。但对WM_PAINT Windows消息除外。CMetaFileDC该设备描述表代表Windows图元文件,其包含一系列可以重新产生图像的命令。当需要创建独立于设备的文件时使用该类,用户可以回放这种文件来创建图像。CPaintDC该设备描述表提供对窗口客户区的图形访问,该类响应WM_PAINT Windows消息。应用程序可以使用此DC更新Windows显示。通常在MFC应用程序的OnPaint()函数中使用。CWindowDC该类代表了整个程序窗口设备环境,包括窗口边框、标题栏、菜单栏、工具栏和状态栏等非客户区和客户区,使用该设备环境可以在整个程序窗

22、口区域绘图。WM_PAINT消息当用户改变了应用程序窗口的大小,或者当窗口恢复了先前被覆盖的部分,应用程序窗口都会收到Windows发来的WM_PAINT消息,然后应用程序框架自动调用视图类CView的成员函数OnPaint()或程序员添加的函数OnPaint()来处理WM_PAINT消息,在OnPaint()函数中重绘窗口中需要恢复的部分图形,更简单的方法是重绘整个窗口。CPaintDC类CPaintDC类是OnPaint()函数使用的设备环境类,它代表一个窗口的绘图画面。如果添加WM_PAINT的消息处理函数OnPaint(),就需要使用CPaintDC类来定义一个设备环境对象。在CVie

23、w类的成员函数OnPaint()中就这样定义了一个设备环境对象。void CView:OnPaint() /standard paint routine CPaintDC paintDC; /定义一个设备环境对象paintDC OnPrepareDC(&paintDC); OnDraw(&paintDC);OnDraw()函数由于基类CView的OnPaint()函数调用了OnDraw()函数,因此编程时经常在OnDraw()函数中绘制图形。MFC AppWizard应用程序向导创建的OnDraw()函数自动支持所获取的DC。OnDraw()函数的声明为: OnDraw(CDC

24、 *pDC);这个函数的参数pDC就是指向CPaintDC类对象的指针,在OnDraw()函数中可以使用CDC类的成员函数对这个对象进行绘图操作。GDI坐标系和映射模式GDI支持两种类型的坐标系:逻辑坐标系:一般GDI的文本和图形输出函数使用的是逻辑坐标。设备坐标系:在客户区移动或按下鼠标所得到的鼠标位置使用的是设备坐标。逻辑坐标系是面向设备环境DC的坐标系,这种坐标不考虑具体的设备类型,但在实际绘图时GDI会根据当前设置的映射模式将逻辑坐标转换为设备坐标。映射模式映射模式规定了逻辑单位的实际大小、坐标轴的正方向,所有的映射模式的坐标原点都设在设备输出区域(如客户区或打印区)的左上角。GDI定

25、义了8种映射模式。使用映射模式使得程序员不必考虑输出设备的设备坐标系,只需在一个统一的逻辑坐标系中进行图形的绘制。Windows的8种映射模式映射模式映射识别码逻辑单位坐标系设定MM_TEXT1一个像素X轴正方向朝右,Y轴正方向朝下MM_LOMETRIC20.1毫米毫米X轴正方向朝右,Y轴正方向朝上MM_HIMETRIC30.01毫米毫米X轴正方向朝右,Y轴正方向朝上MM_LOENGLISH40.01英寸英寸X轴正方向朝右,Y轴正方向朝上MM_HIENGLISH50.001英寸英寸X轴正方向朝右,Y轴正方向朝上MM_TWIPS61/1440英寸X轴正方向朝右,Y轴正方向朝上MM_ISOTROP

26、IC7系统确定X、Y轴可任意调节,X、Y轴比例为1:1MM_ANISOTROPIC8系统确定X、Y轴可任意调节,X、Y轴比例任意10.3.2 菜单【例10-3】改进例10-2的单文档应用程序MyTextOut,程序运行后使用菜单命令,调用对话框输入要显示的文本内容和显示的坐标位置,在视图区按照所给的坐标位置显示文本。例10-3【编程步骤】(1)建立菜单资源。在向导生成的程序框架中修改菜单资源,添加“文本”|“显示文本”菜单。在ResourceView中找到IDR_MAINFRAME资源,双击之,在显示出来的主菜单项最后的虚线空白框处双击,在弹出的properties对话框中填写Caption项

27、为“文本(&T)”,可以看到主菜单最后一个菜单项即为“文本”,字符“&”用于在显示字母“T”时加下划线,表示该菜单命令的快捷键是“Alt+T”。接着为主菜单添加菜单项。在“文本”菜单下面的虚线空白框处双击,在弹出的properties对话框中填写Caption项为“显示文本”,在ID框中填写此菜单项的标识ID_TEXT_OUTPUT。在Prompt文本框中输入状态栏提示语“在视图区给定位置显示输入的文本内容”。如图所示。例10-3(2)添加菜单命令处理函数。按下Ctrl+W键启动ClassWizard,在Class name下拉列表框中选择文档类CMyTextOutDoc,在O

28、bject IDs列表框中选择ID_TEXT_OUTPUT(“显示文本”菜单项的ID),在Messages列表框中选择COMMAND,单击Add Function按钮,为“显示文本”菜单项添加命令处理函数CMyTextOutDoc:OnTextOutput()。该函数名是自动生成的。如图所示。例10-3(3)创建对话框资源。在ResourceView中找到Dialog资源,鼠标右击弹出快捷菜单,单击“Insert Dialog”,添加一个新对话框,修改其ID为 IDD_DLG_TEXT,Caption项为“请输入文本内容和显示位置”。参见下图。之后在对话框上放置相应的控件并布局。例10-3例1

29、0-3在对话框上放置静态控件、编辑框控件和按钮控件。修改三个编辑框的ID,使之分别为IDC_EDIT_TEXT、IDC_TEXT_X、IDC_TEXT_Y。为编辑框IDC_EDIT_TEXT勾选“Multiline(多行)”、“Vertical Scroll(垂直滚动条)”、“Want return”选项。如图所示。例10-3为对话框资源创建对应的对话框类。双击对话框资源,弹出为对话框增加类的对话框。如图所示。单击该对话框上的OK按钮,弹出如图所示的对话框。在对话框中填写对话框类名为CTextDialog,为该类自动生成两个文件TextDialog.h和TextDialog.cpp。例10-3为三个编辑框控件添加成员变量m_strText、m_nText_X、m_nText_Y。如图所示。例10-3 查看TextDialog.h文件,在CTextDialog类中已经由ClassWizard加入了对话框资源控件所对应的成员变量。class CTextDialog : public CDialog / Dialog Data /AFX_DATA(CTextDialog) enum IDD = IDD_DLG_TEXT ; /由ClassWizard 添加到代码中的变量 CStr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论