如何用LoadImage()替代LoadCursor注册默认光标窗口?求等价调用
使用LoadImage替代LoadCursor获取默认箭头光标并注册窗口类
没问题,我来帮你梳理清楚怎么用LoadImage替代LoadCursor获取系统默认箭头光标,以及如何把它用到窗口类注册里。
等价的LoadImage调用
要获取默认箭头光标,对应的LoadImage调用需要指定正确的参数,具体如下:
static_cast<HCURSOR>(LoadImage(nullptr, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_SHARED));
参数说明:
nullptr:表示加载系统自带的资源(而非自定义资源)MAKEINTRESOURCE(IDC_ARROW):把光标标识符转换为资源字符串格式,IDC_ARROW就是默认箭头光标的系统IDIMAGE_CURSOR:指定我们要加载的是光标类型资源0, 0:使用系统默认的光标尺寸,不需要自定义大小LR_SHARED:这个标志很关键,系统光标是共享资源,加上它可以避免重复加载,也不需要我们手动销毁这个光标资源
完整的窗口类注册示例
把上面的LoadImage调用替换原来LoadCursor的位置,就能完成带默认光标的窗口类注册了,以下是完整的示例代码:
#include <windows.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc = {0}; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION); // 用LoadImage替代LoadCursor获取默认箭头光标 wc.hCursor = static_cast<HCURSOR>(LoadImage(nullptr, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_SHARED)); wc.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1); wc.lpszClassName = L"DefaultCursorWindowClass"; if (!RegisterClassEx(&wc)) { MessageBox(nullptr, L"窗口类注册失败!", L"错误提示", MB_ICONEXCLAMATION | MB_OK); return 0; } HWND hwnd = CreateWindowEx( 0, L"DefaultCursorWindowClass", L"带默认光标的窗口", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, nullptr, nullptr, hInstance, nullptr ); if (hwnd == nullptr) { MessageBox(nullptr, L"窗口创建失败!", L"错误提示", MB_ICONEXCLAMATION | MB_OK); return 0; } ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); MSG msg; while (GetMessage(&msg, nullptr, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return static_cast<int>(msg.wParam); } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; }
注意点:
- 必须加上
LR_SHARED标志:如果省略这个标志,系统会为每个调用创建一份光标副本,不仅浪费资源,还需要你手动调用DestroyCursor来释放,而使用共享资源则不需要。 - 类型转换:
LoadImage返回的是HANDLE类型,需要显式转换为HCURSOR才能赋值给WNDCLASSEX的hCursor成员。
内容的提问来源于stack exchange,提问作者cecil
相关产品推荐
相关产品推荐

