首页 > 代码库 > Windows API 编程学习记录<二>
Windows API 编程学习记录<二>
恩,开始写Windows API编程第二节吧。
上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解。这节我们就使用Windows API 让大家来了解下Windows API的用法。
第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧:
int
WINAPI MessageBox(
HWND
hWnd,
LPCTSTR
lpText,
LPCTSTR
lpCaption,
UINT
uType);
恩,你现在肯定会觉得这是什么啊? 怎么好像除了int剩下的一个也不认识。以后我们会解释。但在解释之前我们必须了解一个Windows API 编程的常识,就是在Windows编程中,它为了方便记忆和使用,给原来咱们知道的基本类型定义了大量的宏定义或者使用结构体定义了大量新的数据结构。 比如这个
LPCTSTR
你一定会说,这是什么数据类型啊? 原来从来没见过。但是其实它的本质就是一个指针,它是一个指向字符串的指针。 而UINT其实就是 unsigned int 也就是无符整型,在Windows API 编程中会遇到很多很多这样新的类型,每次遇到去上网查下就行。你只要知道这些新的类型本质还是咱们学过的那些 int,char,指针就行。 现在让我们使用一下这个API:
#include<windows.h>
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
MessageBox(NULL, "你好", "我的第一个窗口程序", MB_OK);
return 0;
}
在编译器下运行这段代码就会的到下面的运行结果,是不是觉得这就是平时我们见到的那些对话框:
这下我们来仔细解释下这段代码具体是什么意思(可能现在有些解释看不懂,但还是都看下,以后就会慢慢理解的)
1. #include<windows.h>
这个就是Windows API 编程必须需要的头文件,如果你学过C语言,你就会知道,在头文件中声明了大量的函数供我们使用,这个MessageBox 在这个头文件有声明,我们在使用API的时候,必须要包含这个头文件,否则编译器不会识别API。
2. int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPSTR lpCmdLine,
int nShowCmd)
这个函数是一个32位应用程序的入口点,它会被系统自动调用,是不是感觉和C语言中的main函数很相似,只是这个Winmain函数怎么有那么多的参数?还有那个WINAPI是什么意思 呢? 现在我们来解释下,WINAPI 是__stdcall 的宏定义,它的作用是定义函数参数入栈顺序的。而WinMain函数那四个参数,我们来解释下,这里面有些解释比较抽象,不懂先放下,以后编写的程序多了就会自然而然理解的。解释中有个句柄这个术语估计大家比较陌生,其实可以这样理解,这就是Windows给系统中运行中每一个程序或资源起了一个互不相同的名字,只是官方叫法叫句柄(HANDLE)。以下就是WinMain函数参数的解释:
hInstance:应用程序当前实例的句柄。
hPrevlnstance:应用程序的先前实例的句柄。对于同一个程序打开两次,出现两个窗口第一次打开的窗口就是先前实例的窗口。对于一个32位程序,该参数总为NULL。
lpCmdLine:指向应用程序命令行的字符串的指针,不包括执行文件名。
nCmdShow:指明窗口如何显示(是隐藏还是显示,有没有最大化按钮之类的),具体取值可以自己搜索。
3. MessageBox(NULL, "你好", "我的第一个窗口程序", MB_OK);
这个API函数就是显示一个模态对话框,这个函数的定义是:int
WINAPI MessageBox(
HWND
hWnd,
LPCTSTR
lpText,
LPCTSTR
lpCaption,
UINT
uType);
以下就是MessageBox函数参数解释:
hWnd:消息框的拥有窗口。如果此参数为NULL,则消息框没有拥有窗口。
lpText:消息框的内容。
lpCaption:消息框的标题。
uType:指定一个决定对话框的内容和行为的位标志集(就是对话框显示的具体样式,比如有一个感叹号,或者有一个确定键),具体取值可以自己搜索。
恩,这就是简单的Windows API 的一个应用,现在是不是觉得API编程也不是那么神秘了。