Ломаем msdev.exe (VC++ 6)

Тема в разделе "WASM.WIN32", создана пользователем comrade, 26 дек 2005.

  1. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Решил изменить каретку в редакторе MS Visual C++ 6.0 (msdev.exe). Она у них только одна - вертикальная линия в режимах INS (insert) и OVR (overtype); так что не видно когда что.



    Изменить каретку удалось - теперь в режиме INS она становиться горизонтальной линией под буквой, а в режиме OVR она становиться прямоугольным блоком.



    Одна проблема - каретку не перерисовываеться при нажатие кнопки INSERT (в оригинальной версии её перерисовывать и не надо, но в нашем случае надо). Пробывал всё - InvalidateRect+UpdateWindow, SendMessage(WM_SIZE), ShowWindow(SW_HIDE/SW_SHOW), но не что не помогает. Под скажите как дальше пойти по этому поводу.
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    HideCaret + ShowCaret
     
  3. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Пробовал, но не это не то.



    Нужно заставить программу пересоздать каретку через СВОЙ код CreateCaret.



    Я пробовал вот это:
    Код (Text):
    1.  
    2. devedit_86E80:  ; called by 508072BA (82BA)
    3.         push    ebx
    4.         push    ebp
    5.         call    @F
    6. @@:     pop     ebp
    7.         sub     ebp,$85E80 + $5 + $1 + $1
    8.  
    9.         mov     eax,[esp+8]
    10.         cmp     eax,[ebp+vaOvertype]
    11.         je      .noredraw
    12.         mov     byte [$400000 + $2000 + $1080],1
    13.  
    14.         ; get handle to edit control, and save it to ebx
    15.         call    dword [ebp+GetFocus]
    16.         mov     ebx,eax
    17.         stdcall dword [ebp+EnableWindow],ebx,0
    18.         stdcall dword [ebp+EnableWindow],ebx,1
    19.         stdcall dword [ebp+SetFocus],ebx
    20.         mov     byte [$400000 + $2000 + $1080],0
    21.  
    22. .noredraw:
    23.         pop     ebp
    24.         pop     ebx
    25.         mov     eax,[esp+8]
    26.         push    dword [esp]
    27.         mov     [esp+4],eax
    28.         retn    
    29.  




    Тоесть серия DisableWindow+EnableWindow. Это заставляет его перерисоваться и пересоздать каретку. Увы, работает не правильно - каретка создаетса не та (наоборот). Я поставил "toggle" флаг ($400000 + $2000 + $1080), всё работает окей только мелкие сбивания в позицие кареткы опять :dntknw:
     
  4. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
  5. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Прошу помошь от всех кто часто работает в среде VC6, и кого сильно бесит его вечно вертикальная каретка.



    Уже второй день с этим вожусь!
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    comrade



    Лишнее





    Нет.



    Обычно каретка создаётся по получении WM_SETFOCUS и убивается по WM_KILLFOCUS. Enable + Disable тут ничего не дают. Тем не менее, если фокус и так в окне (его вернул GetFocus), то слать SetFocus тому же окну нет смысла. Тут можно либо послать WM_KILLFOCUS и сразу WM_SETFOCUS, либо дать SetFocus на другое окно, а потом восстановить. Итак, мой вариант:
    Код (Text):
    1.         ; get handle to edit control, and save it to ebx
    2.         call    dword [ebp+GetFocus]
    3.         mov     ebx,eax
    4.         stdcall dword [ebp+SendMessage],ebx,WM_KILLFOCUS,0,0
    5.         stdcall dword [ebp+SendMessage],ebx,WM_SETFOCUS,0,0
    6.  
     
  7. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Починил :) :) :)
     
  8. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    WM_KILLFOCUS+WM_SETFOCUS не помогли. Я сделал так:


    Код (Text):
    1.  
    2. devedit_86E80:  ; called by 508072BA (82BA)
    3.         push    ebx
    4.         push    ebp
    5.         call    @F
    6. @@:     pop     ebp
    7.         sub     ebp,$85E80 + $5 + $1 + $1
    8.  
    9.         mov     eax,[esp+8]
    10.         cmp     eax,[ebp+vaOvertype]
    11.         je      .noredraw
    12.  
    13.         stdcall dword [ebp+GetAsyncKeyState],VK_INSERT
    14.         and     eax,1
    15.         push    eax
    16.         xor     [ebp+vaOvertype],eax
    17.  
    18.         ; get handle to edit control, and save it to ebx
    19.         call    dword [ebp+GetFocus]
    20.         mov     ebx,eax
    21.         stdcall dword [ebp+EnableWindow],ebx,0
    22.         stdcall dword [ebp+EnableWindow],ebx,1
    23.         stdcall dword [ebp+SetFocus],ebx
    24.         pop     eax
    25.         xor     [ebp+vaOvertype],eax
    26.  
    27. .noredraw:
    28.         pop     ebp
    29.         pop     ebx
    30.         mov     eax,[esp+8]
    31.         push    dword [esp]
    32.         mov     [esp+4],eax
    33.         retn        
    34.  




    Через 屁股... но работает =)
     
  9. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
  10. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Баг с Debug window :dntknw:
     
  11. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Вот так теперь:
    Код (Text):
    1.  
    2. devedit_86E80:  ; called by 508072BA (82BA)
    3.         push    ebx
    4.         push    ebp
    5.         call    @F
    6. @@:     pop     ebp
    7.         sub     ebp,$85E80 + $5 + $1 + $1
    8.  
    9.         ; redraw only if new settings differ from current ones
    10.         mov     eax,[esp+8]
    11.         cmp     eax,[ebp+vaOvertype]
    12.         je      .noredraw
    13.  
    14.         ; make sure we don't go into an infinite loop
    15.         cmp     dword [vaLock],0
    16.         ja      .noredraw
    17.  
    18.         inc     dword [vaLock]
    19.  
    20.         ; change caret if user pressed Insert key
    21.         stdcall dword [ebp+GetAsyncKeyState],VK_INSERT
    22.         and     eax,1
    23.         push    eax
    24.         xor     [ebp+vaOvertype],eax
    25.  
    26.         ; get handle to edit control
    27.         call    dword [ebp+GetFocus]
    28.         mov     ebx,eax
    29.         ; disabling/enabling window causes caret to refresh
    30.         stdcall dword [ebp+EnableWindow],ebx,0
    31.         stdcall dword [ebp+EnableWindow],ebx,1
    32.         stdcall dword [ebp+SetFocus],ebx
    33.         pop     eax
    34.         xor     [ebp+vaOvertype],eax
    35.         dec     dword [vaLock]
    36.  
    37. .noredraw:
    38.         pop     ebp
    39.         pop     ebx
    40.         mov     eax,[esp+8]
    41.         push    dword [esp]
    42.         mov     [esp+4],eax
    43.         retn                      
    44.  
     
  12. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
  13. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    ДА ЗДРАВСТВУЕТ ПАРТИЯ ЛЕНИНА!!!!!
     
  14. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine


    как говорит мой батя: "Нет такой крепости, чтоб большевики не разломали!" ;)
     
  15. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    В общем основательно поюзал этот плагин.

    Один баг нашел. Хорошо б его поправить.

    Заключается вот в чем:

    Выделяете фрагмент текста. И зажимая левую клавишу на этом фрагменте, перетащите его. Тогда курсор поменяется на прежний вид + он не будет соответствовать своей строке (находится на одном месте, а печатает в другом :) ).

    А так плагин что надо.
     
  16. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
  17. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Так же сломал вот этот msgbox:



    <font size=4>ДО:</font><!--size-->

    [​IMG]



    <font size=4>ПОСЛЕ:</font><!--size-->

    [​IMG]



    При большом проекте (при remote debugging), таких msgbox'ов штук 50 вылазить, так что очень не удобно!



    Качаем здесь:

    http://rapidshare.de/files/10234238/DEVDBG.RAR.html