Принуждение WM_NCHITTEST к возврату HTCAPTION с пользовательским курсором ..?

Я создал окно без полей, которое использует wndProc() функция, которая заставляет WM_NCHITTEST case возвращать HTCAPTION;, который позволяет пользователю перетаскивать окно, независимо от того, где находится его курсор.
Проблема в том, что я установил пользовательский курсор, но с помощью вышеупомянутого метода курсор всегда возвращается IDC_ARROW,
Как это исправить?

РЕДАКТИРОВАТЬ: я также пытался использовать SetCursor() в WM_NCHITTEST case, но это не сработало.

2

Решение

Вы можете использовать сообщение WM_SETCURSOR, чтобы переопределить курсор. LOWORD lParam указывает код проверки попадания, который вы изменили с помощью обработчика WM_NCHITTEST. Это сработало хорошо:

static HCURSOR CustomCursor;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_NCHITTEST: {
LRESULT result = DefWindowProc(hWnd, message, wParam, lParam);
if (result == HTCLIENT) result = HTCAPTION;
return result;
}
case WM_SETCURSOR:
if (LOWORD(lParam) == HTCAPTION) {
SetCursor(CustomCursor);
return TRUE;
}
return DefWindowProc(hWnd, message, wParam, lParam);
// etc...
}

Инициализируйте CustomCursor в вашем окне init. Сказать:

CustomCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_SIZEALL));
2

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

В дополнение к SetCursor в WM_NCHITTEST пробовать SetCursor в WM_SETCURSOR тоже.

0

Обычно правильный способ установить курсор — сделать это в ответ на WM_SETCURSOR сообщение. (Также см http://blogs.msdn.com/b/oldnewthing/archive/2005/05/25/421707.aspx )

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

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector