【问题标题】:SetCursor doesn't work until mouse moves/clicks (Win32 Api)SetCursor 在鼠标移动/单击之前不起作用(Win32 Api)
【发布时间】:2014-03-08 15:47:02
【问题描述】:

在处理 WM_SETCURSOR windows 消息时,我调用 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;
}

}

【问题讨论】:

  • 也许this question 有帮助。
  • 当您移动鼠标时,Windows 会自动生成 WM_SETCURSOR 消息。毕竟,鼠标位于其他地方,因此可能必须更新光标。因此,如果您“更改光标”,那么您可能希望自己发送 WM_SETCURSOR 而不是等待 Windows 为您完成。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    但是,如果您想控制玩家的 POV(视点),或使用鼠标来控制游戏中的物体(例如飞船飞行轭),那么 RAWMOUSE 数据可为您提供最佳的移动访问权限鼠标,您可以实现自己的算法将其转换为飞行 yoke/POV 运动。

    【讨论】:

      【解决方案3】:

      我在我的应用程序中遇到了类似的问题。我现在还没有找到确切的原因,但是对于这个问题有一个简单的绕过解决方案。使用SetCursorPos函数,它会自动调用光标移动函数。因此,从 SetCursor 函数返回后,获取当前光标位置并再次设置它。下面是示例代码:

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

      【讨论】:

        猜你喜欢
        • 2010-09-15
        • 1970-01-01
        • 1970-01-01
        • 2011-04-12
        • 2015-11-28
        • 1970-01-01
        • 1970-01-01
        • 2013-03-13
        相关资源
        最近更新 更多