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

Rya*_*ies 3 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;
    }
Run Code Online (Sandbox Code Playgroud)

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

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

s.b*_*ara 5

当你通知鼠标光标进入窗口,你可以使用SetTimer(hWnd, ID_MOUSE_TIMER, 2000, NULL)这里hWnd是你的窗口句柄,并ID_MOUSE_TIMER是一个定时器任意标识,创建定时器后,2000毫秒,将触发.

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

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

要阅读计时器,请查看MSDN中的相应部分.