Изменение курсора для конкретного контрола, зная его HWND
От: CODeRUS  
Дата: 05.09.07 09:48
Оценка:
Подскажите как изменить курсор для конкретного контрола, зная его хендл?
Re: Изменение курсора для конкретного контрола, зная его HWN
От: Аноним  
Дата: 05.09.07 09:56
Оценка:
COD>Подскажите как изменить курсор для конкретного контрола, зная его хендл?

Если это не твой контрол — то никак, т.к. курсор задаётся для целого класса окон, а не для конкретного экземпляра (см. описание структуры WNDCLASS, поле hCursor).

Если твой — тогда необходимо соответствующим образом обрабатывать WM_MOUSEMOVE и дёргать SetCursor(). Также могу посоветовать глянуть в сторону WM_SETCURSOR.
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
Re[3]: Изменение курсора для конкретного контрола, зная его
От: kero Россия  
Дата: 09.09.07 04:13
Оценка:
Здравствуйте, Vacabi, Вы писали:

V>причем не важно, твой это контрол или нет

V>[...]
V>достаточно обработать WM_SETCURSOR в родительском окне

??
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[4]: Изменение курсора для конкретного контрола, зная его
От: Vacabi  
Дата: 09.09.07 04:24
Оценка:
Здравствуйте, kero, Вы писали:

K>Здравствуйте, Vacabi, Вы писали:


V>>причем не важно, твой это контрол или нет

V>>[...]
V>>достаточно обработать WM_SETCURSOR в родительском окне

K>??


Имеется в виду, есть ли возможность изменить реализацию контрола или нет. Например, изменить код Static не представляется возможным, тем не менее курсор над любым static контролом очень легко изменить, обработав WM_SETCURSOR в родительском окне.
Мои ¢2
-- Vacabi
Re[5]: Изменение курсора для конкретного контрола, зная его
От: kero Россия  
Дата: 09.09.07 04:38
Оценка:
Здравствуйте, Vacabi, Вы писали:

V>Имеется в виду, есть ли возможность изменить реализацию контрола или нет. Например, изменить код Static не представляется возможным, тем не менее курсор над любым static контролом очень легко изменить, обработав WM_SETCURSOR в родительском окне.


По-моему, "или нет" означало: контрол — не в вашем приложении, итд
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[6]: Изменение курсора для конкретного контрола, зная его
От: Vacabi  
Дата: 09.09.07 04:47
Оценка:
Здравствуйте, kero, Вы писали:

V>>Имеется в виду, есть ли возможность изменить реализацию контрола или нет. Например, изменить код Static не представляется возможным, тем не менее курсор над любым static контролом очень легко изменить, обработав WM_SETCURSOR в родительском окне.


K>По-моему, "или нет" означало: контрол — не в вашем приложении, итд


Вам показалось.
Мои ¢2
-- Vacabi
Re[7]: Изменение курсора для конкретного контрола, зная его
От: kero Россия  
Дата: 09.09.07 05:14
Оценка:
Здравствуйте, Vacabi, Вы писали:

И еще:

V>Например, изменить код Static не представляется возможным,


SS_NOTIFY + Subclassing

V>тем не менее курсор над любым static контролом очень легко изменить, обработав WM_SETCURSOR в родительском окне.
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[8]: Изменение курсора для конкретного контрола, зная его
От: Vacabi  
Дата: 09.09.07 05:27
Оценка:
Здравствуйте, kero, Вы писали:

K>И еще:


А Вы, оказывается, зануда.

V>>Например, изменить код Static не представляется возможным,


K>SS_NOTIFY + Subclassing


Это все понятно, только это ничего не меняет. Обрабатывать надо WM_SETCURSOR, а не WM_MOUSEMOVE, даже если вы сами имплементируете контрол или субклассируете существующий.
Мои ¢2
-- Vacabi
Re[9]: Изменение курсора для конкретного контрола, зная его
От: kero Россия  
Дата: 09.09.07 06:09
Оценка:
V>А Вы, оказывается, зануда.

Фи
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.