友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
C语言实例教程(PDF格式)-第15部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
程序界面看起来象那些在Windows的早期
版本 (如Windows 3。x)下运行的程序的外
观。默认情况下,使用AppWizard创建的
应用程序都具有三维外观。
Automation: 决定应用程序是否可以操作由其它程序
实现的对象,也就是说是否可以将程序
作为自动化客户 (Automation client)。
图4。 3 使用AppWizard创建基于对话框的应用程序:第二步
图4。 4 应用程序中的 “关于”对话框
ActiveX 决定你的应用程序是否使用ActiveX控件。
…………………………………………………………Page 165……………………………………………………………
controls: 如果在创建应用程序框架时没有选择该选
项,则必须在InitInstance成员函数中添
加对AfxEnableControlContainer的调用来
向工程中插入ActiveX控件。在默认情况
下,使用AppWizard创建的应用程序可以使
用ActiveX控件。
Windows 该选项决定应用程序是否支持Windows套接
sockets: 字。Windows套接字允许应用程序之间通过
基于TCP/IP的网络进行通信。
在图4。3所示对话框的最下部可以输入对话框所用的标题。在默认情
况下AppWizard将工程名作为对话框的标题。
设置完成后单击Next继续。
5。 在如图4。5所示的对话框中决定是否让AppWizard为所创建的源文
件添加上注释和使用哪一种链接方式。可以使用两种方式链接到
MFC,一种方式是使用动态链接库DLL,即选择As a shared DLL;第
二种方式是像过去所常用的方式那样,使用MFC的静态链接,即选择
As a statically linked library。两种方式各有优缺点,使用DLL
可以有效的应用程序执行文件的大小,但在运行时必须保证应用程序
能够找到所需的动态链接库。使用静态链接的应用程序不需要额外的
动态链接库的支持,而且可以在性能上获得少许的提高,但是,使用
静态链接的应用程序的可执行文件可能会大上很多倍。
图4。 5 使用AppWizard创建基于对话框的应用程序:第三步
…………………………………………………………Page 166……………………………………………………………
6。 在图4。6所示的对话框中更改AppWizard创建的类的类名、基类及
实现该类的头文件和实现文件。要注意的是,并不是所有的类的所有
项都可以更改,如果某一项所对应的文本框中的内容的显示变为灰
色,则表示该项内容不可以修改。如图4。6所示的对话框,我们不可
能更改类CDialogDemoApp的基类、头文件和实现文件,但是我们却可
以更改它的类名。修改完成之后,单击Finish。这时,AppWizard弹
出如图4。7所示的对话框,该对话框给出了对你在前几步中所做的设
置的总结,如果一切正确无误的话,单击OK接受,这里AppWizard根
据你的设定定制应用程序的各个代码文件和资源文件,这些文件将在
本章的后面部分中进行讲述。反之,如果在前面的某一步中的设置有
误,则可以单击Cancel,然后重新运行AppWizard。
图4。 6 使用AppWizard创建基于对话框的应用程序:第四步
…………………………………………………………Page 167……………………………………………………………
图4。 7
l 注意:
l 在单击了Finish按钮之前,你可以使用Back按钮和Next按钮在
AppWizard的各个步骤之间进行切换,并更改不合适的设置,但
是,一旦单击了Finish之后,除了直接手动的修改源文件或是推
翻重来以外,一切行为都是不可逆的。因此,在使用AppWizard之
后还需添加某些特性往往需要很多额外的工作,因此,如果是编
写新的应用程序的话,我们建议在创建应用程序之前先进行完整
的构思,以便于在使用AppWizard时充分发挥其作用,争取让它完
成更多的工作,以减轻编写Windows应用程序的复杂程度。
第二节 应用程序类
在创建应用程序框架时,AppWizard同时生成了一个说明文件
ReadMe。txt。该说明文件是英文的,为了便于读者阅读,我们在下面
给出的工程DialogDemo的说明文件ReadMe。txt已被翻译为中文。基于
同样的考虑,在本书中给出示例程序时,对于所有的程序注释,我们
一律使用中文;对于由AppWizard等生成的程序注释,也一律翻译为
中文。注意对于不同的工程,其说明文件的内容也是不同的,但它们
都具有大致相同的结构。
工程DialogDemo的说明文件ReadMe。txt:
========================================================================
MICROSOFT FOUNDATION CLASS LIBRARY : DialogDemo
========================================================================
AppWizard 已为您创建了应用程序 DialogDemo。 该应用程序不仅演示了 Microsoft
Foundation Class 的基本使用,而且还可以作为您编写应用程序的起点。
本文件包括了对构成应用程序 DialogDemo 的每一个文件的总结。
DialogDemo。h
该文件是应用程序的主要头文件。它包括了其它工程特定的头文件 (包括 Resource。h)
和声明 CDialogDemoApp 应用程序类。
…………………………………………………………Page 168……………………………………………………………
DialogDemo。cpp
该文件是工程的主要应用程序源文件,它包括了应用程序类 CDialogDemoApp 的实现。
DialogDemo。rc
该文件是程序所使用的所有 Microsoft Windows 资源的列表。它包括保存在目录 RES
下的图标、位图和光标。该文件可以在 Microsoft Developer Studio 中直接编辑。
resDialogDemo。ico
应用程序图标所使用的图标文件。该图标被包括在文件 DialogDemo。rc 中。
resDialogDemo。rc2
该文件包括的资源不被 Microsoft Developer Studio 编辑。你可以将不可以被资源
编辑器编辑的资源放入此文件。
DialogDemo。clw
ClassWizard 使用该文件所包括的消息来编辑已有的类或添加新类。ClassWizard 还
使用该文件来保存在创建和编辑消息映射和对话框数据映射以及创建成员函数原型时
所需的信息。
/////////////////////////////////////////////////////////////////////////////
AppWizard 创建了一个对话框类:
DialogDemoDlg。h; DialogDemoDlg。cpp 对话框
这些文件包括了类 CDialogDemoDlg。该类定义了应用程序主对话框的行为。对话框
的模板包括在 DialogDemo。rc 中,可以使用 Microsoft Developer Studio 来编辑
该文件。
/////////////////////////////////////////////////////////////////////////////
其它标准文件:
StdAfx。h; StdAfx。cpp
这些文件用于创建预编译头文件 (PCH),该文件名为 DialogDemo。pch,预编译类型
…………………………………………………………Page 169……………………………………………………………
文件名为 StdAfx。obj。
Resource。h
定义新资源 ID 的标准头文件。Microsoft Developer Studio 读取和更新该文件。
/////////////////////////////////////////////////////////////////////////////
其它注意事项:
AppWizard 使用 〃TODO:〃 来指出需要添加或定制源代码的地方。
如果你的应用程序使用了 MFC 的共享动态链接库,并且你的应用程序使用了与操作系统
当前语言不同的语言,那么你需要将相应的本地化资源文件 MFC40xxx。DLL 从 Microsoft
Visual C++ CD…ROM 上复制到 system 或 system32 目录下,并将其改名为 MFCLOC。DLL。
(〃xxx〃代表指定语言的缩写,如 MFC40DEU。DLL 包括了已被翻译为德文的资源。)如果你
没有进行这个步骤,应用程序的一些用户界面元素仍将保持为操作系统的语言。
/////////////////////////////////////////////////////////////////////////////
下面我们从头文件StdAfx。h入手,来分析该应用程序。头文件
StdAfx。h的列表清单如下:
// stdafx。h : 本包含文件包含了标准系统包含文件,以及经常使用的工程特定的包含
// 文件,在很多情况下,我们并不需要修改这些文件。
//
#if !defined(AFX_STDAFX_H__7ABABF8C_0C8C_11D2_BC21_0000B4810A31__INCLUDED_)
#define AFX_STDAFX_H__7ABABF8C_0C8C_11D2_BC21_0000B4810A31__INCLUDED_
#if _MSC_VER 》= 1000
#pragma once
#endif // _MSC_VER 》= 1000
#define VC_EXTRALEAN // 从 Windows 头文件中排除很少用到的那一部分
#include // MFC 核心和标准部件
#include // MFC 扩展
#include // MFC OLE 自动化类
…………………………………………………………Page 170……………………………………………………………
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include // MFC 对 Windows 公用控件的支持
#endif // _AFX_NO_AFXCMN_SUPPORT
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio 将在上一行之前最接近的地方添加附加的声明
#endif // !defined(AFX_STDAFX_H__7ABABF8C_0C8C_11D2_BC21_0000B4810A31__INCLUDED_)
与头文件相对应的实现文件为StdAfx。cpp文件,该文件只有一行代码,如下面的清单所示:
// stdafx。cpp : 包含标准包含文件的源文件
// DialogDemo。pch 为预编译头文件
// stdafx。obj 中包含了预编译类型信息
#include 〃stdafx。h〃
StdAfx。h文件是Visual C++工程的预编译头文件,将一些常用的并且
很少需要修改的头文件放入StdAfx。h中可以有效的提高Visual C++的
编译速度。
在StdAfx。h头文件中定义的标识符VC_EXTRALEAN将从Windows包含文
件中排除了一些不常用的头文件,从而提高应用程序的编译速度,但
是,如果应用程序中需要使用在被排除的这些头文件中声明的函数,
必须额外的添加这些对这些头文件的包含,否则将会导致编译出错。
对其它包含头文件的说明请参见StdAfx。h头文件清单中的注释。
在头文件Resource。h中包含了对程序和资源中所用到的常量的定义,
其清单如下:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成包含文件。
// 由 DIALOGDEMO。RC 使用
//
#define IDR_MAINFRAME 128
#define IDM_ABOUTBOX 0x0010
…………………………………………………………Page 171……………………………………………………………
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDD_DIALOGDEMO_DIALOG 102
// 新对象的下一个默认值
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 129
#define _APS_NEXT_MAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
下面我们再来分析一下头文件DialogDemo。h:
// DialogDemo。h : 应用程序 DIALOGDEMO 的主要头文件
//
#if !defined(AFX_DIALOGDEMO_H__7ABABF88_0C8C_11D2_BC21_0000B4810A31__INCLUDED_)
#define AFX_DIALOGDEMO_H__7ABABF88_0C8C_11D2_BC21_0000B4810A31__INCLUDED_
#if _MSC_VER 》= 1000
#pragma once
#endif // _MSC_VER 》= 1000
#ifndef __AFXWIN_H__
#error include 'stdafx。h' before including this file for PCH
#endif
#include 〃resource。h〃 // 主要符号
/////////////////////////////////////////////////////////////////////////////
…………………………………………………………Page 172……………………………………………………………
// CDialogDemoApp:
// 在 DialogDemo。cpp 中包括了该类的实现
//
class CDialogDemoApp : public CWinApp
{
public:
CDialogDemoApp();
// 重载
// ClassWizard 生成的虚函数重载
//{{AFX_VIRTUAL(CDialogDemoApp)
public:
virtual BOOL InitInstance();
//}}AFX_VIRTUAL
// 实现
//{{AFX_MSG(CDialogDemoApp)
// 注意 ClassWizard 将在这里添加或删除成员函数
// 不要编辑你在这里所看到的这些生成代码块 !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio 将在紧接着上一行之前的地方插入附加的声明。
#endif // !defined
(AFX_DIALOGDEMO_H__7ABABF88_0C8C_11D2_BC21_0000B4810A31__INCLUDED_)
在头文件DialogDemo。h中定义了应用程序类CDialogDemoApp。在MFC
…………………………………………………………Page 173……………………………………………………………
中,应用程序类封装了一个Windows应用程序的初始化、运行和终
止。每一个MFC应用程序都必须包括一个从CWinApp派生的应用程序
类,在应用程序DialogDemo中,这个类就是CDialogDemoApp。这个对
象在窗口被创建之前进行构造。类CWinApp从类CWinThread派生,它
代表了应用程序的主执行线程,正如我们在前面的章节中所讲述的那
样,一个应用程序可以有多个执行线程。在MFC的最近看到版本中,
已为类CWinThread的成员函数InitInstance、Run、ExitInstance和
OnIdle提供了默认的实现。由于我们在讨论CWinApp时更侧重于它作
为应用程序对象所扮演的角色,而不是作为主线程,因此,我们在讨
论前面提到的四个成员函数的时候,可以把它们想象为在类CWinApp
定义的成员函数,即立足于应用程序对象的角度来看待和分析它们的
行为,而不是立足于一个单独的线程的角度。
应用程序类构成了应用程序的主执行线程。使用Win32 API函数可以
创建新的执行线程。这些线程仍可以使用MFC库,详细的信息请参考
本书关于进程和线程的有关章节。
同其它的任何Windows应用一样,框架应用程序仍然具有一个WinMain
函数。但是,在由AppWizard生成的应用程序框架中,我们却找不到
对WinMain函数的声明或定义。在MFC应用程序中,WinMain函数是由
类库提供的,它在应用程序启动时被调用。WinMain函数执行如注册
窗口类之类的标准服务。接着,它调用应用程序对象的成员函数来初
始化并且运行应用程序。通过重载WinMain函数所调用的类CWinApp的
成员函数可以自定义WinMain函数。
WinMain函数通过调用应用程序对象的InitApplication和
InitInstance成员函数来初始化应用程序,通过调用Run成员函数运
行应用程序的消息循环,最后在程序结束时调用程序程序的
ExitInstance成员函数。其中Run函数一般由MFC提供,而
InitApplication、InitInstance和ExitInstance一般需要程序员创
建或进行重载。
l 注意:
l 由于在Win32环境下,每一个应用程序的实例都是独立的,它们有
着 自己的虚拟地址空间,因此,在目前版本的MFC中,成员函数
CWinApp::InitApplication已被废弃,原来在InitApplication中
进行的初始化操作应该移到InitInstance中进行。
由AppWizard生成的基于对话框的框架应用程序提供了对
InitInstance的默认重载,也正是在该成员函数中提供了基于对话框
…………………………………………………………Page 174……………………………………………………………
的应用程序的特点。在MFC中,无论是基于对话框的应用程序,还是
基于文档/视结构的应用程序,它们的应用程序对象都是从CWinApp派
生而来的,它们之间的功能的巨大差异,往往就是通过对类CWinApp
的成员函数进行不同的重载来体现的。
在每一个同一应用程序的实例被启动时,WinMain函数调用一次
InitInstance成员函数。原有的InitApplication不再有意义,每一
个应用程序的实例都被认为是独立的,对应用程序的初始化同对实例
的初始化没有本质区别。对于InitInstance成员函数,我们这时只需
知道它在当应用程序进行初始化的时候由WinMain函数调用。关于基
于对话框的应用程序的InitInstance成员函数的典型实现,我们将在
本章后面的内容中专门讲述。
类CDialogDemoApp的实现包含在文件DialogDemo。cpp中,其清单如
下:
// DialogDemo。cpp : 为应用程序定义类的行为
//
#include 〃stdafx。h〃
#include 〃DialogDemo。h〃
#include 〃DialogDemoDlg。h〃
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE'' = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDialogDemoApp
BEGIN_MESSAGE_MAP(CDialogDemoApp; CWinApp)
//{{AFX_MSG_MAP(CDialogDemoApp)
// 注意 ClassWizard 将在此添加或删除映射宏。
// 不要删除你在这里看到的这些生成代码块 !
…………………………………………………………Page 175……………………………………………………………
//}}AFX_MSG
ON_MAND(ID_HELP; CWinApp::OnHelp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDialogDemoApp 构造
CDialogDemoApp::CDialogDemoApp()
{
// TODO: 在这里添加构造代码,
// 将所有重要的初始化放入 InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// 唯一的 CDialogDemoApp 对象
CDialogDemoApp
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!