Win32系统编程是指在Windows操作系统上使用Win32 API进行软件开发的过程;Win32 API是Windows操作系统提供的应用程序接口,允许程序与操作系统进行交互,实现各种功能。
以下是Win32系统编程的基本概念和步骤:
环境准备
-
开发工具:推荐使用Microsoft Visual Studio,它集成了丰富的开发工具和调试功能。(笔者使用的VS版本为2017)
-
编程语言:通常使用C或C++,因为Win32 API主要是用C语言编写的。
基本步骤
接着我们使用VS创建一个Windows桌面程序项目并通过项目中的窗口代码模板进行一些核心概念的解释:
1.创建Windows桌面程序项目
选择Windows桌面应用程序,底下的项目名称、位置以及解决方案名称都可以按照自身喜好进行命名。
创建完成后我们可以看到项目中的相关文件有:
我们对源文件中的代码进行解释:
这个模板程序展示了一个典型的Windows桌面应用程序框架,包括窗口注册、创建、消息处理和简单的菜单操作。
宏定义、全局变量
#define MAX_LOADSTRING 100
HINSTANCE hInst; // 当前实例
WCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
#define MAX_LOADSTRING 100
:定义了一个名为MAX_LOADSTRING
的宏,值为100;这个宏通常用来定义缓冲区的大小。
HINSTANCE hInst
:保存当前实例句柄,实例句柄在Windows应用程序中用于标识应用程序的实例。
WCHAR szTitle[MAX_LOADSTRING]
:用于存储窗口标题的字符串缓冲区。
WCHAR szWindowClass[MAX_LOADSTRING]
:用于存储窗口类名的字符串缓冲区。
前向声明
前向声明则是一种在代码中提前声明某个标识符(如函数或类),使得在定义之前就可以引用它;这在编译时有助于减少依赖和提高编译效率,其实就是声明,函数前向声明:包括窗口类注册、实例初始化、主窗口过程函数、关于对话框过程函数等。
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
①注册窗口类
ATOM MyRegisterClass(HINSTANCE hInstance)
:声明了一个函数MyRegisterClass
,它的参数是HINSTANCE
类型,返回类型是ATOM
;该函数通常用于注册窗口类。(ATOM类型之前没见过?直接在VS中选中该ATOM类型,按下F12跳转至类型定义处,其实他就是一个WORD类型,与之前在汇编中写到的字类型一样是16位,2字节)
注册窗口类是创建 Windows 应用程序的一个关键步骤,在 Windows 编程中,窗口类(Window Class)包含窗口的各种属性,如窗口过程(Window Procedure;在 Windows 编程中,窗口过程是一个回调函数,负责处理发送到窗口的所有消息,每个窗口类都必须指定一个窗口过程,以便操作系统能够正确处理窗口的事件和用户交互;例如:用户输入:鼠标点击、键盘输入等。)、背景颜色、光标等。通过注册窗口类,操作系统能够识别和创建该类的窗口实例。
②初始化实例并创建主窗口
BOOL InitInstance(HINSTANCE, int)
:声明了一个函数InitInstance
,它的参数是HINSTANCE
类型和一个整数,返回类型是BOOL
;该函数用于初始化实例并创建主窗口。
③窗口的消息处理
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)
:声明了一个回调函数WndProc
,它的参数是HWND
、UINT
、WPARAM
、LPARAM
类型,返回类型是LRESULT
,该函数是窗口的消息处理函数。
这边可以看到这个函数声明的结构有点怪,这个时候我们逐个部分来进行分析:
LRESULT
:该函数返回一个长整型(Long Pointer)值,表示消息处理的结果。
CALLBACK
:这是一个宏,定义了函数的调用约定。在 Windows 编程中,CALLBACK
通常等同于 汇编中的调用约定__stdcall
,用于指定函数调用的堆栈清理方式;调用约定规定了函数如何接收参数和返回值、如何在堆栈中管理参数等,CALLBACK
是 WinAPI 中常用的调用约定,确保系统可以正确调用窗口过程。
接着后面的WndProc
就是函数名称、(HWND, UINT, WPARAM, LPARAM)
就是函数的参数列表;函数名称就没什么好说的了,我们来说一下参数列表中的类型:
HWND:这是一个句柄类型,表示窗口的句柄(Window Handle),每个窗口在系统中都有一个唯一的句柄,用于标识窗口,通过 hWnd,窗口过程可以知道消息是发送给哪个窗口的。 UINT:这是一个无符号整数类型,表示消息的类型。Windows 系统中定义了大量的消息(例如 WM_PAINT、WM_COMMAND、WM_DESTROY 等),用来通知窗口各种事件。(定义源代码:typedef unsigned int UINT;) WPARAM:这是一个消息特定的附加信息类型,通常是无符号整数或指针;WParam 的具体意义取决于消息的类型。例如,对于 WM_KEYDOWN 消息,wParam 包含被按下的键的虚拟键码。(定义源代码:typedef UINT_PTR WPARAM;) LPARAM:这是另一个消息特定的附加信息,通常是长指针或结构体;lParam 的具体意义同样取决于消息的类型。例如,对于 WM_MOUSEMOVE 消息,lParam 包含鼠标指针的 X 和 Y 坐标。(定义源代码:typedef LONG_PTR LPARAM;)
④处理“关于”对话框
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM)
:声明了一个回调函数About
,它的参数是HWND
、UINT
、WPARAM
、LPARAM
类型,返回类型是INT_PTR
。该函数用于处理“关于”对话框的消息。这个声明的结构与主窗口的消息处理函数相似,这边就不做赘述了。
下篇接着说这四个函数的具体实现。