友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
富士康小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

VC语言6.0程序设计从入门到精通-第7部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!



的 更 改 在 用 户 通 过 视 图 对 文 档 进 行 更 改 时 发 生 。 在 此 情 况 下 , 视 图 调 用 文 档 的 

UpdateAllViews()成员函数,通知同一文档上的所有视图对自身进行更新,UpdateAllViews() 

函数调用每个视图的 OnUpdate()成员函数,使视图的整个工作区无效。可以重写 OnUpdate, 

仅使工作区中映射到文档修改部分的那些区域无效。  



2。4。3    文档类与视图类的相互关系  



   在文档…视图结构里,文档是一个应用程序数据基本元素的集合,它是构成应用程序所使 

用的数据单元;另外它还提供了管理和维护数据的手段。文档是一种数据源,数据源有很多 

种,最常见的是磁盘文件,也可以来自串行口、网络或摄像机输入信号等,文档对象负责来 

自所有数据源的数据的管理。 

                       

   视图是数据的显示窗口,为用户提供了文档的可视的数据显示,它把文档的部分或全部 

内容在窗口中显示出来。视图还为用户提供了一个与文档中的数据交互的界面,它把用户的 

输入转化为对文档中数据的操作。一个文档可以有多个不同的视图。比如,在 Excel                     电子表 

格中,可以将数据以表格方式显示,也可以将数据以图表方式显示。一个视图既可以输出到 

窗口中,也可以输出到打印机上。图 2…19 显示了文档…视图结构中的文档与视图的关系。  



                                                



                         图 2…19    文档与视图的关系  



 ·26 ·  


…………………………………………………………Page 36……………………………………………………………

                                                           第 2 章    应用程序基本框架  



    MFC 的文档视图结构机制把数据同它的显示以及用户对数据的操作分离开来,所有对数 

据的修改由文档对象来完成,视图调用这个对象的方法来访问和更新数据。  

    CDocument 类的 UpdateAllViews()成员函数和 CView 类的 OnUpdate()成员函数传递描述 

被修改的文档部分的信息。上述机制可限制视图必须重绘的区域。当视图变得无效时, 

Windows 将 WM_PAINT 消息发送给它,该视图的 OnPaint()函数处理函数通过创建 CPaintDC 

类的设备上下文对象来响应该消息并调用视图的                      OnDraw()成员函数,通常不必编写重写的 

OnPaint()处理成员函数。设备上下文是包含设备(例如显示器或打印机)绘图属性信息的 

Windows  数据结构,所有的绘图调用都通过设备上下文对象进行。对于屏幕上的绘图, 

CPaintDC 对象传递给 OnDraw()函数。对于打印机上的绘图,为当前打印机设置的 CDC 对象 

传递给 OnDraw()函数。视图中的绘图代码首先检索指向文档的指针,然后通过设备上下文进 

行绘图调用,下面简单的 OnDraw()函数示例阐释了该过程:  



    void CMyView::OnDraw( CDC* pDC )  



    {  



            CMyDoc* pDoc = GetDocument();  



            CString s = pDoc…》GetData();      // Returns a CString  



            CRect rect;  



            GetClientRect( &rect );  



            pDC…》SetTextAlign( TA_BASELINE | TA_CENTER );  



            pDC…》TextOut( rect。right / 2; rect。bottom / 2;    



                                        s; s。GetLength() );  



    }  



    在此例中,将 GetData()函数定义为派生文档类的成员,打印从文档获取的任何字符串, 

并使字符串在视图中居中。如果 OnDraw 调用用于屏幕绘图,则传递给 pDC  的 CDC 对象是 

一个 CPaintDC   (它的构造函数已经调用BeginPaint )对象,对绘图函数的调用通过设备上下 

文指针进行。  

    文档的大小经常比它的视图可以显示的大小要大,之所以会发生这种情况,是因为文档 

的数据增加了或用户缩小了为视图设置的窗口,在此情况下,视图必须支持滚动。任何视图 

都可以在其 OnHScroll 和 OnVScroll 成员函数中处理滚动条消息。可以通过自定义代码完成 

全部工作,在这些函数中实现滚动条消息处理;或者可以利用                             CScrollView 类处理滚动。 

CScrollView 在默认情况下执行下列操作:  

    o  管理窗口和视图区大小以及映射模式;  

    o  响应滚动条消息进行自动滚动。  

    可以指定“页”的滚动量(当用户单击滚动轴时)和指定“行”的滚动量(当用户单击 

滚动箭头时),设计这些值以符合视图的自然特性 。例如,可能需要以 1 像素的增量滚动图形 

视图,而在文本文档中则要使用基于行高的增量来滚动。  

    对单文档(SDI )界面来讲,一个应用程序中只用一个框架窗口,对多文档(MDI )界 

面来讲可能有多个 MDI 子窗口。每一个视图都是一个子窗口,在单文档界面中父窗口即是框 

架窗口,在多文档界面中父窗口为 MDI 子窗口。一个多文档应用中可以包含多个文档模板, 

一个模板定义了一个文档和一个或多个视图之间的对应关系。同一个文档可以属于多个模板, 

但一个模板中只允许定义一个文档,同样一个视图也可以属于多个文档模板。  



                                                                          ·27 ·  


…………………………………………………………Page 37……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



2。4。4    单文档(SDI )与多文档(MDI )应用程序  



    在单文档界面程序中,同一时刻只能操作一个文档。如                        Windows  2000 下的记事本 

 Notepad )程序就是这样的例子,如图 2…20 所示。在单文档界面中打开文档时,程序会自动 

( 

关闭当前打开的活动文档,若文档修改后尚未保存,会提示是否保存所做的修改。由于一次 

只能打开一个窗口,因此不像 Visual  C++集成开发环境那样需要一个窗口菜单。单文档应用 

程序一般都提供一个文件(File )菜单,在该菜单下有一组命令,用于新建文档(New )、打 

开已有文档(Open )、保存或重命名存盘文档等。这类程序相对比较简单,常见的应用程序 

为终端仿真程序或一些工具程序。  



                                                            



                          图 2…20    单文档程序(Notepad )  



    在多文档界面应用程序中允许同时操作多个文档。Visual  C++集成开发环境就是这样的 

例子,其界面如图 2…21 所示。在界面中可以同时打开多个文件(同时也就为每个文件打开一 

个窗口),并通过切换活动窗口激活相应的文档进行编辑。多文档应用程序也提供一个文件 

(File )菜单,用于新建、打开、保存文档。与单文档应用程序不同的是,它往往还提供一个 

关闭(Close )菜单项,用于关闭当前打开的文档;一个窗口菜单用于管理所有打开的子窗口, 

包括对子窗口的新建、关闭等,关闭一个窗口时,窗口内的文档也被自动关闭。  



                                                           



                        图 2…21    多文档程序(Visual C++ IDE )  



 ·28 ·  


…………………………………………………………Page 38……………………………………………………………

                                                        第 2 章    应用程序基本框架  



    可以通过 AppWizard 很方便地生成 SDI 和 MDI 类型的应用程序,这两种结构在代码设 

计方面也有如下的区别。  

    o  SDI 程序仅仅基于主框架窗口(CMainFrame ),而  MDI            程序同时基于主框架窗口 

      ( 

       CMainFrame )和子框架窗口(CChildFrame )。  

    o  对于管理文档、框架和窗口的文档模板类,两种结构也有本质的差别。SDI 程序基于 

      的文档模板类是 CSingleDocTemplate,只能管理单个文档类型;而 MDI 程序基于的文 

      档模板类是 CMultiDocTemplate,能同时创建多种文档类型。  

    o  只能向 SDI 应用程序类中加入一种文档模板,而可以向 MDI  应用程序类中加入多个 

      CMultiDocTemplate 对象。  

    SDI 程序和 MDI 程序的文档视图结构都是由文档模板管理的,下面针对 MDI 应用程序 

的情况介绍文档模板在编程的应用。  

    每个应用程序类(CWinApp 的派生类)中都保留并维护了一份所有文档模板的指针列表, 

这是一个链表结构。应用程序为所要支持的每个文档类型动态分配一个                            CMultiDocTemplate  

对象,并在应用程序类的 CWinApp::InitInstance 成员函数中将每个 CMultiDocTemplate 对象 

传递给 CWinApp::AddDocTemplate,该函数将一个文档模板加入到应用程序可用文档模板的 

列表中。应用程序可以用 CWinApp::GetFirstDocTemplatePostion  获得应用程序注册的第一个 

文档模板的位置,利用该值来调用                 CWinApp::GetNextDocTemplate 函数,获得第一个 

CDocTemplate 对象指针。  

    一个文档模板可以有多个文档,每个文档模板都保留并维护了一个所有对应文档的指针 

列表。应用程序可以用 CDocTemplate::GetFirstDocPosition 函数获得与文档模板相关的文档集 

合中第一个文档的位置,并用 POSITION 值作为 CDocTemplate::GetNextDoc 的参数来重复遍 

历与模板相关的文档列表。  

    在文档中可以调用  CDocument::GetDocTemplate  获得指向该文档模板的指针。一个文档 

                                                          CDocument::AddView 

可以有多个视图,每一个文档都保留并维护一个所有相关视图的列表。 

将一个视图连接到文档上,将该视图加入到文档相联系的视图的列表中,并将视图的文档指 

针 指 向 该 文 档 。 当 有 选 择 菜 单 命 令 “ File|New ” 、“File|Open ”、“Windows|New ” 或 

“Window|Split ”菜单命令而将一个新创建的视图的对象连接到文档上时,MFC 会自动调用该 

函数,框架通过文档视图结构将文档和视联系起来。当然,也可以根据特定需要手动调用该 

函数。  



    技巧:使 MDI 启动时不建立一个新文件  



         使用 AppWizard  工具生成的 MDI  程序启动时会默认创建一个空白文件,这有时候会带来 



         麻烦(也许在程序启动时不允许创建新文件 )。为了使 MDI 启动时不建立一个新文件,需 



         要修改 InitInstance() 函数如下:  



           CmandLineInfo cmdInfo;  



           if (cmdInfo。m_nShellmand == CmandLineInfo::FileNew )  



           {  



               cmdInfo。m_nShellmand = CmandLineInfo::FileNothing;  



           }  



           ParsemandLine (cmdInfo );  



                                                                       ·29 ·  


…………………………………………………………Page 39……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



         此时程序启动后显示如图 2…22 所示。  



      



    实例 2…4 :技巧演示实例。源代码在光盘中“02实例 2…4TestMDI ”目录下。  



                                                                      



                          图 2…22    MDI 启动时不生成新文件示例  



2。5    窗口类及其控件栏  



    框架窗口为应用程序界面提供结构框架,它是应用程序的主窗口,负责管理其包容的窗 

                                                                     MFC   提供了 

口,一个应用程序的最顶层的框架窗口为应用程序启动时创建的第一个窗口。 

CFrameWnd、CMDIFrameWnd、CMDIChildWnd 和 Cdialog 类,分别用于支持单文档窗口、 

多文档窗口和对话框。同时,在基于文档视图的应用框架中也经常用到相关的控件栏,如工 

具栏、状态栏等,这些也是应用程序不可缺少的部分。下面将对这些方面进行分别介绍。  



2。5。1    主窗口类  



    主窗口类 CMainFrame 可以应用在 SDI 或 MDI 结构中。在 SDI 框架结构中,CMainFrame 

派生于类 CFrameWnd,形成单个文档及其视图的边框。框架窗口既是应用程序的主框架窗口, 

也 是 当 前 文 档 对 应 的 视 图 的 边 框 。 在         MDI  框 架 结 构 中 , CMainFrame     派 生 于 类 

CMDIFrameWnd,它是所有 MDI 文档窗口的容器,并与它们共享菜单条,MDI 框架窗口是 

出现在桌面中的顶层窗口。 

                          

    窗口的创建分为两步:第一步是用 new 运算符创建一个窗口对象,但是此时只是初始化 

窗口的数据成员,并没有真正创建窗口(这一点与一般的对象有所不同)。  



    //第一步:创建一个 C++对象,其中 CMainFrame 是从 CFrameWnd 派生的对象  



    CMainFrame* pMyFrame=new CMainFrame();//用 new 操作符创建窗口对象  



 ·30 ·  


…………………………………………………………Page 40……………………………………………………………

                                                                   第 2 章    应用程序基本框架  



     或  



     CMainFrame MyFrame;//定义一个窗口对象,自动调用其构造函数  



     第二步是创建窗口。使 CFrameWnd  的 Create 成员函数创建窗口,并将其句柄保存在 C 

公共数据成员 m_hWnd  中。  



    //第二步:创建窗口  



    pMyFrame…》Create(NULL;“My Frame Window”);  



     或  



     MyFrame。Create(NULL;“My Frame Window”);  



2。5。2    子窗口类  



     子窗口类      CChildFrame   主要用在多文档(MDI )结构中,在单文档中只存在主窗口 

( 

 CMainFrame ),不存在子窗口的概念。CChildFrame 派生于类 CMDIChildWnd,用于在 MDI 

主框架窗口中显示打开的各个文档,每个文档及其视图都有一个 MDI 子框架窗口,子框架窗 

口包含在MDI 主框架窗口中 。子框架窗口看起来类似一般的框架边框窗口,但它是包含在主 

框架窗口中,而不是位于桌面上,并且被主窗口所裁剪。而且 MDI 子窗口没有自己的菜单, 

它与主 MDI 框架窗口共享菜单 。框架自动更改 MDI 框架的菜单,用于代表当前活动的 MDI 

子窗口。为了为应用创建有用的 MDI 子窗口,需要从 CMDIChildWnd 派生类,为派生类增 

添成员变量,从而为应用存储指定的数据。实现消息处理的成员函数,并在派生类中实现消 

息映射,以便于指出当消息传递给窗口后,将按照什么方式处理消息。  

     构造 MDI 子窗口主要有下面 3 种途径:  

     o  使用 Create()函数直接构造;  

     o  使用 LoadFrame()函数直接构造;  

     o  通过文档模板直接构造。  



     技巧:如何改变 MDI 窗口框架的颜色?  



          MDI 框架的客户区被另一个窗口的框架所覆盖,为了改变客户区的背景色,需要重画这个 



          客户窗口。为了做到这点,要处理消息 WM_ERASEBKND 产生一个新类,如从 CWnd 继 



          承一个新类,称为 CMDIClient,具体可见下面的代码片断。  



      



     实例 2…5 :改变 MDI 窗口框架的颜色。源代码在光盘中“02实例 2…5TestMDI ”目录下。  



     #include 〃MDIClient。h〃    



     class CMainFrame : public CMDIFrameWnd    



     {    



     。。。    



    protected:    



     CMDIClient m_wndMDIClient;    



     }  



     在 CMainFrame 中重载 CMDIFrameWnd::OnCreateClient    



                                                                                     ·31 ·  


…………………………………………………………Page 41……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



       BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs; CCreateContext* pContext)    



       {    



               if ( CMDIFrameWnd::OnCreateClient(lpcs; pContext) )    



               {    



                       m_wndMDIClient。SubclassWindow(m_hWndMDIClient);    



                       return TRUE;    



               }    



               else    



                       return FALSE;    



       }  



       //然后就可以加入对消息 WM_ERASEBKGND 的处理函数。  



       BOOL CMDIClient::OnEraseBkgnd(CDC* pDC)    



       {  



              CBrush brush(RGB(200;100;0));  



              CRect rect;  



              GetClientRect(&rect);  



              pDC…》FillRect(rect;&brush);  



              return TRUE;          



       }  



       程序运行结果如图 2…23 所示,其中框架颜色变成了橘红色,有关该技巧的源代码请参见 

附带光盘。  



                                                                                                                             



                                              图 2…23    改变 MDI 窗口的框架颜色  



 ·32 ·  


…………………………………………………………Page 42……………………………………………………………

                                                          第 2 章    应用程序基本框架  



2。5。3    工具栏  



    工具栏由一系列的按钮和间隔(Seperator )组成。一般功能相关的按钮组成一组,各组 

                                                                     MFC 中使 

按钮之间以一定的间隔分开 。通常,工具栏作为主框架窗口中的一个子窗口存在。 

用 CToolBar 类来封装工具条控件的各种操作,可以在资源编辑器的 ToolBar 上单击鼠标右键, 

选择 Insert  ToolBar  项,选中一个工具栏后,鼠标左键双击该工具栏就可以编辑,如图 2…24 

所示。  



                                                  



                          图 2…24    添加一个新的 ToolBar 资源  



    工具栏上所有按钮的图形在资源中实际上是以一个位图文件存在的。在利用 AppWizard 

创建的工程中,自动创建的工具栏位图文件名为 ResToolBar。bmp 。在位图中每个按钮占用一 

个宽为 16 像素、高为 15 像素的区域。可以用图形工具条及颜色盒绘制按钮的外表,它的属 

性包括 ID、长、宽及鼠标指向它时的说明。一般在 CMainFrame 中定义 CToolBar,其实现在 

CMainFrame 的 OnCreate 函数中完成
返回目录 上一页 下一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!