📄 chap03.html
字号:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft Word 97">
<TITLE>第三章 Win32应用程序设计</TITLE>
<META NAME="Template" CONTENT="D:\Office95\Template\Manuscripts\32开图书模板.dot">
</HEAD>
<BODY>
<FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P ALIGN="CENTER"><A NAME="_Toc425696652">第三章</FONT><FONT FACE="Arial" SIZE=5> Win32</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>应用程序设计</A></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">在过去,进行</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>程序设计是一件痛苦异常的事情,原因是那时候还没有现在的这些设计精美的应用程序开发工具。在今天,一个对</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>程序运行的内部机制几乎一无所知的初入门者,只需要通过不到一天的学习,也可以使用如</FONT><FONT SIZE=3>Visual Basic</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>之类的程序开发工具创建出功能完整的</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序。这在几年前还是一件不可思议的事,因为即使是一个熟练掌握</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>语言的程序员,在当时差不多需要半年的学习才可以较全面的掌握</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的编程技术,而且,与在</FONT><FONT SIZE=3>DOS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>环境下编程相比,急剧膨胀的程度代码大大增加了程序调试的困难,从而使得编写一个出色的</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序要比编写一个出色的</FONT><FONT SIZE=3>DOS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>需要考虑多得多的东西。</P>
<P ALIGN="JUSTIFY">在</FONT><FONT SIZE=3>Microsoft</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的另一种易学易用的编程工具</FONT><FONT SIZE=3>Visual Basic</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中,从某种角度说,</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>程序不是编出来的,而是由程序员画出来的。但是要知道,一个出色的</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的应用程序并不仅在于在屏幕上绘出程序的各个窗口和在窗口中恰当的安排每一个控件。对于具有一定基础的程序员而言,更重要的内容在于知道</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序的运行机制,以及它们之间以何种方式来进行通信,然而,明确自己在编写</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>时所需做的工作是哪一些。换句话说,我们需要透过</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>漂亮的图形用户界面,认清在底层所发生的每一件事情。然而,这并非是一件容易的事。虽然,使用</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,我们仍可能只需要回答几个简单的问题和添加少数的几条代码就能够生成功能完整的</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序。但是记住,没有一个成功的商业软件是使用这样的方式生成的。同时,也只有深入的理解了</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序框架的运行机制,才可能用好和用活这一工具,才能达到熟悉掌握</FONT><FONT SIZE=3>Visual C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的境界。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">尽管说</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序框架提供的是面向对象的</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>编程接口,这和传统的使用</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>语言和</FONT><FONT SIZE=3>SDK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来进行的</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序设计有着很大的不同,但是从底层来说,其中的大部分功能仍是通过调用最基本的</FONT><FONT SIZE=3>Win32 API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来实现的。其中最重要的一点是,</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序的运行机制仍然没有改变,它们仍然是通过消息来和操作系统,进而和用户进行交互的事件驱动的应用程序。</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对这一切进行了比较彻底的封装,它们隐藏在你所看不见的背面。即使你对这一切一无所知,你仍可以在</FONT><FONT SIZE=3>Visual C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中使用</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来进行程序设计。但是,经验表明,理解这一切的最好的方式是回过头去,看一看这些内容在</FONT><FONT SIZE=3>SDK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>编写的应用程序是如何实现的,然后,再看一看在</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中是如何把它们一层一层的与程序员隔离开的。</P>
<P ALIGN="JUSTIFY">因此,在本章中介绍相对已“过时”的</FONT><FONT SIZE=3>Win32 SDK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>编程,并非是说以后也使用</FONT><FONT SIZE=3>SDK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来编写应用程序,而在于让你通过它们更深入的从</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的内部了解</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,并且,对于某些术语和概念的说明和澄清,也有助于你以后理解很多的东西。如果你一开始对这些东西不感兴趣,那么,你可以先暂时跳过此章,继续阅读本书的其它部分。当你对于</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的某些问题感到不解,或者想知道</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>究竟是如何工作的时候,再回过头来补充这些知识,也是完全可以的。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">本章包括以下的内容:</P>
<UL>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY"><LI>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序的消息处理</LI></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY"><LI>Win32 API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>SDK</LI></P>
<P ALIGN="JUSTIFY"><LI>WinMain</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数</LI></P>
<P ALIGN="JUSTIFY"><LI>窗口和窗口过程</LI></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY"><LI>32</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>位编程的特点</LI></P></UL>
</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4><P ALIGN="CENTER"><A NAME="_Toc425696653">第一节</FONT><FONT SIZE=4> </FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>事件驱动的应用程序</A></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">类似的话已在很多书籍中说过了无数遍,以至于每一个正在或试图进行</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>编程的人都耳熟能详:</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序是事件驱动</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或称作消息驱动</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的应用程序。</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是一个多任务的操作系统,也就是说,在同一时刻,在</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中有着多个应用程序的实例正在运行,比如说这时我正在打开字处理软件</FONT><FONT SIZE=3>Word</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来编写这本书的书稿,同时,还打开了</FONT><FONT SIZE=3>Visual C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的集成开发环境</FONT><FONT SIZE=3>Microsoft Developer Studio</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来调试书中的示例程序,而且,后台还在放着歌曲。在这样的一个操作系统中,不可能像过去的</FONT><FONT SIZE=3>DOS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>那样,由一个应用程序来享用所有的系统资源,这些资源是由</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>统一管理的。那么,特定的应用程序如何获得用户输入的信息呢?事实上,</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>时刻监视着用户的一举一动,并分析用户的动作与哪一个应用程序相关,然后,将用户的动作以消息的形式发送给该应用程序,应用程序时刻等待着消息的到来,一但发现它的消息队列中有未处理的消息,就获取并分析该消息,最后,应用程序根据消息所包含的内容采取适当的动作来响应用户所作的操作。举一个例子来说明上面的问题,假设我们编了一个程序,该程序有一个</FONT><FONT SIZE=3>File</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>菜单,那么,在运行该应用程序的时候,如果用户单击了</FONT><FONT SIZE=3>File</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>菜单,这个动作将被</FONT><FONT SIZE=3>Windows (</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>而不是应用程序本身!</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所捕获,</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>经过分析得知这个动作应该由上面所说的那个应用程序去处理,既然是这样,</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>就发送了个叫做</FONT><FONT SIZE=3>WM_COMMAND</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的消息给应用程序,该消息所包含的信息告诉应用程序:“用户单击了</FONT><FONT SIZE=3>File</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>菜单”,应用程序得知这一消息之后,采取相应的动作来响应它,这个过程称为消息处理。</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为每一个应用程序</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>确切地说是每一个线程</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>维护了相应的消息队列,应用程序的任务就是不停的从它的消息队列中获取消息,分析消息和处理消息,直到一条接到叫做</FONT><FONT SIZE=3>WM_QUIT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>消息为止,这个过程通常是由一种叫做消息循环的程序结构来实现的。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所能向应用程序发送的消息多达数百种,但是,对于一般的应用程序来说,只是其中的一部分有意义,举一个例子,如果你的应用程序只使用鼠标,那么如</FONT><FONT SIZE=3>WM_KEYUP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>、</FONT><FONT SIZE=3>WM_KEYDOWN</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>WM_CHAR</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>等消息就没有任何意义,也就是说,应用程序中事实上不需要处理这些事件,对于这些事件,只需要交给</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>作默认的处理即可。因此,在应用程序中,我们需要处理的事件只是所有事件中的一小部分。</P>
<P ALIGN="JUSTIFY">图</FONT><FONT SIZE=3>3.1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>给出了一般</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序的执行流程。</P>
<P ALIGN="JUSTIFY">因此,从某种角度上来看,</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序是由一系列的消息处理代码来实现的。这和传统的过程式编程方法很不一样,编程者只能够预测用户所利用应用程序用户界面对象所进行的操作以及为这些操作编写处理代码,却不可以这些操作在什么时候发生或者是以什么顺序来发生,也就是说,我们不可能知道什么消息会在什么时候以什么顺序来临。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image243.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image243.gif" WIDTH=543 HEIGHT=440></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>3. 1 Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>应用程序的基本流程</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>程序在处理消息时使用了一种叫做回调函数</FONT><FONT SIZE=3>(callback function)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的特殊函数。回调函数由应用程序定义,但是,在应用程序中并没有调用回调函数的代码,回调函数是供操作系统或者其子系统调用的,这种调用通常发生在某一事件发生,或者在窗口或字体被枚举时。典型的回调函数有窗口过程、对话框过程和钩子函数。其中的窗口过程和对话框过程将在本章后面的内容中讲述。</P>
</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4><P ALIGN="CENTER"><A NAME="_Toc425696654">第二节</FONT><FONT SIZE=4> Win32 API</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>和</FONT><FONT SIZE=4>SDK</A></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">说到</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>编程,就不能不谈到</FONT><FONT SIZE=3>Windows API (Windows Application Programming Interface</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序编程接口</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,它是所有</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序的根本之所在。简单的说,</FONT><FONT SIZE=3>API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>就是一系列的例程,应用程序通过调用这些例程来请求操作系统完成一些低级服务。在</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>这样的图形用户界面中,应用程序的窗口、图标、菜单和对话框等就是由</FONT><FONT SIZE=3>API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来管理和维护的。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">Windows API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>具有两种基本类型:</FONT><FONT SIZE=3>Win16 API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>Win32 API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。两者在很多方面非常相像,但是</FONT><FONT SIZE=3>Win32 API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>除了几乎包括了</FONT><FONT SIZE=3>Win16 API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的所有内容以外,还包括很多的其它内容。</FONT><FONT SIZE=3>Windows API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>依靠三个主要的核心组件提供</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的大部分函数,在</FONT><FONT SIZE=3>Win16</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>Win32</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中,它们具有不同的名称,如表</FONT><FONT SIZE=3>3.1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示。</P>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">表</FONT><FONT FACE="Arial" SIZE=1>3. 1 Win16</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=1>和</FONT><FONT FACE="Arial" SIZE=1>Win32</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=1>的核心组件</P></FONT>
<P ALIGN="CENTER"><CENTER><TABLE BORDER CELLSPACING=2 BORDERCOLOR="#808080" CELLPADDING=7 WIDTH=511>
<TR><TD WIDTH="20%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">Win16 API</FONT></TD>
<TD WIDTH="22%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">Win32 API</FONT></TD>
<TD WIDTH="58%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">说明</FONT></TD>
</TR>
<TR><TD WIDTH="20%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">USER.EXE</FONT></TD>
<TD WIDTH="22%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">USER32.DLL</FONT></TD>
<TD WIDTH="58%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">负责窗口的管理,包括消息、菜单、光标、通信、计时器和其它与控制窗口显示</FONT></TD>
</TR>
<TR><TD WIDTH="20%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">GDI.EXE</FONT></TD>
<TD WIDTH="22%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">GDI32.DLL</FONT></TD>
<TD WIDTH="58%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">提供图形设备接口,管理用户界面和图形绘制,包括</FONT><FONT SIZE=1>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>元文件、位图、设备描述表和字体等</FONT></TD>
</TR>
<TR><TD WIDTH="20%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">KRNL386.EXE</FONT></TD>
<TD WIDTH="22%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">KERNEL32.DLL</FONT></TD>
<TD WIDTH="58%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">处理存储器低层功能、任务和资源管理等</FONT><FONT SIZE=1>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>核心服务</FONT></TD>
</TR>
</TABLE>
</CENTER></P>
<FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">虽然</FONT><FONT SIZE=3>Win16 API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>组件带有</FONT><FONT SIZE=3>.EXE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的扩展名,但是它们事实都是动态链接库</FONT><FONT SIZE=3>(.DLL)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,不能单独运行。其它一些非核心的</FONT><FONT SIZE=3>Windows API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>由其它组件所提供的</FONT><FONT SIZE=3>DLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来实现,这些组件包括通用对话框、打印、文件压缩、版本控制以及多媒体支持等。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">Windows SDK (Windows Software Development Kit</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>软件开发工具包</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>Windows API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>紧密联系,它是一套帮助</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>语言程序员创建</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序的工具,在</FONT><FONT SIZE=3>Windows SDK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中包括了以下几个组成部分:</P>
<UL>
<P ALIGN="JUSTIFY"><LI>大量的在线帮助,这些帮助描述了</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>编程所可能用到的函数、消息、结构、宏及其它资源</LI></P>
<P ALIGN="JUSTIFY"><LI>各种编程工具,如对话框编辑器及图象编辑器等</LI></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY"><LI>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>库及头文件</LI></P>
<P ALIGN="JUSTIFY"><LI>使用</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>语言编写的示例程序</LI></P></UL>
<P ALIGN="JUSTIFY">该工具包的最新版本就是我们正在使用的</FONT><FONT SIZE=3>Win32 SDK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,在安装了</FONT><FONT SIZE=3>Visual C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的同时,</FONT><FONT SIZE=3>Win32 SDK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>也安装到你的计算机上了。尽管</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>提供了对</FONT><FONT SIZE=3>Win32 API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的比较完整的封装,但是,在某些情况下,我们更倾向于直接调用</FONT><FONT SIZE=3>Win32 API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,因为这有时候可以获得更高的效率,并且有着更大的自由度。而且,使用</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>编写的新风格的</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序的工作方式基本上与使用</FONT><FONT SIZE=3>SDK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>编写的同一程序一样,它们往往有着很多的共同之处,只是使用</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>更加的方便,因为它隐藏了大量的复杂性。</P>
<P ALIGN="JUSTIFY">前面提到过,面向对象的编程方式是当前最流行的程序设计方法,但是,</FONT><FONT SIZE=3>Win32 API</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>本身却是基于</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>语言的过程式编程的,</FONT><FONT SIZE=3>SDK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的最主要的不同之处也就是以</FONT><FONT SIZE=3>C</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>与</FONT><FONT SIZE=3>C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>之间的差别,使用</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>进行</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序设计需要面向对象的编程思想和方法,好在我们已经在前面这此进行了大量的铺垫。</P>
</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4><P ALIGN="CENTER"><A NAME="_Toc425696655">第三节</FONT><FONT SIZE=4> </FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>使用</FONT><FONT SIZE=4>SDK</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>编写</FONT><FONT SIZE=4>Windows</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>应用程序</A></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">传统的</FONT><FONT SIZE=3>DOS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>程序以</FONT><FONT SIZE=3>main</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数作为进入程序的初始入口点,在</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序中,</FONT><FONT SIZE=3>main</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数被</FONT><FONT SIZE=3>WinMain</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数取而代之,</FONT><FONT SIZE=3>WinMain</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数的原型如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>int WINAPI WinMain (HINSTANCE hInstance,		// 当前实例句柄</P>
<P>					HINSTANCE hPrevInstance,	// 前一实例句柄</P>
<P>					LPSTR lpCmdLine,			// 指向命令行参数的指针</P>
<P>					int nCmdShow)				// 窗口的显示状态</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">这里出现了一个新的名词“句柄”</FONT><FONT SIZE=3>(handle)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,所谓的句柄是一个标识对象的变量,或者是一个对操作系统资源的间接引用。</P>
<P ALIGN="JUSTIFY">在上面的函数原型中,我们看到了一些“奇怪”的数据类型,如前面的</FONT><FONT SIZE=3>HINSTANCE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>LPSTR</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>等,事实上,很多这样的数据类型只是一些基本数据类型的别名,表</FONT><FONT SIZE=3>3.2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>列出了一些在</FONT><FONT SIZE=3>Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>编程中常用的基本数据类型的别名,表</FONT><FONT SIZE=3>3.3</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>列出了常用的预定义句柄,它们的类型均为</FONT><FONT SIZE=3>void *</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,即一个</FONT><FONT SIZE=3>32</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>位指针。</P>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">表</FONT><FONT FACE="Arial" SIZE=1>3. 2 Windows</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=1>基本数据类型</P></FONT>
<P ALIGN="CENTER"><CENTER><TABLE BORDER CELLSPACING=2 BORDERCOLOR="#808080" CELLPADDING=7 WIDTH=535>
<TR><TD WIDTH="17%" VALIGN="TOP">
<FONT SIZE=1><P ALIGN="JUSTIFY">Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>中所用的数据类型</FONT></TD>
<TD WIDTH="25%" VALIGN="TOP">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">对应的基本数据类型</FONT></TD>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -