最近因为工作的关系,要开始在windows上开发桌面应用。虽然只是一些UI程序,但是不深刻了解windows的各种API在开发应用的过程中会遇到不少阻碍。
于是决定重拾windows API,由于MFC框架太老。除了进行旧代码维护以外已经很少使用了。所以暂时不考虑使用MFC,而是使用纯win32 API来进行开发。可能开发UI上效率会低于MFC,但是重点是为了搞清楚win32 api的应用。对于在windows上开发的程序员来说,学习经典的windows编程非常重要,就算你使用C#,QT甚至Java语言来开发windows程序。因为学些这些API不仅仅是能让你编写代码, 更重要的事能够让你了解windows操作系统的机制。
由于win32 api大多数使用c语言编写,所以与api接口部分将使用标准的C语法。应用框架使用C++面向对象来编写。使用的环境是Visual Studio Community 2015 + visual assistX
1.1 Windows环境
1.2 Windows编程选项
书中使用的是10多年前的VC++6.0 由于版本年代久远,所以使用了最新的Visual Studio Community 2015来进行编译。
1.3 你的第一个Windows程序
#include <windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("Hello, Windows 7 x64 Service Pack 1"), TEXT("HelloMsg"), 0); return 0; }
windows.h中包含了其他若干非常重要的头文件
windef.h 基本数据类型定义
winnt.h 支持unicode的类型定义
winbase.h 内核函数
winuser.h 用户界面函数
wingdi.h 图形设备接口函数
WinMain() 是所有windows程序的入口申明与winbase.h
原形如下 windows
int WINAPI WinMain ( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd );
#define WINAPI __stdcall
规定了一种函数调用约定,表明如何在生成的堆栈中放置函数调用参数的机器代码。绝大多数windows api调用都定义成WINAPI
在32位windows中,hPrevInstance总是定义为NULL
第三个参数表明程序的命令行参数。
第四个参数表明程序最初如何显示,正常,最大化或者最小化在任务栏等。
1.3.5 MessageBox函数
第一个暂略,第二个参数是显示的消息,第三个参数是消息框的标题栏。 TEXT宏是为了兼容unicode应用
第四个参数是一系列MB_ 打头的参数用来表示消息框显示哪种按钮,定义在winuser.h中
#define MB_OK 0x00000000L
在该案例中MessageBox 返回ID_OK 1 也可能返回其他值