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!问题解决。