HCURSOR hCur=::LoadCursor(IDC_MYHAND);
::SetCursor(hCur);
Мерцание курсора при его смене
Код:
Почему-то при смене курсора заметно неприятное мерцание. Пробовал загружать курсор в конструкторе, а в обработчике только менять, все равно ничего не меняется. Что можно с этим сделать?
Всем спасибо!!!
потому что при сдвиге курсора на единицу (пиксел) каждый раз вызывается LoadCursor. Что бы избежать в том же обработчике перед LoadCursor использовать проверку на текущий, и если он не равен нужному, только тогда загружать.
Цитата: oxotnik333
потому что при сдвиге курсора на единицу (пиксел) каждый раз вызывается LoadCursor. Что бы избежать в том же обработчике перед LoadCursor использовать проверку на текущий, и если он не равен нужному, только тогда загружать.
Сравнивать два HCURSOR? Вроде как вот так:
Код:
HCURSOR hMyCur=::LoadCursor(. . . );
HCURSOR current=GetCursor();
if(!hMyCur==current){
::SetCursor(hMyCur);
}
HCURSOR current=GetCursor();
if(!hMyCur==current){
::SetCursor(hMyCur);
}
проще флаг какой нидь завести и менять его при смене курсора, а перед сменой проверять его.
Если по умолчанию для окна курсора нет (в описании класса окна вместо указателя на курсор прописано NULL) - то оставляет прежний (который был до того как курсор попал в это окно) и передает управление дальше. Если Вы при этом меняете его на свой то система его меняет. В случае если происходит повторная смена снова происходит сравнение с тем что сейчас стоит если он тот же ничего не делает иначе меняет.
И все это происходит только тогда, когда есть перемещение мыши (ее захват (точнее освобожденее после него) тоже генерит перемещение)...
Надеюсь понятно.
Так что тут могу посоветовать только одно - сбросить указатель курсора мыши по умолчанию в NULL (залезть в описание класса), но при этом нарушаться курсоры для всех порожденных от него кнопок :)
Я в своих приложениях где это необходимо изначально его не устанавливаю в классе, но я и не пишу на MFC по многим причинам, включая и эту...
PS Кстати если посмотреть исходник MFC то там вместе с SetCursor обычно используется и SetCapture что как побочный эфект блокирует "системную" смену курсора...
WM_SETCURSOR?
При компилировании того же кода в 2008-й студии мерцания практически не заметно. Где,между прочим, в 6-й студии взять IDC_HAND? Очень хочется использовать, а в ресурс его класть совсем не хочется.
Цитата: Der Meister
WM_SETCURSOR?
Написал так:
Код:
OnSetCursor(. . . ){
...
::SetCursor(курсор);
return TRUE;
...
}
...
::SetCursor(курсор);
return TRUE;
...
}
Все работает просто замечательно. Спасибо nof и Der Meister!