C++:RegisterClassEx()函数
1. 函数功能与定义
在C++的Windows编程中,RegisterClassEx函数用于注册一个窗口类。窗口类定义了窗口的各种属性,如窗口的样式、图标、光标、背景颜色、窗口过程函数等。通过注册窗口类,可以创建具有相同属性的多个窗口。这个函数是Windows API(应用程序编程接口)的一部分,是创建自定义窗口的关键步骤之一。
2. 函数原型及参数解释
ATOM RegisterClassEx(const WNDCLASSEX* lpwcx);
参数说明:
lpwcx(const WNDCLASSEX*类型):这是一个指向WNDCLASSEX结构体的指针。WNDCLASSEX结构体包含了窗口类的所有属性信息,如:
cbSize:结构体大小,必须初始化为sizeof(WNDCLASSEX)。
style:窗口类的样式,例如CS_HREDRAW | CS_VREDRAW表示窗口在水平或垂直方向尺寸改变时重绘。
lpfnWndProc:指向窗口过程函数的指针,这个函数用于处理窗口收到的各种消息,如鼠标消息、键盘消息等。
cbClsExtra和cbWndExtra:分别用于指定为窗口类和窗口实例分配的额外字节数,用于存储自定义数据。
hInstance:应用程序实例句柄,用于加载窗口相关的资源。
hIcon和hIconSm:分别用于指定窗口的大图标和小图标。
hCursor:指定窗口的光标形状。
hbrBackground:指定窗口的背景颜色或背景画刷。
lpszMenuName:指定窗口关联的菜单名称。
lpszClassName:窗口类的名称,用于唯一标识这个窗口类。
3. 返回值
函数返回一个ATOM类型的值。如果注册成功,返回一个唯一标识已注册窗口类的原子值(本质上是一个无符号短整型)。这个值可以用于后续的操作,例如在某些情况下通过这个原子值来引用已注册的窗口类。如果注册失败,函数返回0。可能导致注册失败的原因包括无效的WNDCLASSEX结构体成员设置(如无效的窗口过程函数指针、非法的实例句柄等)或者系统资源不足等情况。
4. 示例代码
以下是一个完整的示例,展示如何使用RegisterClassEx函数注册窗口类:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
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, MAKEINTRESOURCE(IDI_MAINICON));
wcex.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_SMALLICON));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "MyWindowClass";
// 注册窗口类
if (!RegisterClassEx(&wcex))
{
return 0;
}
HWND hWnd = CreateWindow("MyWindowClass", "My Window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}在这个示例中,首先在WinMain函数中填充WNDCLASSEX结构体,设置窗口类的各种属性。然后通过RegisterClassEx(&wcex)函数将这个窗口类注册到系统中。如果注册成功,就可以使用CreateWindow函数基于这个已注册的窗口类创建窗口,并进行后续的显示、更新和消息处理操作。WndProc函数是窗口过程函数,用于处理窗口消息,例如当收到WM_DESTROY消息时,通过PostQuitMessage函数退出消息循环。
C++编程API库
- C++:API(仅展示平时要用的)
- C++:Win32 桌面应用程序
- C++:WinMain()函数
- C++:WNDCLASSEX 窗口类结构体
- C++:LoadIcon()函数
- C++:LoadCursor()函数
- C++:RegisterClassEx()函数
- C++:CreateWindowEx()函数
- C++:ShowWindow()函数
- C++:UpdateWindow()函数
- C++:GetMessage()函数
- C++:MSG 消息结构体
- C++:TranslateMessage()函数
- C++:DispatchMessage()函数
- C++:WndProc()窗口过程函数
- C++:GetModuleHandle()函数
- C++:DestroyWindow()函数
- C++:DefWindowProc()函数
- C++:SendMessage()发送消息函数
- C++:FindWindow()函数
- C++:FindWindowEx()函数
- C++:EnumWindows()函数
- C++:EnumWindowsProc()函数
- C++:GetWindowText()函数
- C++:SetWindowText()函数
- C++:GetDlgltem()取控件句柄函数
- C++:GetDlgCtrllD()取控件ID函数
- C++:GetDlgltemText()取对话框控件文本函数
- C++:SetDlgltemText()设置对话框控件文本函数
- C++:GetDlgltemlnt()取对话框控件整数函数
- C++:SetDlgltemlnt()设置对话框控件的整数值函数
- C++:DialogBox()模态对话框函数
- C++:DialogBoxParam()创建模态对话框函数
- C++:MessageBox()显示消息框函数
- C++:DefDlgProc()对话框过程函数
- C++:MessageBoxIndirect()显示消息框函数
- C++:EndDialog()结束模态对话框函数
- C++:OpenClipboard()打开剪贴板函数
- C++:GetClipboardData()获取剪贴板数据函数
- C++:SetClipboardData()设置剪贴板数据函数
