
2.2 SDK方式
SDK方式使用C语言和Windows应用程序编程接口(Windows API)来开发Windows应用程序,Windows API里面都是C函数,类似于C语言的标准函数库,只是Windows API这个函数库(或称开发包)用来开发Windows应用程序。微软通过Windows软件开发包(Windows Software Development Kit, SDK)来提供Windows API。这种方式是早期开发Windows应用程序的唯一方式,现在在界面开发中用的不多,但在非界面领域,比如多线程、网络、图形图像等某些对速度要求较高的场合会经常用到,SDK方式是底层的开发方式,熟悉了SDK方式后,对理解MFC方式大有裨益。用这种方式开发要求开发者熟悉C语言和Windows环境。这种方式开发的Windows程序习惯称为Win32程序。
用这种方式开发Windows应用程序的最大好处是只需熟悉C语言,不必学习C++语言,学会这种开发方式后能对Windows操作系统底层运行机制有相当深入的理解,而且这种方式开发出来的程序相对其他两种方式运行速度更快。下面我们来看一个最简单的Win32程序。
第一个Win32控制台程序
通常把在控制台(命令行窗口)中运行的程序称为Win32控制台程序,而拥有图形界面的Win32程序称为Win32应用程序。控制台应用程序很简单,相信大家学习C语言的时候已经用的很熟练了,这里不再赘述。很多C语言书上开头都会有一个“Hello World”程序,它的代码是这样的:
#include "stdio.h" int main() { printf("Hello World"); return 0; }
下面,我们也写一个“Hello World”程序作为我们第一个Win32应用程序。程序很简单,就在屏幕上出现一个对话框,对话框上面有一段文本“Hello World”。
【例2.1】 第一个Win32应用程序
(1)打开Visual C++ 2013,选择菜单“新建”|“项目”,或直接按快捷键Ctrl+Shift+N,弹出“新建项目”对话框,在该对话框上,在左边展开“模板”|“Visua C++”|“Win32”,在右边选中“Win32项目”,如图2-1所示。

图2-1
然后在下面“名称”文本框中输入项目名称,如“Test”,并输入一个项目位置。最后单击“确定”按钮。随后会出现“Win32应用程序向导”对话框,单击左边的“应用程序设置”,然后在右边的附加选项下选择“空项目”,如图2-2所示。

图2-2
最后单击“完成”按钮。此时,一个空的项目完成了,下面我们开始添加文件和代码。
(2)在“解决方案资源管理器”上,展开Test,对“源文件”右击,在右击菜单上选择“添加”|“新建项”,出现“添加新项”对话框,在该对话框上,选择“C++文件(.cpp)”,并输入名称“Test.cpp”,如图2-3所示。

图2-3
最后单击“添加”按钮。此时在IDE上会自动打开Test.cpp这个文件。然后我们开始输入代码。
(3)在Test.cpp中输入代码如下:
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpcmdLine, int nCmdShow) { MessageBox(NULL, TEXT("Hello World"), TEXT("我的第一个程序"), MB_OK); return 0; }
是不是看上去很熟悉,和传统的C语言版本的“Hello World”程序的结构很类似。在这段程序中,windows.h是所有C语言开发Windows程序时必须要包含的,Windows API编程所需的系统头文件和宏定义都在该文件中包含。
WinMain相当于以前程序的main函数,它是Windows程序的入口点,它有4个参数,其中参数hInstance是当前程序的实例句柄;hPrevInstance现在不用,总是为NULL; lpcmdLine是一个字符串指针,表示传进来的命令行参数,如果用户是在命令行下运行本程序,那么输入的命令行可以由该参数获得;nCmdShow表示程序刚刚运行的时候窗口显示的方式(比如正常大小显示、最大化显示或最小化显示)。
WinMain前面的WINAPI是一种函数调用约定,它定义了函数参数入栈的次序是从右到左,WINAPI在minwindef.h中有定义:
#define WINAPI __stdcall
MessageBox是我们接触到的第一个Windows API函数,它的功能是跳出一个小的对话框,对话框中间会显示一行字符串“Hello World”,标题栏会显示字符串“我的第一个程序”。字符串前面的TEXT是一个系统定义的宏,它主要是让字符串支持Unicode环境和多字节环境,关于Unicode以后会讲到。
MessageBox该函数的声明如下:
int MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType );
该函数显示一个消息框。其中,hWnd表示拥有该消息框的窗口句柄;lpText表示消息框显示的内容;lpCaption表示消息框显示的标题;uType是图标和按钮的风格组合,常见的uType取值有:
● MB_OK:消息框显示“确定”按钮。
● MB_ABORTRETRYIGNORE:消息框显示“终止”“重试”“忽略”按钮。
● MB_YESNOCANCEL:消息框显示“是”、“否”和“取消”按钮。
● MB_ICONEXCLAMATION:消息框显示感叹号图标。
● MB_ICONQUESTION:消息框显示问号图标。
函数的返回值可以是下列各值:
● IDABORT:用户选择了退出按钮。
● IDCANCEL:用户选择了取消按钮。
● IDCONTINUE:用户选择了继续按钮。
● IDIGNORE:用户选择了忽略按钮。
● IDNO:用户选择了否按钮。
● IDOK:用户选择了OK按钮。
● IDRETRY:用户选择了重试按钮。
● IDTRYAGAIN:用户选择了Try Again按钮。
● IDYES:用户选择了是按钮。
这些取值都是系统预定义的宏,可以直接使用。

图2-4
(4)开始运行工程。单击菜单“调试”|“开始执行(不调试)”,或直接按Ctrl+F5来运行工程,运行结果如图2-4所示。