Решил изменить каретку в редакторе MS Visual C++ 6.0 (msdev.exe). Она у них только одна - вертикальная линия в режимах INS (insert) и OVR (overtype); так что не видно когда что. Изменить каретку удалось - теперь в режиме INS она становиться горизонтальной линией под буквой, а в режиме OVR она становиться прямоугольным блоком. Одна проблема - каретку не перерисовываеться при нажатие кнопки INSERT (в оригинальной версии её перерисовывать и не надо, но в нашем случае надо). Пробывал всё - InvalidateRect+UpdateWindow, SendMessage(WM_SIZE), ShowWindow(SW_HIDE/SW_SHOW), но не что не помогает. Под скажите как дальше пойти по этому поводу.
Пробовал, но не это не то. Нужно заставить программу пересоздать каретку через СВОЙ код CreateCaret. Я пробовал вот это: Код (Text): devedit_86E80: ; called by 508072BA (82BA) push ebx push ebp call @F @@: pop ebp sub ebp,$85E80 + $5 + $1 + $1 mov eax,[esp+8] cmp eax,[ebp+vaOvertype] je .noredraw mov byte [$400000 + $2000 + $1080],1 ; get handle to edit control, and save it to ebx call dword [ebp+GetFocus] mov ebx,eax stdcall dword [ebp+EnableWindow],ebx,0 stdcall dword [ebp+EnableWindow],ebx,1 stdcall dword [ebp+SetFocus],ebx mov byte [$400000 + $2000 + $1080],0 .noredraw: pop ebp pop ebx mov eax,[esp+8] push dword [esp] mov [esp+4],eax retn Тоесть серия DisableWindow+EnableWindow. Это заставляет его перерисоваться и пересоздать каретку. Увы, работает не правильно - каретка создаетса не та (наоборот). Я поставил "toggle" флаг ($400000 + $2000 + $1080), всё работает окей только мелкие сбивания в позицие кареткы опять
http://rapidshare.de/files/9824282/DEVEDIT.ZIP.html backup старый DEVEDIT.PKG и распаковываем архив в C:\Program Files\Mirosoft Visual Studio\Common\MSDev98\Bin
Прошу помошь от всех кто часто работает в среде VC6, и кого сильно бесит его вечно вертикальная каретка. Уже второй день с этим вожусь!
comrade Лишнее Нет. Обычно каретка создаётся по получении WM_SETFOCUS и убивается по WM_KILLFOCUS. Enable + Disable тут ничего не дают. Тем не менее, если фокус и так в окне (его вернул GetFocus), то слать SetFocus тому же окну нет смысла. Тут можно либо послать WM_KILLFOCUS и сразу WM_SETFOCUS, либо дать SetFocus на другое окно, а потом восстановить. Итак, мой вариант: Код (Text): ; get handle to edit control, and save it to ebx call dword [ebp+GetFocus] mov ebx,eax stdcall dword [ebp+SendMessage],ebx,WM_KILLFOCUS,0,0 stdcall dword [ebp+SendMessage],ebx,WM_SETFOCUS,0,0
WM_KILLFOCUS+WM_SETFOCUS не помогли. Я сделал так: Код (Text): devedit_86E80: ; called by 508072BA (82BA) push ebx push ebp call @F @@: pop ebp sub ebp,$85E80 + $5 + $1 + $1 mov eax,[esp+8] cmp eax,[ebp+vaOvertype] je .noredraw stdcall dword [ebp+GetAsyncKeyState],VK_INSERT and eax,1 push eax xor [ebp+vaOvertype],eax ; get handle to edit control, and save it to ebx call dword [ebp+GetFocus] mov ebx,eax stdcall dword [ebp+EnableWindow],ebx,0 stdcall dword [ebp+EnableWindow],ebx,1 stdcall dword [ebp+SetFocus],ebx pop eax xor [ebp+vaOvertype],eax .noredraw: pop ebp pop ebx mov eax,[esp+8] push dword [esp] mov [esp+4],eax retn Через 屁股... но работает =)
Только файл: http://rapidshare.de/files/9826420/DEVEDIT.rar.html Весь package + IDA databases: http://rapidshare.de/files/9826518/msdevcrt.rar.html
Вот так теперь: Код (Text): devedit_86E80: ; called by 508072BA (82BA) push ebx push ebp call @F @@: pop ebp sub ebp,$85E80 + $5 + $1 + $1 ; redraw only if new settings differ from current ones mov eax,[esp+8] cmp eax,[ebp+vaOvertype] je .noredraw ; make sure we don't go into an infinite loop cmp dword [vaLock],0 ja .noredraw inc dword [vaLock] ; change caret if user pressed Insert key stdcall dword [ebp+GetAsyncKeyState],VK_INSERT and eax,1 push eax xor [ebp+vaOvertype],eax ; get handle to edit control call dword [ebp+GetFocus] mov ebx,eax ; disabling/enabling window causes caret to refresh stdcall dword [ebp+EnableWindow],ebx,0 stdcall dword [ebp+EnableWindow],ebx,1 stdcall dword [ebp+SetFocus],ebx pop eax xor [ebp+vaOvertype],eax dec dword [vaLock] .noredraw: pop ebp pop ebx mov eax,[esp+8] push dword [esp] mov [esp+4],eax retn
В общем основательно поюзал этот плагин. Один баг нашел. Хорошо б его поправить. Заключается вот в чем: Выделяете фрагмент текста. И зажимая левую клавишу на этом фрагменте, перетащите его. Тогда курсор поменяется на прежний вид + он не будет соответствовать своей строке (находится на одном месте, а печатает в другом ). А так плагин что надо.
TermmoSINteZ, Спасибо за тестинг. Глюк отладил. Новая версия лежит здесь: http://rapidshare.de/files/9887171/DEVEDIT.RAR.html
Так же сломал вот этот msgbox: <font size=4>ДО:</font><!--size--> <font size=4>ПОСЛЕ:</font><!--size--> При большом проекте (при remote debugging), таких msgbox'ов штук 50 вылазить, так что очень не удобно! Качаем здесь: http://rapidshare.de/files/10234238/DEVDBG.RAR.html