Здравствуйте, Аноним, Вы писали:
COD>>Подскажите как изменить курсор для конкретного контрола, зная его хендл?
А>Если это не твой контрол — то никак, т.к. курсор задаётся для целого класса окон, а не для конкретного экземпляра (см. описание структуры WNDCLASS, поле hCursor).
А>Если твой — тогда необходимо соответствующим образом обрабатывать WM_MOUSEMOVE и дёргать SetCursor(). Также могу посоветовать глянуть в сторону WM_SETCURSOR.
Не надо обрабатывать WM_MOUSEMOVE, надо обрабатывать WM_SETCURSOR, причем не важно, твой это контрол или нет. Форма курсора выбирается так:
a) окну под курсором (контролу) посылается WM_SETCURSOR. Если окно обрабатывает сообщение, то устанавливается соответствующий курсор и больше ничего не происходит.
б) если же окно не обработало сообщение, то WM_SETCURSOR посылается его родителькому окну. Опять же, если родительское окно обработало сообщение, ничего больше не происходит.
в) если же и родительское окно не обработало WM_SETCURSOR, тогда DefWindowProc устанавливает курсор зарегистрированный в классе окна.
Таким образом, как правило сменить форму курсора для контрола очень просто: достаточно обработать WM_SETCURSOR в родительском окне. Никаких изменений в коде самого контрола для этого не нужно:
// в диалоговой или оконной процедуре родительского окна
case WM_SETCURSOR:
if ((HWND)wParam == hWndControl)
{
SetCursor(LoadCursor(NULL, IDC_HAND));
return TRUE; // обработано
}
break; // не обработано