You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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就是默认箭头光标的系统ID
  • IMAGE_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:49:44