设置光标图像
光标是显示鼠标或其他指针设备位置的小图像。 许多应用程序会更改光标图像以向用户提供反馈。 尽管这不是必需的,但它为应用程序增添了一些精美的功能。
Windows 提供一组标准游标图像,称为 系统游标。 这些包括箭头,手,I型梁,沙漏 (,这是一个旋转的圆) ,等等。 本部分介绍如何使用系统游标。 有关更高级的任务(例如创建自定义游标),请参阅 游标。
可以通过设置 WNDCLASS 或 WNDCLASSEX 结构的 hCursor 成员,将游标与窗口类相关联。 否则,默认光标为箭头。 当鼠标在窗口上移动时,窗口会收到 (WM_SETCURSOR 消息,除非另一个窗口捕获了鼠标) 。 此时,会发生以下事件之一:
- 应用程序设置游标,窗口过程返回 TRUE。
- 应用程序不执行任何操作,并将 WM_SETCURSOR 传递给 DefWindowProc。
若要设置光标,程序将执行以下操作:
- 调用 LoadCursor 将光标加载到内存中。 此函数返回游标的句柄。
- 调用 SetCursor 并传入游标句柄。
否则,如果应用程序将 WM_SETCURSOR 传递给 DefWindowProc, 则 DefWindowProc 函数使用以下算法来设置游标图像:
- 如果窗口具有父级,请将 WM_SETCURSOR 消息转发给父级进行处理。
- 否则,如果窗口具有类游标,请将光标设置为类游标。
- 如果没有类游标,请将光标设置为箭头光标。
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 为非工作区设置光标。