简单的Windows 应用程序
Windows窗口应用程序主函数-WinMain()
定义
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstace,
LPSTR lpCmdLine,
int nCmdShow
) {
MSG msg; // 消息结构体
HACCEL hAccelTable; // 消息加速键表
// 注册窗口类
MyRegisterClass(hInstance);
// 创建窗口并显示窗口
if ( !InitInstance(hInstance, SW_SHOWNORMAL) ) {
return FALSE;
}
// 加载加速键表
hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_SIMPLEWIN32));
// 获取消息
while ( GetMessage(&msg, NULL, 0, 0) ) {
// 将虚拟键消息转换为字符消息,并分发等待
if ( !TranslateAccelerator(msg.hwnd, hAccelTable, &msg) ) {
// 将虚拟键消息转换为字符消息
TranslateMessage(&msg);
// 分发消息
DispatchMessage(&msg);
}
}
// 返回退出消息值
return msg.wParam;
}
参数
hInstance:应用程序的实例句柄,操作实例化进程的变量。可通过GetModuleHandle()获得。
hPrevInstance:同一个文件创建的上一个实例句柄,是Win16平台的参数。Win32下弃用。
lpCmdLine:程序启动时传递给进程的参数。
nCmdShow:进程显示的方式(最大化、最小化、隐藏等)。
句柄:句柄不是固定含义,随着上下文的不同而不同。
内容概述
①注册窗口类
②显示并更新窗口
③不断获取消息并分发消息
流程
1.注册
创建WNDCLASSEX结构体传入RegisterClassEx()进行注册。
ATOM MyRegisterClass(HINSTANCE hInstance) {
// 填充结构体为0
WNDCLASSEX WndCls = {0};
WndCls.cbSize = sizeof(WndCls); // 结构体大小
WndCls.lpfnWndProc = WindowProc; // 窗口过程地址(消息处理函数)
WndCls.hInstance = hInstance; // 实例句柄
WndCls.lpszClassName = szClassName; // 窗口类名
WndCls.style = CS_HREDRAW | CS_VREDRAW; // 窗口风格
WndCls.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // 窗口背景色
WndCls.hCursor = LoadCursor(NULL, IDC_ARROW); // 鼠标句柄
WndCls.hIcon = LoadIcon(NULL, IDI_QUESTION); // 图标句柄
WndCls.cbClsExtra = 0; // 分配窗口管理类附加内存
WndCls.cbWndExtra = 0; // 分配窗口附加内存
// 注册窗口
return RegisterClassEx(&WndCls);
}
2.创建并显示
创建窗口:CreateWindow()或CreateWindowEx()
显示窗口:ShowWindow()
更新窗口:UpdateWindow()
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {
HWND hWnd = NULL;
//创建窗口
hWnd = CreateWindow(
szClassName, // 类名
TEXT("标题"), // 标题
WS_OVERLAPPEDWINDOW, // 样式
CW_USEDEFAULT, CW_USEDEFAULT, // X,Y
CW_USEDEFAULT, CW_USEDEFAULT, // W,H
NULL, // 父窗口句柄
NULL, // 菜单(ID)句柄
hInstance, // 应用程序句柄
NULL // 传递给WM_CREATE消息的CREATESTRUCT结构体的指针
);
if ( !hWnd ) {
return FALSE;
}
// 显示窗口
ShowWindow(hWnd, nCmdShow);
// 更新窗口
UpdateWindow(hWnd);
return TRUE;
}
3.获取并分发消息
获取消息:TranslateMessage();
分发消息:DispatchMessage();
窗口消息处理
消息在WinMain()中分发后,由系统调用WindowProc()消息处理函数。
对于应用程序自己的窗口,其他应用程序也会进行调用,所以为方便维护,调用消息处理函数由系统处理。
定义
LRESULT CALLBACK WindowProc(
HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam
) {
int id, wmEvent;
switch (message) {
case WM_COMMAND:
{
id = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch ( id ) {
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
}
case WM_CLOSE: // ①关闭按钮消息
{
DestroyWindow(hWnd); // ②销毁窗口,并发送WM_DESTROY消息
}
break;
case WM_DESTROY: // ③DestroyWindow()消息
{
PostQuitMessage(0); // ④发送WM_QUIT消息结束消息循环
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
参数
hWnd:窗口句柄
message:消息类型
wParam:消息附加信息
lParam:消息附加信息
说明
1)消息处理:通过参数message获得消息类型,一般处理较为频繁的消息放在最前以提高效率。
2)默认处理:对于没有设置处理的消息,通过DefWindowProc()交由系统处理。
2)结束:
①关闭按钮【发送WM_CLOSE消息】
②销毁窗口【发送WM_DESTROY消息】:DestroyWindow()
③结束消息循环【发送WM_QUIT消息】:PostQuitMessage(0)