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

VC语言6.0程序设计从入门到精通-第13章

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




计方面也有如下的区别。  

    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……………………………………………………………

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