通过一个最简单的程序入门Windows编程

ak47 1489 0

一、最简单的程序

我们首先先一个最简单的Windows程序,功能是显示一个消息框,随便提示一些文字就可以了。

看一下代码:


#include <Windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) 

{

MessageBox(

NULL,

TEXT("随便提示一些内容就可以了!哈哈哈!"), //内容

TEXT("这里是标题!"), //标题名称

0);

return 0;

}

1

2

3

4

5

6

7

8

9

10

我们再看一下效果:


接下来我们从头开始剖析这个简单的小程序。


二、分析一下

① 头文件

#include <Windows.h>

1

开头的是在几乎所有用C语言编写的程序中都有的预处理器(preprocessor)指令:#include<Windows.h>。

windows.h是一个最重要的包含文件,它囊括了若干其他Windows头文件,其中的某些头文件又包含另外的一些头文件。


下列几个是最重要也是最基本的头文件:


WINDEF.H 基本数据类型定义。

WINNT.H 支持 Unicode的类型定义。

WINBASE.H 内核函数。

WINUSER.H 用户界面函数。

WINGDI.H 图形设备接口函数。

这些头文件定义了Windows的所有数据类型、函数调用、数据结构以及常量标识符。


② 程序入口

main是C程序的入口,而Windows程序的入口是WinMain,它总是这个样子的:


int WINAPI WinMain( HINSTANCE hInstance, 

HINSTANCE hPrevInstance, 

PSTR szCmdLine, 

int iCmdShow) 

1

2

3

4

我们看一下winbase.h中的声明:


int

WINAPI

WinMain (

    HINSTANCE hInstance,

    HINSTANCE hPrevInstance,

    LPSTR lpCmdLine,

    int nShowCmd

    );

1

2

3

4

5

6

7

8

我们可以看到是有一些区别的。 第三个参数在WINBASE.H中定义为LPSTR,而我们却把它改成了PSTR. 这两种数据类型在WINNT.H中都声明为指向字符串的指针。前缀LP代表长指针(Long Pointer),它是16位Windows的产物。另外就是我们改动的WinMain声明中的两个参数名。


WinMain函数的返回值被定义为int。

WINAPI标识符在WINDEF.H中定义,它规定了一种函数调用约定。而我们绝大多数Windows函数调用都定义成WiNAPI。


我们再来研究一下它的参数部分:


HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nShowCmd

1

2

3

4

第一个参数一般叫做“实例句柄”(Instance Handle)。在Windows程序中,句柄无非就是一个数值,程序里用它来标识某些东西。比如在我们这个例子里,这个句柄就唯一标识了 我们的这个程序。

实际上在某些Windows程序中,把句柄当作调用参数是必须的。比如在早期的Windows版本中,当多路并发运行同一个程序时,就需要为那个程序创建多个实例。同一程序的所有的实例都共享代码和只读存储。一个程序可以通过查看hPrevInstance,也就是第二个参数从而知道是否有它的其他实例正在运行。它也就可以因此跳过某些零散杂务步骤,把一些数据从前一个实例搬到自己的数据区来。但是在32位Windows 中,这一概念已不再采用。 因此WinMain的第二个参数通常总是NULL(定义为0)。

WinMain的第三个参数是用来运行程序的命令行(Command Line)。有些Windows程序

在启动时用它来把文件装入内存。

WinMain的第四个参数用来指明程序最初如何显示或正常显示,或最大化到全屏,或最小化显示在任务栏上。


③ MessageBox函数

最后我们看一下最主要的MessageBox函数。

MessageBox函数是用来显示短信息的。尽管形式比较单一,MessageBox所显示的小

小窗口实际上也是一个对话框。


我们也研究一下它的几个参数:

MessageBox的第一个参数通常是一个窗口句柄。我们先不管它。

第二个参数就是将要在信息框里出现的文本字符串。

第三个参数是将要在标题栏上显示的文本字符串。

而且在这个程序中,我们把所有的字符串都打包到TEXT宏代码里面,就是用TEST("XXX")把它包裹起来。一般来说,并不需要把所有的字符串都打包到TEXT宏代码里面,之所以这样做是因为这样在把程序转换成Unicode时会方便很多。

MessageBox的第四个参数是以前缀MB_打头的一些常量的组合。WINUSER.H中定义了这些相关常量。比如下面的这些,你可以任选一个来表示在对话框里希望用哪种按钮:


#define MB_OK 0X00000000L //ok

#define MB_OKCANCEL 0x00000001L //ok和取消

#define MB_ABORTRETRYIGNORE 0x00000002L //中止、重试和取消

#define MB_YESNOCANCEL 0x00000003L //yes/no/取消

#define MB_YESNO 0X00000004L //yes和no

#define MB_RETRYCANCEL 0x00000005L //重试和取消

1

2

3

4

5

6

当你把第四个参数选成0时,那就只显示0K按钮。我们还可以用OR(|)运算符把一个上述按钮常量跟一些其他的常量组合起来。

比如下面的来描述哪个按钮为默认按钮:


#define MB_DEFBUTTON1 0x00000000L

#define MB_DEFBUTTON2 0x00000100L

#define MB_DEFBUTTON3 0x00000200L

#define MB_DEFBUTTON4 0x00000300L

1

2

3

4

你还可以用下列某个常量来指定消息框中所显示的图标:


#define MB_ICONHAND 0x00000010L //错误

#define MB_ICONQUESTION 0x00000020L //疑问

#define MB_ICONEXCLAMATION 0x00000030L //警告

#define MB_ICONASTERISK 0x00000040L //感叹号

1

2

3

4

这些图标当中,有些还另有别名:


#define MB_ICONWARNING MB_ICONEXCLAMATION

#define MB_ICONERROR MB_ICONHAND

#define MB_ICONINFORMATION MB_ICONASTERISK

#define MB_ICONST0P MB_ICONHAND

1

2

3

4

我们可以尝试一下:

第一个:


MessageBox(

NULL,

TEXT("随便提示一些内容就可以了!哈哈哈!"), //内容

TEXT("这里是标题!"), //标题名称

MB_YESNOCANCEL | MB_DEFBUTTON2 | MB_ICONQUESTION);

return 0;

1

2

3

4

5

6

效果:


第二个:


MessageBox(

NULL,

TEXT("随便提示一些内容就可以了!哈哈哈!"), //内容

TEXT("这里是标题!"), //标题名称

MB_RETRYCANCEL | MB_DEFBUTTON3 | MB_ICONHAND);

return 0;

1

2

3

4

5

6

效果:



三、总结

相信通过这个简单的例子和讲解,你已经对Windows编程有了一个初步的大体的印象。虽然系统提供了众多的选项,但是我们可能还是觉得不太够,如我们暂时不知道怎么调整窗口的大小,颜色等等。我们后面就会学习怎么样随意的格式化我们的MessageBox,使我们的Windows程序变得丰富多彩。

标签: 程序 Windows 编程

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~