Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Мерцание курсора при его смене

311
10 марта 2009 года
plastictown
309 / / 08.01.2006
История такая. Сделал класс CMyButton производный от CButton, в обработчике WM_MOUSEMOVE положил код:
 
Код:
HCURSOR hCur=::LoadCursor(IDC_MYHAND);
::SetCursor(hCur);


Почему-то при смене курсора заметно неприятное мерцание. Пробовал загружать курсор в конструкторе, а в обработчике только менять, все равно ничего не меняется. Что можно с этим сделать?
Всем спасибо!!!
11
10 марта 2009 года
oxotnik333
2.9K / / 03.08.2007
потому что при сдвиге курсора на единицу (пиксел) каждый раз вызывается LoadCursor. Что бы избежать в том же обработчике перед LoadCursor использовать проверку на текущий, и если он не равен нужному, только тогда загружать.
311
11 марта 2009 года
plastictown
309 / / 08.01.2006
Цитата: oxotnik333
потому что при сдвиге курсора на единицу (пиксел) каждый раз вызывается LoadCursor. Что бы избежать в том же обработчике перед LoadCursor использовать проверку на текущий, и если он не равен нужному, только тогда загружать.



Сравнивать два HCURSOR? Вроде как вот так:

 
Код:
HCURSOR hMyCur=::LoadCursor(. . . );
HCURSOR current=GetCursor();
 
if(!hMyCur==current){
::SetCursor(hMyCur);
}
11
11 марта 2009 года
oxotnik333
2.9K / / 03.08.2007
проще флаг какой нидь завести и менять его при смене курсора, а перед сменой проверять его.
342
11 марта 2009 года
Yos
209 / / 21.06.2003
Проблема тут в другом скорее всего, так как установка курсора работает следующим образом - если по умолчанию для окна (кнопки и тд и тп) установлен курсор (а оно именно так и есть для CButton, даже скорее не для него а для CWnd от которого он порождается те детально - в описании класса (ядра windows) окна эта штука находится) то при перемещении курсора сначала система проверяет какой курсор сейчас установлен, если он не тот что по умолчанию - меняет его и передает управление в вашу функцию которая его снова меняет (появляется ваше видимое мерцание), если он совпадает то ничего не делает и передает так же дальше.

Если по умолчанию для окна курсора нет (в описании класса окна вместо указателя на курсор прописано NULL) - то оставляет прежний (который был до того как курсор попал в это окно) и передает управление дальше. Если Вы при этом меняете его на свой то система его меняет. В случае если происходит повторная смена снова происходит сравнение с тем что сейчас стоит если он тот же ничего не делает иначе меняет.

И все это происходит только тогда, когда есть перемещение мыши (ее захват (точнее освобожденее после него) тоже генерит перемещение)...

Надеюсь понятно.

Так что тут могу посоветовать только одно - сбросить указатель курсора мыши по умолчанию в NULL (залезть в описание класса), но при этом нарушаться курсоры для всех порожденных от него кнопок :)

Я в своих приложениях где это необходимо изначально его не устанавливаю в классе, но я и не пишу на MFC по многим причинам, включая и эту...

PS Кстати если посмотреть исходник MFC то там вместе с SetCursor обычно используется и SetCapture что как побочный эфект блокирует "системную" смену курсора...
341
11 марта 2009 года
Der Meister
874 / / 21.12.2007
WM_SETCURSOR?
311
12 марта 2009 года
plastictown
309 / / 08.01.2006
При компилировании того же кода в 2008-й студии мерцания практически не заметно. Где,между прочим, в 6-й студии взять IDC_HAND? Очень хочется использовать, а в ресурс его класть совсем не хочется.
311
12 марта 2009 года
plastictown
309 / / 08.01.2006
Цитата: Der Meister
WM_SETCURSOR?


Написал так:

 
Код:
OnSetCursor(. . . ){
...
   ::SetCursor(курсор);
   return TRUE;
...
}


Все работает просто замечательно. Спасибо nof и Der Meister!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог