Всем доброго времени суток. Хочу изменить вид курсора с помощью windows.h. Вообщем когда курсор над зданием - он в виде HAND, но стоит немного изменить координаты в пределах спрайта - курсор начинает моргать, а если убрать курсор со спрайта (где он получал значения HAND), то курсор тутже меняется на деволтную стрелку. Такое чувство, что HGE сам постоянно обновляет курсор. Подскажите пожалуйста как грамотно можно изменить вид курсора.
Ну как бы отрисовкой курсора занимается сама ОСь. Я бы нарисовал (ну или взял где-нить :)) нужные картинки курсоров, скрыл стандартный курсор, а потом просто получал координаты курсора и рисовал там нужную картинку. Так будет лучше, чем использовать стандартные курсоры (курсор руки ужасен :))
Текущий видимый курсор устанавливается командой SetCursor (HCURSOR) При движении мыши винда посылает программе сообщение WM_CURSOR кажется такое, и там спрашивает чо какой новый курсор. Можно на это сообщение не отвечать, винда тогда сама выставляет курсор, заданный в классе окна (GetClassLong, SetClassLong). Поскольку у тебя там всё ещё стрелка, при движении мыши, курсор моментально меняется обратно на стрелку.
Таким образом, пара команд SetCursor и SetClassLong должны вместе дать нужный надёжный результат.
Он и будет моргать, т.к. в сообщении WM_SETCURSOR движок его восстанавливает. Я просто изменил исходники hge. И легко из проги меняю курсор передавая в добавленное свойство хэндл нужного курсора.
case WM_SETCURSOR: if(pHGE->bHideMouse){//для старых приложенйи отсавляем старый код. if(pHGE->bActive && LOWORD(lparam)==HTCLIENT && pHGE->bHideMouse) SetCursor(NULL); else SetCursor(LoadCursor(NULL, IDC_ARROW)); return FALSE; }else{ if(pHGE->bActive && (LOWORD(lparam)==HTCLIENT)){ //курсор на клиентской области и окно активно. SetCursor(pHGE->hcMySysCursorHandle); return TRUE; //было FALSE, но в попкап двиге труе стоит. Доверимся что именно так. }else{ break;//курсор вне клиентского окна, или окно неактивно, то пусть винда сама решает чо рисовать. } }
Если тоже так сделаете, то не забудьте еще в hge исходниках добавить свойство, и инициализирвоать его в HGE_Impl::HGE_Impl() стандартным курсором.