API
LoadCursor:第一个参数是要载入光标的程序的实例,当使用系统预定义光标的时候,要设置为空。当要使用自定义光标的时候,设置为AfxGetInstanceHandle()。
更换LoadCursor中的第二个参数,就能得到不同的系统预定义光标。
光标Cursor类型
IDC_APPSTARTING 标准的箭头和小沙漏
IDC_ARROW 标准的箭头
IDC_CROSS 十字光标
IDC_HELP 标准的箭头和问号
IDC_IBEAM 工字光标
IDC_NO 禁止圈
IDC_SIZEALL 四向箭头指向东、西、南、北
IDC_SIZENESW 双箭头指向东北和西南
IDC_SIZENS 双箭头指向南北
IDC_SIZENWSE 双箭头指向西北和东南
IDC_SIZEWE 双箭头指向东西
IDC_UPARROW 垂直箭头
IDC_WAIT 沙漏
解决方案
方法一:创建时设置
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
方法二:使用SetCursor设置
SetCursor(LoadCursor(NULL,IDC_HAND));
注:建议在WM_SETCURSOR消息响应函数中设置,可以在别的地方设置,但是需要自己控制光标的变化。
方法三:重载消息函数WM_SETCURSOR
BOOL CXXX...::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if(m_bTransforming) //设置更改光标的标志
{
SetCursor(m_hCursor); //调用
return TRUE; //必须返回否则看不到效果
}
return CDialog::OnSetCursor(pWnd, nHitTest, message); //系统默认
}
什么时候系统会发送设置光标消息:WM_SETCURSOR
原文的定义:The WM_SETCURSOR message is sent to a window if the mouse causes the cursor to move within a window and mouse input is not captured。
只要鼠标事件发生就会自动发送 WM_SETCURSOR从而触发OnSetCursor。你可以再鼠标按下的函数中使用SetCursor来设置一个光标,你会发现光标确实改变了。但是只要你移动鼠标,或者放开鼠标,光标就变回去了。
参考文章
https://blog.csdn.net/pipi0714/article/details/36426335
https://www.cnblogs.com/leexuzhi/archive/2012/02/23/2365608.html