按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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 %