3-7 创建窗口四部曲

创建窗口四部曲

  • 设计窗口类
  • 注册窗口类
  • 创建窗口类

  • 显示和更新

3.7.1 窗口类的设计

1.窗口类
typedef struct tagWNDCLASSEXW {
UINT cbSize;
/* Win 3.x */
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
/* Win 4.0 */
HICON hIconSm;
} WNDCLASSEXW, *PWNDCLASSEXW, NEAR *NPWNDCLASSEXW, FAR *LPWNDCLASSEXW;
2.使用
WNDCLASSEX wndClass = {
sizeof(WNDCLASSEX),
CS_HREDRAW | CS_VREDRAW,
WndProc,
0L,
0L,
hInstance, (HICON)::LoadImage(NULL,_T("icon.ico"),
IMAGE_ICON,0,0, LR_DEFAULTSIZE | LR_LOADFROMFILE) ,
LoadCursor(NULL, IDC_ARROW),
(HBRUSH)GetStockObject(GRAY_BRUSH),
NULL,
_T("EorTheDreamOfGameDevelop"),
NULL
};

3.7.2 窗口类的注册

RegisterClassEx(&wndClass);

3.7.3 窗口的创建

HWND CreateWindowW(
[in, optional] lpClassName, //窗口类的名称
[in, optional] lpWindowName, //窗口的名称
[in] dwStyle, //窗口的样式
[in] x, //水平位置,可取默认值
[in] y, //竖直位置,可取默认值
[in] nWidth, //窗口宽度
[in] nHeight, //窗口高度
[in, optional] hWndParent, //父窗口句柄
[in, optional] hMenu, //菜单的资源句柄
[in, optional] hInstance, //所属的应用程序实例的句柄
[in, optional] lpParam //创建的附加消息的指针
);

//example
hWnd = CreateWindow( // 创建一个窗口实例,并返回其句柄
_T("ForTheDreamOfGameDevelop"), // 窗口类名称(必须与注册时一致)
_T("致我们永不熄灭的游戏开发梦想"), // 窗口标题
WS_OVERLAPPEDWINDOW | WS_VISIBLE, // 窗口样式(可重叠、可见)
CW_USEDEFAULT, CW_USEDEFAULT, // 初始位置(默认)
CW_USEDEFAULT, CW_USEDEFAULT, // 初始大小(默认)
NULL, NULL, hInstance, NULL); // 其他参数(无父窗、无菜单、应用程序实例、无额外数据)

3.7.4 窗口的显示和更新

1.改变窗口位置和大小
BOOL MoveWindow(
[in] HWND hWnd,
[in] int X,
[in] int Y,
[in] int nWidth,
[in] int nHeight,
[in] BOOL bRepaint
);

//example
MoveWindow(hWnd, 200, 50, 800, 600, true);
2.显示窗口
BOOL ShowWindow(
[in] HWND hWnd,
[in] int nCmdShow
);

//example
ShowWindow(hWnd, nShowCmd);
3.更新窗口
BOOL UpdateWindow(
[in] HWND hWnd
);

//example
UpdateWindow(hWnd);

3.7.5 综合使用

#include <windows.h>

// 窗口过程函数,处理窗口消息
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY: // 当窗口被关闭时,发送WM_QUIT消息结束程序
PostQuitMessage(0);
break;
default: // 对于其他消息,调用默认窗口过程
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// 主函数,创建并显示窗口
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// 定义一个窗口类结构
WNDCLASSEX 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, IDI_APPLICATION); // 窗口图标句柄
wcex.hCursor = LoadCursor(NULL, IDC_ARROW); // 窗口光标句柄
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 窗口背景画刷句柄
wcex.lpszMenuName = NULL; // 菜单资源名称或ID(无菜单)
wcex.lpszClassName = L"HelloWindow"; // 窗口类名称(自定义)
wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION); // 小图标句柄

if (!RegisterClassEx(&wcex)) { // 注册窗口类失败则退出程序
MessageBox(NULL,
L"Call to RegisterClassEx failed!",
L"Win32 Guided Tour",
NULL);

return 1;
}

HWND hWnd; // 定义一个窗口句柄变量

hWnd = CreateWindow( // 创建一个窗口实例,并返回其句柄
L"HelloWindow", // 窗口类名称(必须与注册时一致)
L"Hello World!", // 窗口标题
WS_OVERLAPPEDWINDOW | WS_VISIBLE, // 窗口样式(可重叠、可见)
CW_USEDEFAULT, CW_USEDEFAULT, // 初始位置(默认)
CW_USEDEFAULT, CW_USEDEFAULT, // 初始大小(默认)
NULL, NULL, hInstance, NULL);// 其他参数(无父窗、无菜单、应用程序实例、无额外数据)

if (!hWnd) { // 创建窗口失败则退出程序
MessageBox(NULL,
L"Call to CreateWindow failed!",
L"Win32 Guided Tour",
NULL);

return 1;
}

ShowWindow(hWnd, nCmdShow);
}
/*
源: 与必应的对话, 2023/3/6(1) windows下控制台程序实现窗口显示 - ChrisZZ - 博客园. https://www.cnblogs.com/zjutzz/p/10806955.html 访问时间 2023/3/6.
(2) Windows程序设计/win32:窗口的基本代码模板_windows窗体项目模板_return 1010的博客-CSDN博客. https://blog.csdn.net/hbllll1/article/details/115681013 访问时间 2023/3/6.
(3) WIN32 窗口以及模态弹窗创建显示_不会写代码的丝丽的博客-CSDN博客. https://blog.csdn.net/qfanmingyiq/article/details/109540508 访问时间 2023/3/6.
*/