设置光标图像

光标是显示鼠标或其他指针设备位置的小图像。 许多应用程序会更改光标图像以向用户提供反馈。 尽管这不是必需的,但它为应用程序增添了一些精美的功能。

Windows 提供一组标准游标图像,称为 系统游标。 这些包括箭头,手,I型梁,沙漏 (,这是一个旋转的圆) ,等等。 本部分介绍如何使用系统游标。 有关更高级的任务(例如创建自定义游标),请参阅 游标

可以通过设置 WNDCLASS 或 WNDCLASSEX 结构的 hCursor 成员,将游标与窗口类相关联。 否则,默认光标为箭头。 当鼠标在窗口上移动时,窗口会收到 (WM_SETCURSOR 消息,除非另一个窗口捕获了鼠标) 。 此时,会发生以下事件之一:

  • 应用程序设置游标,窗口过程返回 TRUE
  • 应用程序不执行任何操作,并将 WM_SETCURSOR 传递给 DefWindowProc

若要设置光标,程序将执行以下操作:

  1. 调用 LoadCursor 将光标加载到内存中。 此函数返回游标的句柄。
  2. 调用 SetCursor 并传入游标句柄。

否则,如果应用程序将 WM_SETCURSOR 传递给 DefWindowProc则 DefWindowProc 函数使用以下算法来设置游标图像:

  1. 如果窗口具有父级,请将 WM_SETCURSOR 消息转发给父级进行处理。
  2. 否则,如果窗口具有类游标,请将光标设置为类游标。
  3. 如果没有类游标,请将光标设置为箭头光标。

LoadCursor 函数可以从资源或系统游标之一加载自定义游标。 以下示例演示如何将游标设置为预定义的系统链接选择游标。

    LPCTSTR cursor = IDC_HAND;
    hCursor = LoadCursor(NULL, cursor);
    SetCursor(hCursor);

如果更改光标,则光标图像在下一次鼠标移动时会重置,除非截获 WM_SETCURSOR 消息并再次设置光标。 以下代码演示如何处理 WM_SETCURSOR

    case WM_SETCURSOR:
        if (LOWORD(lParam) == HTCLIENT)
        {
            SetCursor(hCursor);
            return TRUE;
        }
        break;

此代码首先检查 lParam 的低 16 位。 如果 LOWORD(lParam) 等于 HTCLIENT,则表示光标位于窗口的工作区上方。 否则,光标位于非工作区上。 通常,应仅设置工作区的光标,让 Windows 为非工作区设置光标。

下一步

用户输入:扩展示例