鼠标移动/点击后,SetCursor无效(Win32 Api)

时间:2014-03-08 15:47:03

标签: c++ winapi cursor mouse windows-messages

在处理WM_SETCURSOR窗口消息时,我将SetCursor调用到某个游标。如果我将光标设置为与其不同的东西,它会等待鼠标通过移动或点击来实际设置输入。

有没有办法对此进行计数,因此在光标输入之前,光标在视觉上看起来不会出错?

case WM_SETCURSOR:
    {
        SetCursor( game->GetCursor() ); // Returns m_curCurrent
        return true;
    }
    break;

我还希望在更改时设置光标类型。

在游戏初始化期间:

m_curDefault        = LoadCursor( m_hInstance, MAKEINTRESOURCE( IDC_DEFAULT_CURSOR ));
m_curAttack         = LoadCursor( m_hInstance, MAKEINTRESOURCE( IDC_ATTACK_CURSOR ));
m_curMove           = LoadCursor( m_hInstance, MAKEINTRESOURCE( IDC_MOVE_CURSOR ));
m_curCurrent        = m_curDefault;

设置光标类型

void Game::SetCursorType( CursorTypes curType )
{
switch ( curType )
{
case CGame::DefaultCursor:
    m_curCurrent = m_curDefault;
    break;
case CGame::AttackCursor:
    m_curCurrent = m_curAttack;
    break;
case CGame::MoveCursor:
    m_curCurrent = m_curMove;
    break;
default:
    break;
}

}

3 个答案:

答案 0 :(得分:1)

也许为时已晚,但无论如何,这对我有帮助。

当我更改了用于选择正确光标图像的所有条件时,我发送了以下内容: PostMessage(HWND_Object,WM_SETCURSOR,0,0);

显然在移动鼠标之前没有调用WM_SETCURSOR,但发送此消息帮助我解决了这个问题。

答案 1 :(得分:0)

我认为您需要在程序开始时使用WM_SETCURSOR获取鼠标,然后它将使用鼠标。

RAWMOUSE根据鼠标的原始分辨率为您提供鼠标的逻辑坐标。

也就是说,您可以看到鼠标的实际移动。

Windows将使用鼠标速度和加速度(弹道)设置来更新光标位置。因为当然两者没有联系 - 必须解释鼠标的明显移动以产生光标移动,否则如何支持多个鼠标?

如果您希望控制指针,据我所知,没有理由复制Windows鼠标弹道计算。只是让窗户做到这一点。因此,为了控制指针,您应该只使用WM_MOUSEMOVE。也就是说,除非您希望在应用程序中禁用鼠标加速设置。

但是,如果你想控制玩家的POV(观点),或者使用鼠标来控制游戏中的物体,例如宇宙飞船的飞行轭,那么RAWMOUSE数据可以让你获得最佳的机芯鼠标,你可以实现自己的算法,将其转换为飞行轭/ POV运动。

答案 2 :(得分:0)

我的应用程序中遇到了类似的问题。我现在仍未找到确切的原因,但是有一个解决此问题的简便方法。使用SetCursorPos函数,它将自动调用光标移动功能。因此,获取当前光标位置,然后从SetCursor函数返回后再次进行设置。下面是示例代码:

POINT p;
if (::GetCursorPos(&p))
{
    SetCursorPos(p.x,p.y);
}