深入浅出MFC笔记(6)

本文深入探讨了MFC AppWizard的定制过程,讲解了如何创建自定义的AppWizard,包括AWX文件的使用、定制对话框及资源,以及如何将这些自定义内容整合到开发环境中。同时,文章提到了组件和ActiveX Controls在程序设计中的应用,展示了组件在不同开发工具如Visual Basic、Delphi和C++ Builder中的角色。
摘要由CSDN通过智能技术生成

(未完待续。。。)



第15章 定制一个 AppWizard 产生新的「程序代码产生器」

注:

①DUMPBIN.EXE工具的位置:

VC++5.0的\DevStudio\SharedIDE\BIN\IDE\对应VC++6.0的MVS\VC98\Bin\ 

②下面的目录提供用户定义的AWX文件存放位置:

VC++5.0的\DevStudio\SharedIDE\Template对应VC++6.0的MVS\Common\MSDev98\Template

③Visual C++  系统中早已存在有一些.AWX档了

VC++5.0系统的.AWX可能是在\DevStudio\SharedIDE\BIN\IDE\中,找到5个AWX文件

VC++6.0系统的.AWX可能是在\Common\MSDev98\Bin\IDE中,找到13个AWX文件和24个HLP文件

1.MFC AppWizard以「程序代码产生器」的身份,自动做出「骨干程序」。(内建的程序类型)

  用于定制AppWizard。(任何自定程序类型)

2.Wizard的本质:AWX文件,Application Wizard eXtension (32位的MFC extension DLL)

  

  Developer's Studio提供了一个开放的AppWizard接口(一组类别和一些组件),产生AWX文件

  必须被放置于中\DevStudio\SharedIDE\Template被VC++的"project manager"会检查,

  并将"template"显示其图标于【New Project】对话窗中,供使用者选择。

Wizard 本身是一个所谓的「template  直译器」。这里所谓的"template"  是一些文字文件,内有许多特殊符号(也就是本章稍后要介绍的macros 和directives )。Wizard 读取这些template ,对于正常文字,就以正常的output stream  输出到另一个文件中;对于特殊符号或保留字,就解析它们然后再把结果以一般的output stream  输出到文件中。Wizard 所显示给使用者看的「步骤对话窗」可以接受使用者的指定项目或文字输出,于是会影响template  中的特殊符号的内容或解析,连带也就影响了Wizard 的stream  输出。这些stream  输出,最后就成为你的项目的源文件。

3.「订制型AppWizard」的产生:

Custom AppWizard | Standard MFC AppWizard steps(1) | MFC Exe

根据MFC AppWizard为它加上额外的几个步骤,成为一个「订制型AppWizard」。

其他方式:

 An existing project:根据一个原已存在的项目档(*.dsp)来产生一个「订制型AppWizard」

 Your own custom steps:有全新的步骤和全新的对话窗画面。最大弹性最困难的一种作法

生成的文件自动复制到\DevStudio\SharedIDE\Template中一份

整合环境的【File/New 】,在【Projects】对话窗中新的「订制型AppWizard 」出现了:


5.关于Custom Dialog ClassesCustom Dialog ResourcesDialog templates

由于多出一个对话窗画面,必需要产生一个对话框模板(template),还要为这模板产生一个对应的C++类别,并以DDX/DDV取得使用者的输入资料放置到程序代码产生器所产生的项目源代码中。

程序代码产生器会读取.AWX 档,做出适当的源代码来。

6.有许多所谓的macros directives 存在于"text template"

macro 是用来代表一个常数。前后以$$ 包夹起来的字符串即为一个macro 名称。

directives是用来控制text templates 中的流程。字符串前面如果以$$ 开头即为一个directive

$$IF $$ELIF  $$ELSE  $$ENDIF

$$BEGINLOOP $$ENDLOOP

$$SET_DEFAULT_LANG $$// $$INCLUDE

7.以原本的MFC AppWizardexe)为基础,加上第7个步骤,让程序员填入姓名、简易说明,然后利用「订制型AppWizard 」就能够把这些资料加到每一个源代码文件最前端。

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

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

控制组件的类型、ID、对应的变量名称:

IDC_EDIT_AUTHOR m_szAuthor Value CString

IDC_EDIT_COMMENT m_szComment Value CString

CCustom1Dlg衍生自CAppWizStepDlg,它是Visual C++mfcapwz.dll所提供的一个类别。此类别有一个虚拟函数OnDismiss,当AppWizard 的使用者选按【Back】或【Next 】或【Finish】钮时就会被唤起。如果它传回TRUE。在这个函数中做数值检验的工作,更重要的是做macros 的设定工作。

CXxxxAppWiz衍生自CCustomAppWiz,它是Visual C++mfcapwz.dll所提供的一个类别。此类别拥有一个CMapStringToString对象,利用Xxxxaw.m_Dictionary[xxx] = xxx方式来加入一个个的macros

在类的源文件中:CXxxxAppWiz   Xxxxaw;//定义全局对象

④改写CCustom1Dlg::OnDismiss()

   if (!UpdateData(TRUE))

       return FALSE;

   if( m_szAuthor.IsEmpty() == FALSE )

       Xxxxaw.m_Dictionary["PROJ_AUTHOR"] = m_szAuthor;//PROJ_AUTHOR  m_szAuthor

   else

        Xxxxaw.m_Dictionary["PROJ_AUTHOR"] = "";

     if( m_szComment.IsEmpty() == FALSE )

      Xxxxaw.m_Dictionary["PROJ_COMMENT"] = m_szComment;//PROJ_COMMENT  m_szComment

     else

         Xxxxaw.m_Dictionary["PROJ_COMMENT"] = "";

     CTime date = CTime::GetCurrentTime();

     CString szDate = date.Format( "%A, %B %d, %Y" );

     Xxxxaw.m_Dictionary["PROJ_DATE"] = szDate;//PROJ_DATE  szDate

     return TRUE;  // return FALSE if the dialog shouldn't be dismissed

⑤修改text template:在template子目录中的每一个.H 档和.CPP  档增加一小段码,放在文件最前端:

/*This project was created using the Xxxx AppWizard

  $$PROJ_COMMENT$$

  Project: $$Root$$   Author : $$PROJ_AUTHOR$$   Date   : $$PROJ_DATE$$ */





第16章 站上众人的肩膀- 使用Components和ActiveX Controls

//

从Visual Basic 开始,可以说一个以components (软件组件)为中心的程序设计时代,逐渐拉开了序幕。随后Delphi 和C++ Builder 陆续登场

Microsoft 的Visual Basic(使用Basic语言),使用VBX(VisualBasic eXtension)组件。

Borland的Delphi(使用Pascal语言),使用VCL (Visual Component Library )组件

Borland的C++ Builder(使用 C++语言),使用VCL (Visual Component Library )组件

都称得上是一种快速开发工具(RAD,Rapid Application Development)。它们所使用的组件都是PME(Properties-Method-Event)架构。这使得它们的整合环境(IDE)能够做出非常可视化的开发工具,以拖放、填单的方式完成绝大部份的程序设计工作。

1. 选择一些适当的软件组件(VBX 或VCL )。

2. 打开一个form ,把那些软件组件拖放到form 中适当的位置。

3. 在Properties 清单中填写属性。例如精确位置、宽度高度、让A组件的某个属性连接到B组件等等。

4. 撰写程序代码(method),做为某种event 发生时的处理例程。

Visual C++  则使用OCX(OLE Control eXtension)组件。还不能够算是RAD。

如今OCX 又演化到所谓ActiveX 组件(其实和OCX 大同小异,OCX 就是ActiveX Control!由于微软把它所有的Internet  技术都称为ActiveX,所以OLE Controls  就变成了ActiveX Controls)。

Component Gallery 是自从Visual C++ 4.0 之后,整合环境中新增的一个东西。实际只是存放那些组件的位置资料而已。(其中的两个文件夹内容的区别)

Components 是具有重复使用性的C++类别,是该组件的源代码。

 只是多做了必要的包装,连同其它资源放在一起成为一个包裹。

ActiveX controls 是由Component Gallery 填入一些码,但它们不是组件的本体。那些码只是使用组件时所必须的码,组件本身在.OCX文件中(通常注册后的OCX 文件都放在Windows\System 磁盘子目录)。

1. 建立新项目时,在AppWizard 的步骤3中选择【ActiveX Controls】。这会使程序代码多出一行:

BOOL COcxTestApp::InitInstance(){

AfxEnableControlContainer();

...}

2. 进入Component Gallery ,把ActiveX Controls 安插到你的程序中。

3. 使用ActiveX Controls。通常我们在对话窗中使用它。我们可以把资源编辑器的工具箱里头的ActiveX Controls 拖放到目标对话窗中。

4. 利用ClassWizard 产生对话窗类别,并处理相关的Message Maps、消息处理例程、变量定义、对话框函数等。

5. 编译联结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值