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

深入浅出MFC第2版(PDF格式)-第194章

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






                   另外还有一组macro,可以和前面那组搭配运用: 



                    宏名称                       意义 



                    class                      类别名称(小写) 



                    CLASS                    类别名称(大写) 



                    base_class                  基础类别的名称(小写) 



                    BASE_CLASS              基础类别的名称(大写) 



                    ifile                       实作档名称(。CPP 档,不含扩展名)(小写) 



782 


…………………………………………………………Page 845……………………………………………………………

                                                            15              AppWizard 

                                                          第 章 定製個 



        IFILE                实作档名称(。CPP 档,不含扩展名)(大写) 



        hfile                              头文件名称(。H 档,不含扩展名)(小写) 



        HFILE             头文件名称(。H 档,不含扩展名)(大写) 



        ROOT             应用程序的项目名称(全部大写) 



        root                 应用程序的项目名称(全部小写) 



        Root                 应用程序的项目名称(可以引大小写) 



              图15…3 列出项目名称为Scribble  的某些个标准宏内容。 



         宏                实际内容 



       APP_CLASS           CScribbleApp 



       VIEW_IFILE          SCRIBBLEVIEW 



       DOC_HFILE           SCRIBBLEDOC 



       doc_hfile           scribbledoc 



       view_hfile          scribbleview 



             图15…3 项 目名称为Scribble 的数个标准宏内容。 



Directives 



       所谓directives ,类似程序语言中的条件控制句(像是if、else 等等),用来控制text 



       templates  中的流程。字符串前面如果以 开头,就是一个directive,例如: 



             IF(PROJTYPE_MDI) 



             。。。 



             ELSE 



             。。。 



             ENDIF 



        每一个directive 必须出现在每一行的第一个字符。 



        系统提供了一组标准的directives 如下: 



                                                                                          783 


…………………………………………………………Page 846……………………………………………………………

                第篇    深入  MFC  程式設計 



                    IF 



                    ELIF 



                    ELSE 



                    ENDIF 



                    BEGINLOOP 



                    ENDLOOP 



                    SET_DEFAULT_LANG 



                    // 



                    INCLUDE 



         动手修改Top Studio AppWizard 



                我的目的是做出一个属于我个人研究室专用的Top Studio AppWizard ,以原本的MFC 



                AppWizard ((((exe ))))为基础,加上第7个步骤,让程序员填入姓名、简易 



                说明,然后TopSt  udio AppWizard 就能够把这些资料加到每一个源代码文件最前端。 



                看来我们已经找到出口了。我们应该先为Top Studio AppWizard 产生一个对话窗,当 



                做步骤7的画面,再产生一个对应的C++ 类别,于是DDX 功能便能够取得对话窗所接 



                收到的输入字符串(程序员姓名和程序主旨)。然后我们设计一些macros ,再撰写一小段 



                码(其中用到那些macros ),把这一小段码加到每一个。CPP 和。H 档的最前面。大功 



                告成。 



                本例不需要我们动手写directives 。 



                我想我遗漏了一个重要的东西。Macros 如何定义?放在什么地方?我曾经在本书第8章 



                介绍Scribble 的数据结构时,谈到collection classes 。其中有一种数据结构名为Map       (也 



                就是Dictionary )。Macros 正是被定义并储存在一个Map 之中,并以macro 名称做为 



                键值(key )。 



                让我们一步一步来。 



784 


…………………………………………………………Page 847……………………………………………………………

                                                  15           AppWizard 

                                               第 章 定製個 



 利用资源编辑器修改IDD_CUSTOM1 对话窗画面 



     请参考第4章和第10 章,修改IDD_CUSTOM1 对话窗画面如下: 



     两个edit 控制组件的ID 如图15…4 所示。 



利用ClassWizard 修改IDD_CUSTOM1 对话窗的对应类别CCustom1Dlg 



     图15…4 列出每一个控制组件的类型、识别码及其对应的变量名称等资料。变量将做为 



     DDX 所用。修改动作如图15…5。 



                                                                           785 


…………………………………………………………Page 848……………………………………………………………

                 第篇    深入  MFC  程式設計 



                 control ID               名称              种类        变量类型 



                 IDC_EDIT_AUTHOR         m_szAuthor       Value        CString 



                 IDC_EDIT_MENT        m_szment      Value        CString 



                       图15…4 IDD_CUSTOM1 对话窗控制组件的类型、ID、对应的变量名称 



                          图15…5 利用ClassWizard 为IDD_CUSTOM1 对话窗的两个edit 控制 

                                 组件加上两个对应的变量m_szAuthor 和m_szment, 以为 

                                 DDX 所用。 



                  Custom AppWizard 为我们做出来的这个CCustom1Dlg 必定衍生自CAppWizStepDlg。 



                  你不会在MFC 类别架构档中发现CAppWizStepDlg,它是Visual C++  的mfcapwz。dll 



                  所提供的一个类别。此类别有一个虚拟函数OnDismiss,当AppWizard  的使用者选按 



                   【Back 】或【Next 】或【Finish 】钮时就会被唤起。如果它传回TRUE,AppWizard 就可 



786 


…………………………………………………………Page 849……………………………………………………………

                                                             15              AppWizard 

                                                          第 章 定製個 



     以切换对话窗;如果传回的是FALSE ,就不能。我们可以在这个函数中做数值检验的工 



     作,更重要的是做macros  的设定工作。 



改写OnDismiss 虚拟函数,在其中定义macros 



      前面我已经说过,macros  的定义储存在一个Map 结构中。它在哪里? 



     整个Top Studio AppWizard    (以及其它所有的custom AppWizard )的主类别系衍生自系 



     统提供的CCustomAppWiz : 



     // in Top StudioAw。h 

     class CTopStudioAppWiz : public CCustomAppWiz 

     { 

         。。。。 

     }; 



     // in 〃Top StudioAw。cpp〃 

     CTopStudioAppWiz TopStudioaw;  //类似application object。 

                                         //对象命名规则是〃项目名称〃 + 〃aw〃。 



     你不会在MFC 类别架构档中发现CCustomAppWiz ,它是Visual C++  的mfcapwz。dll 



     所提供的一个类别。此类别拥有一个CMapStringToString 对象,名为m_Dictionary,所 



     以TopStudioaw  自然就继承了m_Dictionary。这便是储存macros 定义的地方。我们可 



     以利用TopStudioaw。m_Dictionary'xxx' = xxx  的方式来加入一个个的macros 。 



     现在,改写OnDismiss 虚拟函数如下: 



     #0001  // This is called whenever the user presses Next; Back; or Finish with this step 

     #0002  //  present。  Do all validation & data exchange from the dialog in this function。 

     #0003  BOOL CCustom1Dlg::OnDismiss() 

     #0004  { 

     #0005      if (!UpdateData(TRUE)) 

     #0006          return FALSE; 

     #0007 

     #0008      if( m_szAuthor。IsEmpty() == FALSE ) 

     #0009          TopStudioaw。m_Dictionary'〃PROJ_AUTHOR〃' = m_szAuthor; 

     #0010      else 



                                                                                            787 


…………………………………………………………Page 850……………………………………………………………

                   第篇    深入  MFC  程式設計 



                   #0011          TopStudioaw。m_Dictionary'〃PROJ_AUTHOR〃' = 〃〃; 

                   #0012 

                   #0013      if( m_szment。IsEmpty() == FALSE ) 

                   #0014          TopStudioaw。m_Dictionary'〃PROJ_MENT〃' = m_szment; 

                   #0015      else 

                   #0016          TopStudioaw。m_Dictionary'〃PROJ_MENT〃' = 〃〃; 

                   #0017 

                   #0018      CTime date = CTime::GetCurrentTime(); 

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