友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
喜书网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言实例教程(PDF格式)-第79章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




一个相当重要,也相当方便的途径。  



在这一节中,我们会按照各类在MFC中的层次讲解,由于面向对象语 

言的自身特性,父类所具有的特征,其派生出来的子类一般也具有该 

特性,因此,掌握各类的派生关系,往往是深刻理解其行为的一个捷 

径。同时,我们也应该看到,由于各类与其父类的差别,它们又具有 

各式各样的自身的特性,而把握这些特性,又成为进一步理解其独特 

特征的必由之路。下面,我们分类简单地讲解一下视类及各视类派生 

类。  



首先,我们看看处于这些派生类基类位置的CView类在整个系统类体 

系中的位置。  



                              



               图8。17 类CView的继承示意图  



由图8。17我们可以看出,类CWnd为类CView的直接基类。从这里,我 

们至少可以得到的一个最基本的概念就是,视类的对象具有窗口的一 

些基本特性。视类CView是一个用户定义视类的常用基类。一个视类 

与一个文档相连接,在文档与用户之间起了一个桥梁的作用。视类, 

文档,窗口之间的关系有对象CDocTemplate刻画。当用户新开一个窗 

口或将一个窗口进行分割时,程序框架就构造一个与其文档相联系的 

视类。一个视只能对应于一个文档,但一个文档可以拥有多个视,因 

此,就使一个文档,多个视图的程序可以轻易地实现。在本章的稍后 

几节中,读者会发现几个这方面的例程,读者可以看看它们的实现是 

多么的轻松。视的主要功能在于显示和修改文档的数据,但它对文档 


…………………………………………………………Page 494……………………………………………………………

数据的存储没有什么支持。  



一个视类可以直接地接受文档的数据,也可以通过成员函数的调用来 

实现。  



当一个类的数据发生变化时,该文档所关联的视类通常通过调用函数 

CDocument::UpdateAllViews来作出响应。这个函数是维护数据正确 

显示的常用手段。  



视类CView具有为数不多的成员函数。但这些成员函数中的很多个是 

有着重要的意义的。函数OnBeginPrinting初始化打印, 

OnEndPrinting结束一个打印任务,而OnEndPrintPreview则更是关于 

打印预览操作的一个重要函数,而函数OnPreparePrinting则负责了 

对打印以及打印预览的全面支持。  



另外,视类中的两个成员函数OnDraw (该函数在屏幕发生变化或因为 

焦点的变易需要重绘时调用,没有该函数,就不可能在程序的切换后 

保证屏幕的正确显示),OnUpdate则对维护程序的正确显示负有重要 

的责任。(当一个文档发生变化时,绝大多数情况下总是希望其各个 

视图中的数据能得到同步的正确显示的。)函数UpdateAllViews则是 

实现单文档多视图程序不可缺少的手段。(在一个文档的任一视发生 

变化时,通过该类实现各视图的正确显示。)  



接下来我们看看视类各派生类的继承及成员函数情况。但是,在这 

里,我们不再准备对各派生类作详细介绍。但是,我们会尽量简捷地 

告诉读者,怎样从系统的庞大帮助数据库中,查到自己所需要的信 

息。  



   (1) 类CEditView  



其继承关系如图8。18。注意,该类的直接基类不是CView类,而是类 

CCtrlView。  



                                  



               图8。18 类CEditView的继承图解  


…………………………………………………………Page 495……………………………………………………………

类CEditView主要被设计来支持类似编辑控件所要实现的功能,通过 

打印,查找/替换的支持。它们拥有自己的内存,可以在程序中被任 

意正确地使用。我们常见的文本操作,基本上都是由该类支持实现 

的。  



    (2) 类CRichEditView  



类CRichEditView的继承层次如图8。19。  



该类主要提供Rich文本操作的支持 (Rich文本是既可以为文本,也可 

以为图形的一种特殊格式文本。同时,在很多场合下,它们也充当热 

字的角色。)  



                                          



                 图8。19 类CRichEditView的继承图解  



    (3) 类CTreeView  



类CTreeView的继承层次如图8。20。  



                                          



                   图8。20 类CTreeView的继承图解  



该类主要提供一些树型控件所实现的功能的支持。它使一种数据的显 

示方式可以更富于变化。  



    (4) 类ListView  



类CListView的继承层次如图8。21。  


…………………………………………………………Page 496……………………………………………………………

                                      



                 图8。21 类CListView的继承图解  



该类与类CTreeView一样,更多的好处在于提供了一种简捷地实现数 

据的不同显示的途径。为数据的组织提供多种手段。  



   (5) 类CScrollView  



类CScrollView的继承层次如图8。22。  



                                    



                图8。22 类CScrollView的继承图解  



该类也是一个比较重要的类,但它主要提供视图的滚动显示。同时, 

需要注意的是,该类的直接基类是类CView,这决定了其动作特点的 

特殊性。具体细节请参考系统帮助。  



在本节的最后,我们简要地谈一下怎样在系统庞大的帮助文件中快速 

准确地找到自己所需要的主题。  



Visual  C++提供的帮助支持数据库不可谓不大,但往往在这个庞大的 

支持面前,我们多少感到一些无从下手。下面,我们结合程序设计时 

最可能碰到的一些关于类及函数的查询。  



如图8。23,我们以查询有关打印支持操作的类CPrintDialog的情况的 

查询。首先,工作区键入CPrintDialog然后按F1,系统搜索其数据库 

后给出了帮助信息。单击之即可进入具体的帮助主题了。  


…………………………………………………………Page 497……………………………………………………………

                                                             



                               图8。23 查询结果显示  



                       第六节  同一文档的多个视  



启动Visual  C++下的App  Wizard  可以生成多文档程序,这只需要在 

第一步中选择MDI应用程序类型即可。从生成的MDI程序中,我们可以 

发现MDI程序与SDI程序的一个最主要的区别就是主窗口是由基类 

CMDIFrameWnd而不象在SDI程序中由CFrameWnd派生出来的。  



class CMainFrame : public CMDIFrameWnd  



{  



DECLARE_DYNAMIC(CMainFrame)  



public:  



CMainFrame();  



// 。。。  



}  



在最初的文档模板中 (文档被打开时被激活)只支持主窗口。这可以 

由下面的一段初始化代码中看出(摘自CMDIApp。cpp)。  



BOOL CMdiApp::InitInstance()  



{  



AfxEnableControlContainer();  



// Standard initialization  



// If you are not using these features and wish to reduce the size  



// of your final executable; you should remove from the following  


…………………………………………………………Page 498……………………………………………………………

// 。。。  



CMultiDocTemplate* pDocTemplate;  



pDocTemplate = new CMultiDocTemplate(  



IDR_MDITYPE;  



RUNTIME_CLASS(CMdiDoc);  



RUNTIME_CLASS(CChildFrame); // custom MDI child frame  



RUNTIME_CLASS(CMdiView));  



AddDocTemplate(pDocTemplate);  



// 。。。  



return TRUE;  



}  



每次打开一个新文档时都调用CDocument的函数OnNewDocument。该函 

数被定义如下:  



class CMdiDoc : public CDocument  



{  



// 。。。  



// Overrides  



// ClassWizard generated virtual function overrides  



//{{AFX_VIRTUAL(CMdiDoc)  



public:  



virtual BOOL OnNewDocument();  



virtual void Serialize(CArchive& ar);  



//}}AFX_VIRTUAL  



// 。。。  



}  



当调用此函数时可以得到一个新的MDI子窗口,它由CDMIChildWnd派 

生出来。这些子窗口保存着各种已打开的文档,所有的细节都是由 


…………………………………………………………Page 499……………………………………………………………

MFC库处理。而每个MDI子窗口都支持由类CView派生出的普通类型的 

视窗。         这意味着可以同以前一样不受约束地使用WM_CHAR和 

WM_MOUSEMOVE这类消息。  



  l 注意:  



  l 如果读者对这一部分的理解不太清楚,建议再看看6。5视类一节 

   中有关视类层次结构的介绍。  



在8。4生成视一节中的最后,我们曾经提到过,可以用调用函数 

UpdateAllViews来维护所需要的众多视窗的同时协调工作。当任意一 

个视窗修改了文档之后就可调用该函数,这样可确保除了第一个调用 

该函数进行修改的视窗外所有视窗均调用函数OnUpdate。在前面的那 

个例子中,我们就如上所述的调用了该类。  



函数UpdateAllViews 的原型为:  



void UpdateAllViews( CView* pSender; LPARAM lHint = 0L; CObject* pHint = NULL );  



其中LONG型参数lHint通常所包含的信息与视窗对文档所做的修改有 

关;pHint总是指向一个对象,该对象有助于处理更新。为简单起 

见,只需将这些值赋为NULL。  



但另一方面,我们还需要将函数OnUpdate加到视窗类中,以处理由其 

它视窗引发的更新,因此需要处理函数CView::OnUpdate:  



virtual void OnUpdate( CView* pSender; LPARAM lHint; CObject* pHint );  



其中参数pSender为一指向修改了文档的指针 (当所有文档均需要更 

新时可以设置该参数为NULL),参数lHint内存放着有关这些修改的 

信息,函数最后一个参数pHint则为一存放该修改信息的内容的指 

针。  



这样,当任意一个视窗修改了文档时,它就调用pDoc

》UpdateAllViews,该函数又调用与该文档相关联的其它所有视窗中 

的OnUpdate来更新所有显示。由此,在系统中的所
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!