VC 鼠标消息WM_SETCURSOR

VC 鼠标消息WM_SETCURSOR  

OnSetCursor由消息   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.

看清楚了,只要鼠标移动OnMouseMOve就会自动发送 WM_SETCURSOR从而触发OnSetCursor,因此在设计改变鼠标指针的程序时,一般不要在OnMouseMOve事件中调用SetCursor,容易引起指针闪烁。设置鼠标指针形状合理的方法是:
    在OnMouseMove中使用一个变量记住各矩形crect中的鼠标形状,然后在OnSetCursor调用SetCursor设置鼠标

        一直对这个消息比较迷惑,最近处理一个问题更是让我迷惑,我在一个函数中处理将鼠标变成一个自定义的bitmap,但是当我按下鼠标左键或者右键的时候,发现光标又变成了默认的箭头形,让我百思不得其解。

        最后在网上查到这么一句话:This   message   is   sent   to   a   window   if   the   mouse   causes   the   cursor   to   move   within   a   window   and   mouse   input   is   not   captured.意思是:当鼠标移入窗口或者有鼠标消息输入并且没有被捕获处理的时候,会发送这个消息给窗口。这个消息会调用默认的消息处理函 数:OnSetCursor。这个消息处理函数最终调用:CView::OnSetCursor(pWnd, nHitTest, message);这个函数最终会把光标设置为系统默认光标。显然问题就出在这里。

        那么我重载这个函数,直接return行不行呢?试验了一下,不管鼠标左右按键怎么按,都没有改变,貌似可以了。可是后来发现新的问题:当鼠标从窗口外边移入的时候,光标没有变成自己想要的,而是保持了在外部的形状——除非再次改变光标。

        经过仔细思考发现问题原因:鼠标移到外边之后,被改为另外一个窗口的鼠标了,系统记录的最后鼠标是外边设置的。所以回来之后还要重新设置。那么在OnSetCursor这个函数中不能直接return TRUE;还要在return之前设置一下:

………………

 m_hCursor = LoadCursor(NULL,IDC_IBEAM);
 SetCursor(m_hCursor);

………………

BOOL COpenGL_testView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
 SetCursor(m_hCursor);
 return TRUE;
}

OK!问题解决。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值