在延迟时将鼠标光标隐藏在客户区?

时间:2015-01-25 02:05:09

标签: c winapi user-experience

我正在用C语言编写Windows应用程序。

我通过处理WM_SETCURSOR消息将鼠标光标隐藏在窗口的客户区域中:

    case WM_SETCURSOR:
    {
        static BOOL HideCursor = FALSE;
        if ((LOWORD(LParam) == HTCLIENT) && !HideCursor)
        {
            HideCursor = TRUE;
            ShowCursor(FALSE);
        }
        else if ((LOWORD(LParam) != HTCLIENT) && HideCursor)
        {
            HideCursor = FALSE;
            ShowCursor(TRUE);
        }
        Result = DefWindowProc(Window, Message, WParam, LParam);
        break;
    }

这很好用,但它有点尴尬,因为鼠标光标一进入窗口的客户区就会立即消失。用户很容易忘记鼠标光标所在的位置"例如,当他或她试图将光标移向工具栏按钮,或手动调整窗口大小时。

如何在那里添加一个或两个延迟,以便用户可以将鼠标移动到窗口的客户区域而鼠标不会立即消失,但是如果鼠标光标在客户区域中悬停的时间超过了它会消失吗?

2 个答案:

答案 0 :(得分:5)

当您收到鼠标光标进入窗口的通知时,您可以使用SetTimer(hWnd, ID_MOUSE_TIMER, 2000, NULL)其中hWnd是您的窗口句柄而ID_MOUSE_TIMER是计时器的任意标识符,以创建计时器将在2000毫秒后触发。

然后,您可以像以前一样回复WM_TIMER消息并隐藏光标,但也可以使用KillTimer(hWnd, ID_MOUSE_TIMER)来阻止进一步调用。

当鼠标光标离开你的窗口时,你也应该销毁定时器,并且如果它像之前一样被隐藏,还可以恢复鼠标光标的可见性。

要阅读计时器,请检查MSDN中的相应section

答案 1 :(得分:2)

您可以使用WM_MOUSEHOVER消息。