Проблема с захватом левой кнопки мыши при использовании WM_NCHITTEST - PullRequest
1 голос
/ 26 мая 2019
case WM_NCHITTEST:  { 
     LRESULT hit = DefWindowProc( hWnd, uMsg, wParam, lParam ); 

        if ( hit == HTCLIENT ) { 
            hit = HTCAPTION; 
            SendNotifyMessageA( hWnd, WM_MOUSEMOVE, NULL, MAKELPARAM( LOWORD(lParam), HIWORD(lParam) ) );
            pts.x = pts.y = 0;
            ClientToScreen( hWnd, &pts );
            SendNotifyMessageA( hWnd, WM_EXITSIZEMOVE, NULL,NULL );
            return hit;
        }   } break; 
case WM_NCLBUTTONDOWN: { LMB_Dyn[h2] = true;  } break;

Я использую этот код, когда пытаюсь переместить окно, щелкая в области клиента (в любом месте окна). Это отлично работает. Но у меня есть проблема с правильным получением состояния левой кнопки мыши, и хотя этот код работает, проблема в том, что когда я делаю простой щелчок вместо «щелчка и перемещения», переменная LMB_Dyn (левая кнопка мыши) имеет некоторые задержка (не сразу получаю уведомление, что я нажал кнопку мыши.

Как правильно получить состояние левой кнопки мыши при использовании WM_NCHITTEST?

1 Ответ

2 голосов
/ 26 мая 2019

Ошибка: } } break; следует читать } return hit; }

Однако, здесь происходит нечто более радикальное. WM_NCHITTEST не предназначен для такого использования и может вызываться с координатами, отличными от текущей позиции мыши. Это означает, что ваш SendNotifyMessageA может отправлять мусор.

Я вижу, у вас есть обработчик для WM_NCLBUTTONDOWN. Может быть, это все, что вам нужно. Или, если вы пытаетесь сделать окно перетаскиваемым где-либо на нем, это должно выглядеть примерно так:

case WM_NCHITTEST:  {
    LRESULT hit = DefWindowProc( hWnd, uMsg, wParam, lParam );
    if ( hit == HTCLIENT ) { 
        return HTCAPTION;
    }
    return hit;
}

В документации для WM_NCLBUTTONDOWN и WM_NCLBUTTONUP говорится, что они стреляют немедленно. Очень легко забыть ваш вызов InvalidateRect, поэтому ваш экран не будет перерисован, поэтому он выглядит медленным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...