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

深入浅出MFC第2版(PDF格式)-第76部分

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


                        afx_msg void OnPaint();   // for WM_PAINT 

                        afx_msg void OnAbout();   // for WM_MAND  (IDM_ABOUT) 

                        void IdleTimeHandler(LONG lCount);  // we want it call by CMyWinApp::OnIdle 

                        。。。 

                      }; 



                    3。 在HELLO。CPP  中定义CMyWinApp::OnIdle 函数如下: 



404 


…………………………………………………………Page 467……………………………………………………………

                                                 第6章    MFC 程式的生死因果 



 BOOL CMyWinApp::OnIdle(LONG lCount) 

 { 

    CMyFrameWnd* pWnd = (CMyFrameWnd*)m_pMainWnd; 

    pWnd…》IdleTimeHandler(lCount); 



    return TRUE; 

 } 



4。 在HELLO。CPP  中定义CMyFrameWnd::IdleTimeHandler  函数如下: 



 void CMyFrameWnd::IdleTimeHandler(LONG lCount) 

 { 

   CString str; 

   CRect rect(10;10;200;30); 

   CDC* pDC = new CClientDC(this); 



   str。Format(〃%010d〃; lCount); 

   pDC…》DrawText(str; ▭ DT_LEFT | DT_TOP); 

 } 



为了输出lCount,我又动用了三个MFC 类别:CString、CRect 和CDC。前两者非常 



简单,只是字符串与四方形结构的一层C++ 包装而且,后者是在Windows 系统中绘图所 



必须的DC     (Device Context )的一个包装。 



新版Hello 执行结果如下。左上角的lCount  以飞快的速度更迭。移动鼠标看看,看 



lCount 会不会重置为0 。 



                                                                              405 


…………………………………………………………Page 468……………………………………………………………

                    第篇    湷觥 FC  程式設計 



              Dialog 与 Control 



                    回忆SDK 程序中的对话框作法:RC 文件中要准备一个对话框的Template,C 程序中要 



                   设计一个对话框函数。MFC 提供的CDialog 已经把对话框的窗口函数设计好了,因此 



                   在MFC 程序中使用对话框非常地简单: 



                                                                            WM_MAND 

                                                                            (IDM_ABOUT) 

                                                    HELLO。CPP 



                                                    void CMyFrameWnd::OnAbout() 

                                                    { 

                                                       CDialog about(〃AboutBox〃; this); 

                                                       about。DoModal(); 

                                                    } 



                                                                              HELLO。RC 



                     AboutBox DIALOG DISCARDABLE  34; 22; 147; 55 

                     STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU 

                     CAPTION 〃About Hello〃 

                     { 

                       ICON          〃JJHouRIcon〃;IDC_STATIC;11;17;18;20 

                       LTEXT         〃Hello MFC 4。0〃;IDC_STATIC;40;10;52;8 

                       LTEXT         〃Copyright 1996 Top Studio〃;IDC_STATIC;40;25;100;8 

                       LTEXT         〃J。J。Hou〃;IDC_STATIC;40;40;100;8 

                       DEFPUSHBUTTON 〃OK〃;IDOK;105;7;32;14;WS_GROUP 

                     } 



                    当使用者按下【File/About  】菜单, 根据Message Map 的设定,WM_MAND 



                     (IDM_ABOUT )被送到OnAbout 函数去。我们首先在OnAbout 中产生一个CDialog 物 



                   件,名为about 。CDialog 构造式容许两个参数,第一个参数是对话框的模板资源,第二 



                   个参数是about 对象的主人。由于我们的〃About〃 对话框是如此地简单,不需要改写 



                    CDialog 中的对话框函数,所以接下来直接调用CDialog::DoModal ,对话框就开始运作 



                    了。 



406 


…………………………………………………………Page 469……………………………………………………………

                                                                         第6章    MFC 程式的生死因果 



通用对话框(mon Dialogs) 



       有些对话框,例如【File Open 】或【Save As】对话框,出现在每一个程序中的频率是如 



       此之高,使微软公司不得不面对此一事实。于是,自从Windows 3。1 之后,Windows API 



        多了一组通用对话框( mon Dialogs  ) API  函数, 系统也多了一个对应的 



       MDLG。DLL          (32 位版则为DLG32。DLL )。 



        MFC 也支持通用对话框,下面是其类别与其类型: 



        类别                                     类型 



        CmonDialog                                          以下各类别的父类别 



        CFileDialog                                                 File 对话框(Open 或Save As ) 



        CPrintDialog                                               Print 对话框 



        CFindReplaceDialog                                    Find and Replace 对话框 



        CColorDialog                                               Color  对话框 



        CFontDialog                                                Font 对话框 



        CPageSetupDialog                                       Page Setup 对话框(MFC 4。0 新增) 



        COleDialog                                                    Ole 相关对话框 



                                CObject 

                                 CObject 



                                    CCmdTarget 

                                     CCmdTarget 



                                        CWnd 

                                         CWnd 



                                             CDialog 

                                              CDialog 



                                                 CmonDialog 

                                                  CmonDialog 



                                                     CColorDialog 

                                                      CColorDialog 

                                                     CFileDialog 

                                                     CFindReplaceDialog 

                                                      CFindReplaceDialog 

                                                     CFontDialog 

                                                      CFontDialog 

                                                     COleDialog 

                                                      COleDialog 

                                                     CPageSetupDialog 

                                                      CPageSetupDialog 

                                                     CPrintDialog 

                                                      CPrintDialog 



                                                                                                              407 


…………………………………………………………Page 470……………………………………………………………

               第篇    湷觥 FC  程式設計 



               在C/SDK 程序中, 使用通用对话框的方式是, 首先填充一块特定的结构如 



               OPENFILENAME,然后调用API  函数如GetOpenFileName。当函数回返,结构中的某 



               些字段便持有了使用者输入的值。 



               MFC 通用对话框类别,使用之简易性亦不输Windows API 。下面这段码可以激活【Open 】 



               对话框并最后获得文件完整路径: 



                 char szFileters'' = 〃Text fiels (*。txt)|*。txt|All files (*。*)|*。*||〃 



                 CFileDialog opendlg (TRUE; 〃txt〃; 〃*。txt〃; 



                                    OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; szFilters; this); 



                 if (opendlg。DoModal() == IDOK) { 



                         filename = opendlg。GetPathName(); 



                 } 



               opendlg 构造式的第一个参数被指定为TRUE,表示我们要的是一个【Open 】对话框而 



               不是【Save As】对话框。第二参数〃txt〃 指定预设扩展名;如果使用者输入的文件没有 



               扩展名,就自动加上此一扩展名。第三个参数〃*。txt〃 出现在一开始的【file name】字段 



               中。OFN_ 参数指定文件的属性。第五个参数szFilters 指定使用者可以选择的文件型 



               态,最后一个参数是父窗口。 



               当DoModal  回返,我们可以利用CFileDialog 的成员函数GetPathName 取得完整的档 



               案路径。也可以使用另一个成员函数GetFileName 取其不含路径的文件名称,或 



               GetFileTitle 取得既不含路径亦不含扩展名的文件名称。 



               这便是MFC 通用对话框类别的使用。你几乎不必再从其中衍生出子类别,直接用就好 



               了。 



408 


…………………………………………………………Page 471……………………………………………………………

                                           第6章    MFC 程式的生死因果 



本章回顾 



   乍看MFC 应用程序代码,实在很难推想程序的进行。一开始是一个衍生自CWinApp 的全 



   域对象application object ,然后是一个隐藏的WinMain 函数,调用application object 的 



   InitInstance  函数,将程序初始化。初始化动作包括构造一个窗口对象(CFrameWnd 物 



   件),而其构造式又调用CFrameWnd::Create 产生真正的窗口(并在产生之前要求MFC 



   注册窗口类别)。窗口产生后WinMain 又调用Run 激活消息循环,将WM_MAND 



    (IDM_ABOUT )和WM_PAINT 分别交给成员函数OnAbout 和OnPaint 处理。 



    虽然刨根究底不易,但是我们都同意,MFC 应用程序代码的确比SDK 应用程序代码精简许 



    多。事实上,MFC 并不打算让应用程序代码比较容易理解,毕竟raw Windows API 才是 



   最直接了当的动作。许许多多细碎动作被包装在MFC 类别之中,降低了你写程序的负 



   担,当然,这必须建立在一个事实之上:你永远可以改变MFC  的预设行为。这一点是 



   无庸置疑的,因为所有你可能需要改变的性质,都被设计为MFC 类别中的虚拟函数了, 



   你可以从MFC 衍生出自己的类别,并改写那些虚拟函数。 



   MFC  的好处在更精巧更复杂的应用程序中显露无遗。至于复杂如OLE 者,那就更是非 



   MFC 不为功了。本章的Hello 程序还欠缺许多Windows 程序完整功能,但它毕竟是一 



   个好起点,有点晦涩但不太难。下一章范例将运用MDI 、Document/View 、各式各样的UI 



   对象。。。。 



                                                                 409 


…………………………………………………………Page 472……………………………………………………………

                第篇    湷觥 FC  程式設計 



410 


…………………………………………………………Page 473……………………………………………………………

                                   第7章    簡單而完整:MFC 骨幹程式 



   第7章 



         简单而完整:MFC 骨干程序 



                    当技术愈来愈复杂, 



                     入门愈来愈困难, 



                   我们的困惑愈来愈深, 



                      犹豫愈来愈多。 



   上一章的Hello 范例,对于MFC 程序设计导入很适合。但它只发挥了MFC  的一小部 



   份特性,只用了三个MFC 类别(CWinApp、CFrameWnd 和CDialog)。这一章我们要 



   看一个完整的MFC 应用程序骨干(注),其中包括丰富的UI 对象(如工具栏、状态 



   列)的生成,以及很重要的Document/View 架构观念。 



   注:我所谓的MFC 应用程序骨干,指的是由AppWizard 产生出来的MFC 程序,也 



   就是像第4章所产生的Scribble step0 那样的程序。 



不二法门:熟记MFC 类别阶层架构 



    我还是要重复这一句话:MFC 程序设计的第一要务是熟记各类别的阶层架构,并清楚了 



    解其中几个一定会用到的类别。一个MFC 骨干程序(不含ODBC 或OLE 支持)运用到 



    的类别如图7…1 所示,请与图6…1 做个比较。 
返回目录 上一页 下一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!