WNDCLASS

    WNDCLASS wndclass;

    wndclass.style 
= CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc 
= WndProc;
    wndclass.cbClsExtra 
= 0;
    wndclass.cbWndExtra 
= 0;
    wndclass.hInstance 
= hInstance;
    wndclass.hIcon 
= LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor 
= LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground 
= (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName 
= NULL;
    wndclass.lpszClassName 
= szAppName;
 
### WNDCLASS 结构体定义及其在 Windows API 中的使用 WNDCLASS 是一个由系统支持的结构,用于存储某一类窗口的信息,例如窗口类样式(ClassStyle)、消息处理函数、图标(Icon)、光标(Cursor)、背景画刷(Brush)等[^1]。WNDCLASS 结构体的具体定义如下: ```c typedef struct tagWNDCLASS { UINT style; // 窗口类的样式 WNDPROC lpfnWndProc; // 指向窗口过程函数的指针 int cbClsExtra; // 每个类实例附加的字节数 int cbWndExtra; // 每个窗口实例附加的字节数 HINSTANCE hInstance; // 应用程序实例句柄 HICON hIcon; // 类关联的图标句柄 HCURSOR hCursor; // 类关联的光标句柄 HBRUSH hbrBackground; // 类关联的背景画刷句柄 LPCSTR lpszMenuName; // 类关联的菜单名称 LPCSTR lpszClassName; // 窗口类的名称 } WNDCLASS, *PWNDCLASS; ``` ### RegisterClass 函数与 WNDCLASS 的关系 `RegisterClass` 函数的作用是将一个窗口类注册到系统中,使得该窗口类可以被用来创建窗口实例[^2]。其函数原型如下: ```c ATOM RegisterClass( CONST WNDCLASS *lpWndClass // 指向 WNDCLASS 结构体的指针 ); ``` 通过 `RegisterClass` 函数,系统会接收一个指向 WNDCLASS 结构体的指针,并将其内容存储起来以供后续使用。一旦窗口类被成功注册,就可以通过 `CreateWindow` 或 `CreateWindowEx` 函数创建基于该窗口类的窗口实例。 ### 使用示例 以下是一个简单的代码示例,展示如何定义 WNDCLASS 结构体并使用 `RegisterClass` 函数进行注册: ```c #include <windows.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { return DefWindowProc(hwnd, msg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASS wc = {0}; wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口类样式 wc.lpfnWndProc = WndProc; // 消息处理函数 wc.cbClsExtra = 0; // 额外类内存 wc.cbWndExtra = 0; // 额外窗口内存 wc.hInstance = hInstance; // 实例句柄 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 默认图标 wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 默认光标 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // 背景颜色 wc.lpszMenuName = NULL; // 菜单名称 wc.lpszClassName = "MyWindowClass"; // 窗口类名称 if (!RegisterClass(&wc)) { // 注册窗口类 MessageBox(NULL, "Window Registration Failed!", "Error", MB_ICONERROR); return 0; } HWND hwnd = CreateWindow("MyWindowClass", "My Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL); if (!hwnd) { // 创建窗口 MessageBox(NULL, "Window Creation Failed!", "Error", MB_ICONERROR); return 0; } ShowWindow(hwnd, nCmdShow); // 显示窗口 UpdateWindow(hwnd); MSG msg = {0}; while (GetMessage(&msg, NULL, 0, 0)) { // 消息循环 TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } ``` ### WNDCLASS 的扩展版本:WNDCLASSEX 除了 WNDCLASS,Windows API 还提供了一个扩展版本的结构体 `WNDCLASSEX`,它比 WNDCLASS 多了一个字段 `cbSize` 和一个字段 `hIconSm`(小图标句柄)。如果需要更复杂的窗口类定义,可以使用 `RegisterClassEx` 函数来注册 `WNDCLASSEX`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值