Подскажите как изменить курсор для конкретного контрола, зная его хендл?
Re: Изменение курсора для конкретного контрола, зная его HWN
От:
Аноним
Дата:
05.09.07 09:56
Оценка:
COD>Подскажите как изменить курсор для конкретного контрола, зная его хендл?
Если это не твой контрол — то никак, т.к. курсор задаётся для целого класса окон, а не для конкретного экземпляра (см. описание структуры WNDCLASS, поле hCursor).
Если твой — тогда необходимо соответствующим образом обрабатывать WM_MOUSEMOVE и дёргать SetCursor(). Также могу посоветовать глянуть в сторону WM_SETCURSOR.
Re[2]: Изменение курсора для конкретного контрола, зная его
Здравствуйте, Аноним, Вы писали:
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
Re[3]: Изменение курсора для конкретного контрола, зная его
Здравствуйте, kero, Вы писали:
K>Здравствуйте, Vacabi, Вы писали:
V>>причем не важно, твой это контрол или нет V>>[...] V>>достаточно обработать WM_SETCURSOR в родительском окне
K>??
Имеется в виду, есть ли возможность изменить реализацию контрола или нет. Например, изменить код Static не представляется возможным, тем не менее курсор над любым static контролом очень легко изменить, обработав WM_SETCURSOR в родительском окне.
Мои ¢2
-- Vacabi
Re[5]: Изменение курсора для конкретного контрола, зная его
Здравствуйте, Vacabi, Вы писали:
V>Имеется в виду, есть ли возможность изменить реализацию контрола или нет. Например, изменить код Static не представляется возможным, тем не менее курсор над любым static контролом очень легко изменить, обработав WM_SETCURSOR в родительском окне.
По-моему, "или нет" означало: контрол — не в вашем приложении, итд
Здравствуйте, kero, Вы писали:
V>>Имеется в виду, есть ли возможность изменить реализацию контрола или нет. Например, изменить код Static не представляется возможным, тем не менее курсор над любым static контролом очень легко изменить, обработав WM_SETCURSOR в родительском окне.
K>По-моему, "или нет" означало: контрол — не в вашем приложении, итд
Вам показалось.
Мои ¢2
-- Vacabi
Re[7]: Изменение курсора для конкретного контрола, зная его
А Вы, оказывается, зануда.
V>>Например, изменить код Static не представляется возможным,
K>SS_NOTIFY + Subclassing
Это все понятно, только это ничего не меняет. Обрабатывать надо WM_SETCURSOR, а не WM_MOUSEMOVE, даже если вы сами имплементируете контрол или субклассируете существующий.
Мои ¢2
-- Vacabi
Re[9]: Изменение курсора для конкретного контрола, зная его