前言
以前一直没有认真学习过Win32应用程序。现在进行简单学习。
先理解下Win32程序的创建过程:
主要分为4步: 注册窗口类别、创建窗口、消息循环、编写消息处理函数
int WINAPI WinMain(
HINSTANCE hInstance, //执行实体句柄,往往在其他windows函数中作为入参
HINSTANCE hPrevInstance, //总是NULL
LPSTR lpCmdLine, //执行程序的命令列
int nShowCmd //程序最初显示的方式,正常、最大化、最小化
);
1、注册一个窗口类别
WORD MyRegisterClass(HINSTANCE hInstance) //传入WinMain句柄实体 hInstance
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc; //此函数为窗口消息处理函数
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_THINKPADKEYBOARD)); //加载图标
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);//加载鼠标光标
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_THINKPADKEYBOARD);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassExW(&wcex); //为程序窗口注册窗口类别
}
2、创建窗口
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd);
3、开启消息循环
MSG msg;
while (GetMessage(&msg, nullptr, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
4、编写消息处理函数
在注册窗口类别时,我们绑定了一个消息处理函数指针。我们需要自行实现窗口消息处理。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
RECT rect;
switch (message)
{
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: 在此处添加使用 hdc 的任何绘图代码...
GetClientRect(hWnd, &rect);
DrawText(hdc, TEXT("Hello, Windows 98!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
当然上面的工作,vs IDE已经自动帮我们完成了,只需要简单理解就行。