Visual C++——设置光标Cursor

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

https://blog.csdn.net/zengweicdut/article/details/8681818

发布了1422 篇原创文章 · 获赞 257 · 访问量 40万+

猜你喜欢

转载自blog.csdn.net/weixin_43272781/article/details/104649934