Я создал окно без полей, которое использует wndProc()
функция, которая заставляет WM_NCHITTEST case
возвращать HTCAPTION;
, который позволяет пользователю перетаскивать окно, независимо от того, где находится его курсор.
Проблема в том, что я установил пользовательский курсор, но с помощью вышеупомянутого метода курсор всегда возвращается IDC_ARROW
,
Как это исправить?
РЕДАКТИРОВАТЬ: я также пытался использовать SetCursor()
в WM_NCHITTEST case
, но это не сработало.
Вы можете использовать сообщение 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));
В дополнение к SetCursor
в WM_NCHITTEST
пробовать SetCursor
в WM_SETCURSOR
тоже.
Обычно правильный способ установить курсор — сделать это в ответ на WM_SETCURSOR
сообщение. (Также см http://blogs.msdn.com/b/oldnewthing/archive/2005/05/25/421707.aspx )
Тем не менее, если вы обрабатываете перетаскивание мыши, где мышь захвачена, ваше окно не будет получать WM_SETCURSOR
сообщения, и я думаю, что единственная альтернатива, это установить курсор в WM_MOUSEMOVE
обработчик для этого случая.