第一章 开始
首先,一开头就给出了本书要介绍的内容--当然是Windows下编写程序的方法。其次,程序用C语言编写,并且使用API。
明白了做什么的目标后,接着就对使用本书的读者提出了三个先决条件。
1. 从用户角度熟悉Windows。
2. 了解C语言。
3. 安装适用进行Windows编程的32位的C语言编译器和开发环境。(书中提到的是Microsoft Visual C++ 6.0)
1.1 Windows环境
Windows98和Windows NT是32位抢占式多任务及多线程图形操作系统。
Windows中使用Windows函数的方式与使用C库函数的方式相同。区别在于C库函数的机器代码链接到程序的代码中,而Windows函数的代码位于程序之外的DLL中。
1.2 Windows编程选项
"经典的" Windows编程方法:C语言+Windows API。
1.3 编写第一个Windows程序
#include <windows.h>
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hPrevinstance,
PSTR szCmdLine,int iCmdShow)
{
MessageBox(NULL,TEXT("Hello,Windows 98!"),TEXT("HelloMsg"),0);
return 0;
}
每个用C编写的Windows程序头部都可以看到:#include <windows.h>。
Windows.h是主要的包含文件,它包含了其他的Windows头文件,这些头文件的某些也包含了其他头文件。这些头文件中最重要的和最基本的是:
1. WINDEF.H 基本类型定义;
2. WINNT.H 支持Unicode的类型定义;
3. WINBASE.H 内核函数;
4. WINUSER.H 用户接口函数;
5. WINGDI.H 图形设备接口函数。
Windows程序的入口点是WinMain。
int WINAPI WinMain(HINSTANCE Hinstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
它在WINBASE.H中声明:
Int
WINAPI
WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR szCmdLine,
int iCmdShow
);
第三个参数在WINBASE.H中定义为LPSTR,将它改为PSTR。这两种数据类型都定义在WINNT.H中,作为指向字符串的指针。LP前缀代表"长指针",这是16位的Windows的一个创造。sz表示"以零结束的字符串"。
WinMain函数声明为返回一个int值。WINAPI标识符在WINDEF.H定义,语句如下:
#define WINAPI _stdcall
该语句指定了一个调用约定,包括如何生成机器代码以在堆栈中放置函数调用的参数。许多Windows函数调用声明为WINAPI。
WinMain的第一个参数被称为"实例句柄"。
句柄:应用程序用来识别某些事情的数字。
WinMain的第二个参数总是NULL(定义为0)。
WinMain的第三个参数是用于运行程序的命令行。某些Windows应用程序使用这个参数以在程序启动时将文件加载到内存。WinMain的第四个参数指出程序初始显示的方式。
MessageBox函数用于显示短信息。它被认为是一个对话框。MessageBox的第一个参数通常是窗口的句柄;第二个参数是在消息框主体中显示的字符串,第三个参数是出现在消息框标题栏上的字符串。
MessageBox的第四个参数可以是在WINUSER.H中定义的一组以前缀MB_开始的常数的组合。
以下常数以指出希望在对话框中显示的按钮:
#define MB_OK 0x00000000L
#define MB_OKCANCEL 0x00000001L
#define MB_ABORTRETRYIGNORE 0x00000002L
#define MB_YESNOCANCEL 0x00000003L
#define MB_YESNO 0x00000004L
#define MB_RETRYCANCEL 0x00000005L
使用C语言的"或"(|)运算符将上面显示的一个常数与代表默认按钮的常数组合:
#define MB_DEFBUTTON1 0x00000000L
#define MB_DEFBUTTON2 0x00000100L
#define MB_DEFBUTTON3 0x00000200L
#define MB_DEFBUTTON4 0x00000300L
还可以使用一个常数指出消息框中图标的外观:
#define MB_ICONHAND 0x00000010L
#define MB_ICONQUESTION 0x00000020L
#define MB_ICONEXCLAMATION 0x00000030L
#define MB_ICONASTERISK 0x00000040L
其中某些图标有代替名称:
#define MB_ICONWARNING MB_ICONEXCLAMATION
#define MB_ICONERROG MB_ICONHAND
#define MB_ICONINFORMATION MB_ICONASTERISK
#define MB_ICONSTOP MB_ICONHAND
在上面程序中,MessageBox返回数值1,但更严格地说,它返回IDOK,IDOK在WINUSER.H中定义,等于1。根据在消息框中显示的其他按钮,MessageBox函数还可以返回其他值。