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