编写Windows程序,起首要包括 windows.h 头文件。windows.h 还包括了其他一些Windows头文件,例如:

  • windef.h:根本类型界说

  • winbase.h:内核函数

  • wingdi.h:用户接口函数

  • winuser.h: 图形装备接口函数


这些头文件界说了Windows的一切数据类型、函数原型、数据构造和符号常量,也就是说,一切的Windows API都在这些头文件中声明。
在C言语中,程序多是“黑屏”的,称为掌握台程序(Console Application)。这套教程要讲的是带界面的Windows程序(Windows Application),也称为GUI程序(GUI Application)
掌握台程序以 main() 为进口函数,Windows程序以 WinMain() 为进口函数,静态链接库(DLL)以 DllMain() 为进口函数(请检查 静态链接库DLL教程),分歧的进口函数决议了分歧类型的程序。
WinMain() 函数的原型为:

			int WINAPI WinMain( HINSTANCE hInstance, // 以后窗口句柄 HINSTANCE hPrevInstance, // 前一个窗口句柄,Win32下为NULL(Win16留下的废料,今朝已弃用) LPSTR lpCmdLine, // 敕令行参数 int nCmdShow // 窗口显示方法 );

先不要急于了解这些参数的寄义,我先给人人写一个复杂的不带黑屏的、真正的Windows程序:

			#include  int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ // 挪用API 函数MessageBox int nSelect = MessageBox(NULL, TEXT("你好,欢迎离开C言语中文网!"), TEXT("Welcome"), MB_OKCANCEL); if(nSelect == IDOK){ MessageBox(NULL, TEXT("你点击了“肯定”按钮"), TEXT("提醒"), MB_OK); }else{ MessageBox(NULL, TEXT("你点击了“撤消”按钮"), TEXT("提醒"), MB_OK); } return 0; }

编译并运转,会弹出一个对话框,如下所示:
第一个真正的Windows程序_第1张图片
点击“肯定”或“撤消”按钮,又会弹出一个新的提醒框。人人可以亲身运转一下,会有真实的体验。
本来没有main()函数,没有#include 的C言语程序也是可以运转的!
MessageBox() 函数是浩瀚API中的一个,用于弹出一个指定作风的对话框,其原型为:

int WINAPI MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType );

WINAPI 为宏界说#define  WINAPI  __stdcall,表现函数挪用方法,临时可以不睬会,不影响代码编写,只需求晓得MessageBox()前往值为 int,表现按下的按钮。有兴味的读者可以检查:__stdcall,__cdecl,__pascal,__fastcall的差别
参数阐明:

  • hWnd:该音讯框的父窗口句柄,假如此参数为NULL,则该音讯框没有具有父窗口。人人不必急于了解这个参数,后续会具体解说。

  • lpText:音讯框的内容。LPCTSTR 是自界说数据类型,等价于 const char *。

  • lpCaption:音讯框的题目。

  • uType:对话框的按钮款式和图标。


uType 支撑的按钮款式:

按钮 寄义
MB_OK 默许值,有一个“确认”按钮在外面
MB_YESNO 有“是”和“否”两个按钮在外面
MB_ABORTRETRYIGNORE 有“中断”,“重试”和“跳过”三个按钮在外面
MB_YESNOCANCEL 有“是”,“否”和“撤消”三个按钮在外面
MB_RETRYCANCEL 有“重试”和“撤消”两个按钮在外面
MB_OKCANCEL 有“肯定”和“撤消”两个按钮在外面


这些按钮多是宏界说:

			#define MB_OK 0x00000000L #define MB_OKCANCEL 0x00000001L #define MB_ABORTRETRYIGNORE 0x00000002L #define MB_YESNOCANCEL 0x00000003L #define MB_YESNO 0x00000004L #define MB_RETRYCANCEL 0x00000005L

你也可以测验考试用数字来表现按钮,例如:

MessageBox(NULL, TEXT("你好,欢迎离开C言语中文网!"), TEXT("Welcome"), 1);

也会生成与下面相反的对话框。
除了按钮,uType 还支撑图标(图标对用户有提示感化):

图标 寄义
MB_ICONEXCLAMATION 一个赞叹号呈现在音讯框:
MB_ICONWARNING 一个赞叹号呈现在音讯框(同上)
MB_ICONINFORMATION 一个圆圈中小写字母i构成的图标呈现在音讯框:
MB_ICONASTERISK 一个圆圈中小写字母i构成的图标呈现在音讯框(同上)
MB_ICONQUESTION 一个成绩标志图标呈现在音讯框:
MB_ICONSTOP 一个中止音讯图标呈现在音讯框:
MB_ICONERROR 一个中止音讯图标呈现在音讯框(同上)
MB_ICONHAND 一个中止音讯图标呈现在音讯框(同上)


这些图标也多是宏界说:

			#define MB_ICONHAND 0x00000010L #define MB_ICONQUESTION 0x00000020L #define MB_ICONEXCLAMATION 0x00000030L #define MB_ICONASTERISK 0x00000040L


假如愿望同时界说按钮和图标的款式,可以运用或运算|,例如:

			MessageBox( NULL, TEXT("你好,欢迎离开C言语中文网!"), TEXT("Welcome"), MB_OKCANCEL | MB_ICONINFORMATION);

会弹出如下的对话框:
第一个真正的Windows程序_第2张图片
与下面的对话框比拟,多出了一个图标,同时还能听到提醒音(Win7 有,XP 和 Win8 读者可以亲身测试)。
人人有没有发现,按钮多是用十六进制的第1位(二进制前4位)来表现,图标多是运用十六进制第2位(二进制第5~8位)来表现,停止或运算,每一个位都不会改动,如下图所示:
第一个真正的Windows程序_第3张图片
Windows 经过检测第1位的值来肯定按钮的款式,检测第2位的值来肯定图标款式。
再看来一下MessageBox() 的前往值。
MessageBox() 前往被按下的按钮,以数字表现,这些数字都被界说成了宏,如下所示:

前往值 寄义
IDOK 用户按下了“确认”按钮
IDCANCEL 用户按下了“撤消”按钮
IDABORT 用户按下了“中断”按钮
IDRETRY 用户按下了“重试”按钮
IDIGNORE 用户按下了“疏忽”按钮
IDYES 用户按下了“是”按钮
IDNO 用户按下了“否”按钮


对应的宏界说为:

			#define IDOK 1 #define IDCANCEL 2 #define IDABORT 3 #define IDRETRY 4 #define IDIGNORE 5 #define IDYES 6 #define IDNO 7