友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
C语言实例教程(PDF格式)-第10部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
#define AFX_CREATURE_H__90147538_FA97_11D1_BBF0_0000B4810A31__INCLUDED_
#if _MSC_VER 》= 1000
#pragma once
#endif // _MSC_VER 》= 1000
…………………………………………………………Page 111……………………………………………………………
class Creature
{
public:
Creature();
virtual ~Creature();
};
#endif // !defined
(AFX_CREATURE_H__90147538_FA97_11D1_BBF0_0000B4810A31__INCLUDED_)
creature。cpp:
// creature。cpp: implementation of the Creature class。
//
//////////////////////////////////////////////////////////////////////
#include 〃〃
#include 〃creature。h〃
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Creature::Creature()
{
}
Creature::~Creature()
{
}
这里,我们需要删掉creature。cpp文件中的
#include 〃〃
一行。
…………………………………………………………Page 112……………………………………………………………
在上面的过程中,还 自动生成的类Creature的构造函数和析
构函数的框架,并且,其析构函数还被声明为虚函数。
下面的步骤添加类Creature的成员函数KindOf:
1。 在ClassView中右击类Creature,选择Add Member
Function,弹出如图所示的对话框。
图2。9 添加成员函数
2。 在Function Type处输入char *。然后在对话框下方选择
Virtual复选框,这导致Static复选框不可用,因为同一个成
员函数不可能既是虚函数,又是静态函数,这时,在
Function Declaration处自动添加上了virtual关键字。确认
在Access处选择了Public,然后,在Function Declaration
处输入函数名KindOf,单击OK完成。
双击ClassView中的KindOf,Microsoft Developer Studio将
打开文件creature。cpp,将将插入点定位到函数KindOf的定
义处。在此添加下面的代码:
char* Creature::KindOf()
{
return 〃Creature〃;
}
下面以类似的方式生成类Animal,使其基类为Creature,继
承方式为public。并将其头文件改为animal。h,实现文件改
为animal。cpp。同样,在animal。cpp中删除
#include 〃〃
一行。
…………………………………………………………Page 113……………………………………………………………
对于MFC应用程序,还可以使用ClassView来重载基类中的虚
函数,这将在本书后面的章节中讲述。而对于非MFC应用程
序,我们仍可以使用上面的添加成员函数的方法来重载基类
中的虚函数,只不过这时必须手动的给出虚函数的返回类型
和参数列表。
使用上面的方法来生成为Animal的重载虚函数KindOf,其代
码已在上一节中给出。
然后再新添加一个C++ Source File——main。cpp,并在其中
定义程序的主函数main()。
由于我们 目前还没有接确到MFC编程,因此,现在还不能讲解
ClassView的某此用法。在本书后面的章节中,我们将会在用
到这些功能的时候讲解它们。
2。5。2 使用WizardBar
WizardBar是Microsoft Developer Studio中的一个工具条,
如图2。10所示。它提供了对ClassView和ClassWizard (关于
ClassWizard的使用将在后面的章节中讲述)中的命令的快速
访问。
图2。10 WizardBar
WizardBar工具条中的显示的内容是与当前上下文相关联的,
也就是说,随着当前上下文的改变,WizardBar的显示也会改
变。图2。10是在ClassView中双击类Animal的构造函数之后的
WizardBar。
可以使用WizardBar来完成下面的这些操作:
n 跳转到函数的定义 (实现)处
n 跳转到函数的声明处
n 跳转到类的定义处
n 添加窗口消息处理函数
n 添加虚函数
…………………………………………………………Page 114……………………………………………………………
n 添加成员函数
n 添加新类
n 跳转到文件中的下一个函数
n 跳转到文件中的前一个函数
n 打开包含文件
n 获得关于WizardBar的帮助
WizardBar中最左边的下拉列表框被称作类列表 (Class
List),它列举了当前工程中所有可用的类;中间的下拉列表
框被称作过滤器和成员列表 (Filter和Member List),对于
Visual C++工程,可以通过过滤器和成员列表指定在
WizardBar中列出的内容,即是列出所有的类成员,还是与特
定的资源ID相关联的成员;最右边的部分被称作WizardBar行
为控件,包括两个部分,一个按钮和位于按钮右边的下箭
头。单击下箭头可以出现如图2。11所示的下拉菜单,菜单中
各项的意义非常之直观,这里不再赘述。
图2。 11 WizardBar行为菜单
注意在图2。11中被以粗体显示的菜单项,这些项被称为
WizardBar默认行为。在以下几种情况下,WizardBar的默认
行为被执行:
n 单击了下箭头左边的图标按钮
n 在WizardBar的下拉列表中按下了回车键
n 在对话框编辑器中双击了某个控件
当不同的WizardBar的下拉列表框获得输入焦点时,
WizardBar采取不同的默认行为,如表所示。
表2。 7 不同的下拉列表框具有输入焦点时WizardBar的不同默认行为
…………………………………………………………Page 115……………………………………………………………
获得输入焦点的下拉 WizardBar采用的默认行为
列表框
类列表 跳转到选定的类中以字母排序的第一个成员。如
果类中没有实现任何函数和方法,则弹出一个对
话框为类创建新的成员函数和方法。对于C++全
局类 (global classes),该对话框提示创建新的
类。
过滤器和成员列表 如果位于一个资源ID上,默认行为为跳转到以字
母排序的第一个消息的处理函数处。如果没有创
建任何消息处理函数,则弹出一个对话框以创建
新的消息处理函数。
成员列表 默认行为为跳转到选定的成员的定义处。
为了更快的访问WizardBar提供的功能,可以为WizardBar类
列表、过滤器列表、成员列表和行为按钮设置快捷键,当按
下所设置的快捷键时,WizardBar中的相应元素获得输入焦
点;也可以为在下拉列表中给出的其它WizardBar行为设置相
应的快捷键,当这些快捷键被按下时,相应的行为将被执
行。为WizardBar设置快捷键的方法如下:
1。 选择Tools菜单下的Customize命令,打开如图2。12所示的
对话框。
2。 在Category下拉列表框中选择WizardBar。然后,在
mands列表框中选择需要设置快捷键的命令。这时,在
Description处就会出现该命令的相应的简单的英文解释,因
此,我们这里无需再对全部的命令给出详细的说明,其中对
应于WizardBar类列表、过滤器列表、成员列表和行为按钮的
命令分别为WBActionButtonActive、WBClassboActive、
WBFilterboActive、WBMemberboActive。
3。 然后单击Press new shortcut,并按下新的快捷键,如果
新的快捷键可用,则它将出现在Press new shortcut文本框
中,单击Assign按钮,即可将新的快捷键与指定的命令相关
联。
…………………………………………………………Page 116……………………………………………………………
图2。 12 为WizardBar设置快捷键
n 注意:
n 不可以使用那些已被系统保留的快捷键,如ESC、F1、
Ctrl+Alt+Del等。
n 如果所设置的快捷键已被其它命令使用,则在Press new
shortcut下方的Currently assigned to处将给出与该快
捷键相关联的当前命令,如果这时按下Assign按钮,则
该快捷键将与新设定的命令相关联,与原命令的关联将
自动失效。单击Reset All可以恢复Microsoft
Developer Studio原有的默认设置。
…………………………………………………………Page 117……………………………………………………………
第三章 Win32应用程序设计
在过去,进行Windows程序设计是一件痛苦异常的事情,原因是那时
候还没有现在的这些设计精美的应用程序开发工具。在今天,一个对
Windows程序运行的内部机制几乎一无所知的初入门者,只需要通过
不到一天的学习,也可以使用如Visual Basic之类的程序开发工具创
建出功能完整的Windows应用程序。这在几年前还是一件不可思议的
事,因为即使是一个熟练掌握C语言的程序员,在当时差不多需要半
年的学习才可以较全面的掌握Windows的编程技术,而且,与在DOS环
境下编程相比,急剧膨胀的程度代码大大增加了程序调试的困难,从
而使得编写一个出色的Windows应用程序要比编写一个出色的DOS需要
考虑多得多的东西。
在Microsoft的另一种易学易用的编程工具Visual Basic中,从某种
角度说,Windows程序不是编出来的,而是由程序员画出来的。但是
要知道,一个出色的Windows的应用程序并不仅在于在屏幕上绘出程
序的各个窗口和在窗口中恰当的安排每一个控件。对于具有一定基础
的程序员而言,更重要的内容在于知道Windows和Windows应用程序的
运行机制,以及它们之间以何种方式来进行通信,然而,明确 自己在
编写Windows时所需做的工作是哪一些。换句话说,我们需要透过
Windows漂亮的图形用户界面,认清在底层所发生的每一件事情。然
而,这并非是一件容易的事。虽然,使用MFC和AppWizard,我们仍可
能只需要回答几个简单的问题和添加少数的几条代码就能够生成功能
完整的Windows应用程序。但是记住,没有一个成功的商业软件是使
用这样的方式生成的。同时,也只有深入的理解了MFC应用程序框架
的运行机制,才可能用好和用活这一工具,才能达到熟悉掌握Visual
C++的境界。
尽管说MFC应用程序框架提供的是面向对象的Windows编程接口,这和
传统的使用C语言和SDK来进行的Windows应用程序设计有着很大的不
同,但是从底层来说,其中的大部分功能仍是通过调用最基本的
Win32 API来实现的。其中最重要的一点是,Windows应用程序的运行
机制仍然没有改变,它们仍然是通过消息来和操作系统,进而和用户
进行交互的事件驱动的应用程序。MFC对这一切进行了比较彻底的封
装,它们隐藏在你所看不见的背面。即使你对这一切一无所知,你仍
可以在Visual C++中使用MFC来进行程序设计。但是,经验表明,理
解这一切的最好的方式是回过头去,看一看这些内容在SDK编写的应
用程序是如何实现的,然后,再看一看在MFC中是如何把它们一层一
层的与程序员隔离开的。
…………………………………………………………Page 118……………………………………………………………
因此,在本章中介绍相对已 “过时”的Win32 SDK编程,并非是说以
后也使用SDK来编写应用程序,而在于让你通过它们更深入的从MFC的
内部了解MFC,并且,对于某些术语和概念的说明和澄清,也有助于
你以后理解很多的东西。如果你一开始对这些东西不感兴趣,那么,
你可以先暂时跳过此章,继续阅读本书的其它部分。当你对于MFC中
的某些问题感到不解,或者想知道MFC究竟是如何工作的时候,再回
过头来补充这些知识,也是完全可以的。
本章包括以下的内容:
l Windows应用程序的消息处理
l Win32 API和SDK
l WinMain函数
l 窗口和窗口过程
l 32位编程的特点
第一节 事件驱动的应用程序
类似的话已在很多书籍中说过了无数遍,以至于每一个正在或试图进
行Windows编程的人都耳熟能详:Windows应用程序是事件驱动 (或称
作消息驱动)的应用程序。Windows是一个多任务的操作系统,也就是
说,在同一时刻,在Windows中有着多个应用程序的实例正在运行,
比如说这时我正在打开字处理软件Word来编写这本书的书稿,同时,
还打开了Visual C++的集成开发环境Microsoft Developer Studio来
调试书中的示例程序,而且,后台还在放着歌曲。在这样的一个操作
系统中,不可能像过去的DOS那样,由一个应用程序来享用所有的系
统资源,这些资源是由Windows统一管理的。那么,特定的应用程序
如何获得用户输入的信息呢?事实上,Windows时刻监视着用户的一
举一动,并分析用户的动作与哪一个应用程序相关,然后,将用户的
动作以消息的形式发送给该应用程序,应用程序时刻等待着消息的到
来,一但发现它的消息队列中有未处理的消息,就获取并分析该消
息,最后,应用程序根据消息所包含的内容采取适当的动作来响应用
户所作的操作。举一个例子来说明上面的问题,假设我们编了一个程
序,该程序有一个File菜单,那么,在运行该应用程序的时候,如果
用户单击了File菜单,这个动作将被Windows (而不是应用程序本
身 !)所捕获,Windows经过分析得知这个动作应该由上面所说的那个
应用程序去处理,既然是这样,Windows就发送了个叫做WM_MAND
…………………………………………………………Page 119……………………………………………………………
的消息给应用程序,该消息所包含的信息告诉应用程序: “用户单击
了File菜单”,应用程序得知这一消息之后,采取相应的动作来响应
它,这个过程称为消息处理。Windows为每一个应用程序 (确切地说是
每一个线程)维护了相应的消息队列,应用程序的任务就是不停的从
它的消息队列中获取消息,分析消息和处理消息,直到一条接到叫做
WM_QUIT消息为止,这个过程通常是由一种叫做消息循环的程序结构
来实现的。
Windows所能向应用程序发送的消息多达数百种,但是,对于一般的
应用程序来说,只是其中的一部分有意义,举一个例子,如果你的应
用程序只使用鼠标,那么如WM_KEYUP、WM_KEYDOWN和WM_CHAR等消息
就没有任何意义,也就是说,应用程序中事实上不需要处理这些事
件,对于这些事件,只需要交给Windows作默认的处理即可。因此,
在应用程序中,我们需要处理的事件只是所有事件中的一小部分。
图3。1给出了一般Windows应用程序的执行流程。
因此,从某种角度上来看,Windows应用程序是由一系列的消息处理
代码来实现的。这和传统的过程式编程方法很不一样,编程者只能够
预测用户所利用应用程序用户界面对象所进行的操作以及为这些操作
编写处理代码,却不可以这些操作在什么时候发生或者是以什么顺序
来发生,也就是说,我们不可能知道什么消息会在什么时候以什么顺
序来临。
…………………………………………………………Page 120……………………………………………………………
图3。 1 Windows应用程序的基本流程
Windows程序在处理消息时使用了一种叫做回调函数 (callback
function)的特殊函数。回调函数由应用程序定义,但是,在应用程
序中并没有调用回调函数的代码,回调函数是供操作系统或者其子系
统调用的,这种调用通常发生在某一事件发生,或者在窗口或字体被
枚举时。典型的回调函数有窗口过程、对话框过程和钩子函数。其中
的窗口过程和对话框过程将在本章后面的内容中讲述。
第二节 Win32 API和SDK
说到Windows编程,就不能不谈到Windows API (Windows
Application Programming Interface,Windows应用程序编程接
口),它是所有Windows应用程序的根本之所在。简单的说,API就是
一系列的例程,应用程序通过调用这些例程来请求操作系统完成一些
低级服务。在Windows这样的图形用户界面中,应用程序的窗口、图
标、菜单和对话框等就是由API来管理和维护的。
Windows API具有两种基本类型:Win16 API和Win32 API。两者在很
多方面非常相像,但是Win32 API除了几乎包括了Win16 API中的所有
内容以外,还包括很多的其它内容。Windows API依靠三个主要的核
心组件提供Windows的大部分函数,在Win16和Win32 中,它们具有不
…………………………………………………………Page 121……………………………………………………………
同的名称,如表3。1所示。
表3。 1 Win16和Win32 的核心组件
Win16 API Win32 API 说明
USER。EXE USER32。DLL 负责窗口的管理,包括消息、菜单、
光标、通信、计时器和其它与控制窗
口显示
GDI。EXE GDI32。DLL 提供图形设备接口,管理用户界面和
图形绘制,包括Windows元文件、位
图、设备描述表和字体等
KRNL386。EXE KERNEL32。DLL 处理存储器低层功能、任务和资源管
理等Windows核心服务
虽然Win16 API组件带有。EXE的扩展名,但是它们事实都是动态链接
库 (。DLL),不能单独运行。其它一些非核心的Windows API由其它组
件所提供的DLL来实现,这些组件包括通用对话框、打印、文件压
缩、版本控制以及多媒体支持等。
Windows SDK (Windows Software Development Kit,Windows软件开
发工具包)和Windows API紧密联系,它是一套帮助C语言程序员创建
Windows应用程序的工具,在Windows SDK中包括了以下几个组成部
分:
l 大量的在线帮助,这些帮助描述了Windows编程所可能用到的函
数、消息、结构、宏及其它资源
l 各种编程工具,如对话框编辑器及图象编辑器等
l Windows库及头文件
l 使用C语言编写的示例程序
该工具包的最新版本就是我们正在使用的Win32 SDK,在安装了
Visual C++的同时,Win32 SDK也安装到你的计算机上了。尽管MFC提
供了对Win32 API的比较完整的封装,但是,在某些情况下,我们更
倾向于直接调用Win32 API,因为这有时候可以获得更高的效率,并
且有着更大的自由度。而且,使用MFC编写的新风格的Windows应用程
序的工
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!