前言
在windows编程中,界面开发的框架有很多.例如qt,win32,mfc,wpf,uwp,WinForms,Avalonia等. 比较推荐的是QT,与win32. win32 非常灵活,性能最好.但开发复杂的GUI非常困难,QT支持跨平台,其他的不是很建议.
开发基本思路
使用Win32 API 进行界面开发时,一般的步骤是:
- 创建窗口类
- 注册窗口类
- 创建窗口
- 显示窗口
- 消息循环事件触发与监听.
代码示例
我们想要创建窗口,可以使用系统已有的窗口类,也可以自定义创建窗口类.
WNDCLASS wc = {0};
wc.lpfnWndProc = WindowProc; // 窗口消息函数
wc.hInstance = hInstance; // 实例句柄
wc.lpszClassName = "SampleWindowClass"; // 窗口类名
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 自定义光标
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 自定义图标
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 背景画刷
wc.lpszMenuName = NULL; // 没有菜单
wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口样式
然后需要对该窗口类进行注册.(不同进程注册的窗口类是相互隔离的,只有系统的窗口类是公共的)
RegisterClass(&wc);
接着就是创建窗口
// 创建窗口
HWND hwnd = CreateWindowEx(
0, // 扩展样式
wc.lpszClassName, // 窗口类名
"Hello, Win32!", // 窗口标题
WS_OVERLAPPEDWINDOW, // 窗口样式
CW_USEDEFAULT, CW_USEDEFAULT, // 位置
500, 400, // 尺寸
NULL, // 父窗口
NULL, // 菜单
hInstance, // 实例句柄
NULL // 附加参数
);
显示窗口
// 显示窗口
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
编写消息循环
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
消息循环会发送窗口消息到WindowProc 这个我们定义的函数中.该函数需要如下定义(入参与出参都是固定的):
// 窗口过程函数实现
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_DESTROY: // 处理窗口关闭
PostQuitMessage(0); // 发送退出消息
return 0;
case WM_PAINT: { // 处理绘制
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1)); // 填充背景
EndPaint(hwnd, &ps);
} return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam); // 默认处理
}
这样我们就可以根据窗口的消息,来进行对应消息的处理.
Win32 API 窗口的应用,一般是作为逆向的窗口程序编写.例如注册机等