Re[2]: Изменение курсора для конкретного контрола, зная его
От: Vacabi  
Дата: 05.09.07 16:23
Оценка:
Здравствуйте, Аноним, Вы писали:

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;  // не обработано
Мои ¢2
-- Vacabi
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.