SetCursor не работает, пока мышь не двигается / не щелкает (Win32 Api)

При обработке сообщения окна 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;
}

}

2

Решение

Может быть, уже слишком поздно, но в любом случае вот что мне помогло.

Когда я изменил все условия, которые используются для выбора правильного изображения курсора, я отправил следующее:
PostMessage (HWND_Object, WM_SETCURSOR, 0, 0);

Очевидно, что WM_SETCURSOR не вызывался до перемещения мыши, но отправка этого сообщения помогла мне решить эту проблему.

1

Другие решения

Я думаю, что вам нужно приобрести мышь с WM_SETCURSOR в начале программы, и тогда она будет иметь мышь.

RAWMOUSE дает вам логические координаты для мыши на основе собственного разрешения мыши.

То есть вы видите фактическое движение мыши.

Windows будет использовать настройки скорости и ускорения (баллистики) мыши для обновления положения курсора. Поскольку, конечно, они не связаны между собой — очевидное движение мыши должно быть интерпретировано, чтобы генерировать движение курсора, иначе как может поддерживаться более одной мыши?

Если вы хотите управлять указателем, насколько я могу судить, нет причин дублировать вычисления баллистики мыши в Windows. Просто позвольте Windows сделать это. Поэтому для управления указателем вы должны просто использовать WM_MOUSEMOVE. То есть, если вы не хотите отключить настройки ускорения мыши в вашем приложении.

Однако, если вы хотите контролировать POV игрока (точку зрения) или использовать мышь для управления игровым объектом, таким как ярмо полета космического корабля, то данные RAWMOUSE предоставляют вам наилучший доступ к движению мыши. , и вы можете реализовать свой собственный алгоритм, чтобы преобразовать его в полетное ярмо / движение POV.

0

По вопросам рекламы [email protected]