Subversion Repositories Kolibri OS

Rev

Rev 1113 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;Basic macros for use editbox                             ;
  3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4. macro init_editbox
  5. {
  6. pushad
  7.         mcall
  8.  
  9. popad
  10. }
  11.  
  12.  
  13. macro use_editbox_draw
  14. {
  15. edit_box:
  16. ed_width        equ [edi]               ;ширина компонента
  17. ed_left         equ [edi+4]             ;положение по оси х
  18. ed_top          equ [edi+8]             ;положение по оси у
  19. ed_color        equ [edi+12]            ;цвет фона компонента
  20. shift_color     equ [edi+16]            ;=0x6a9480 для примера возьем желеный цвет бокса
  21. ed_focus_border_color   equ [edi+20]    ;цвет рамки компонента
  22. ed_blur_border_color    equ [edi+24]    ;цвет не активного компонента
  23. ed_text_color   equ [edi+28]            ;цвет текста
  24. ed_max          equ [edi+32]                    ;кол-во символов которые можно максимально ввести
  25. ed_text         equ [edi+36]                    ;указатель на буфер
  26. ed_mouse_variable       equ [edi+40]    ; указатель на переменную для бокса/группы
  27. ed_flags        equ [edi+44]            ;флаги
  28. ed_size equ [edi+48]                    ;кол-во символов
  29. ed_pos  equ [edi+52]                    ;позиция курсора
  30. ed_offset       equ [edi+56]            ;смещение
  31. cl_curs_x       equ [edi+60]            ;предыдущее координата курсора по х
  32. cl_curs_y       equ [edi+64]            ;предыдущее координата курсора по у
  33. ed_shift_pos    equ [edi+68]            ;положение курсора
  34. ed_shift_pos_old equ [edi+72]           ;старое положение курсора
  35.  
  36. ed_figure_only= 1000000000000000b   ;одни символы
  37. ed_always_focus= 100000000000000b
  38. ed_focus=                     10b   ;фокус приложения
  39. ed_shift_on=                1000b   ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift
  40. ed_shift_on_off=1111111111110111b
  41. ed_shift=                    100b   ;включается при нажатии на shift т.е. если нажимаю
  42. ed_shift_off=   1111111111111011b
  43. ed_shift_bac=              10000b   ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение
  44. ed_shift_bac_cl=1111111111101111b   ;очистка при удалении выделения
  45. ed_shift_cl=    1111111111100011b
  46. ed_shift_mcl=   1111111111111011b
  47. ed_left_fl=               100000b
  48. ed_right_fl=    1111111111011111b
  49. ed_offset_fl=            1000000b
  50. ed_offset_cl=   1111111110111111b
  51. ed_insert=              10000000b
  52. ed_insert_cl=   1111111101111111b
  53. ed_mouse_on =          100000000b
  54. ed_mous_adn_b=         100011000b
  55. ed_mouse_on_off=1111111011111111b
  56. ed_height=14 ; высота
  57.  
  58.  
  59. .draw:
  60.         pushad
  61. ;--- рисуем рамку ---
  62.         mov     edi,dword [esp+36]
  63.         call    .draw_border            ; Функция стабильна
  64. .draw_bg_cursor_text:
  65. ;--- изменяем смещение, если надо ---
  66.         call    .check_offset           ;вычисление позиции курсора стабильна
  67. ;--- рисуем внутреннюю область ---
  68.         call    .draw_bg                ;нарисовать прямоугольник рабочей области
  69. ;---- рисуем выделение, по shift если есть
  70.         call    .draw_shift
  71. .draw_cursor_text:
  72. ;--- рисуем курсор ---
  73.         ;--- может его не надо рисовать ----
  74.         test    word ed_flags,ed_focus
  75.         jz      @f
  76.         call    .draw_cursor
  77. @@:
  78.         call    .draw_text
  79. ;        ret
  80. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  81. ;Общий выход из editbox для всех функций и пост обработчиков;;
  82. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  83. .editbox_exit:
  84.         popad
  85.         ret 4
  86. }
  87.  
  88.  
  89. macro use_editbox_key
  90. {
  91. ;==========================================================
  92. ;=== обработка клавиатуры =================================
  93. ;==========================================================
  94. edit_box_key:
  95. pushad
  96.         mov     edi,dword [esp+36]
  97.         test    word ed_flags,ed_focus ; если не в фокусе, выходим
  98.         je      edit_box.editbox_exit
  99.         test    word ed_flags,ed_mouse_on
  100.         jne     edit_box.editbox_exit
  101.  
  102. ;Проверка нажат shift ?
  103.         call    edit_box_key.check_shift
  104. ;----------------------------------------------------------
  105. ;--- проверяем, что нажато --------------------------------
  106. ;----------------------------------------------------------
  107. use_key_process  backspase,delete,left,right,home,end,insert
  108. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  109. ;Заглушка на обработку клавиш вверх и вниз т.е. при обнаружении этих кодов происходит выход из обработчика
  110. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  111. use_key_no_process   up,down,esc,enter,tab,numl,capsl,scrolll
  112. ;--- нажата другая клавиша ---
  113. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  114. ;Проверка установлен ли флаг при котором нужно выводить только цифры в нужном боксе если такойнеобходимости нет нужно закоментировать макрос
  115. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  116. use_key_figures_only
  117. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  118. ;проверка на shift был ли нажат
  119. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  120. are_key_shift_press
  121. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  122. ; проверяем, находится ли курсор в конце + дальнейшая обработка
  123. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  124. are_key_cur_end
  125. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  126. ;Обработка клавиш insert,delete.backspase,home,end,left,right
  127. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  128. use_work_key
  129. }
  130.  
  131. macro use_editbox_mouse
  132. {
  133. ;==========================================================
  134. ;=== обработка мыши =======================================
  135. ;==========================================================
  136. ;save for stdcall ebx,esi,edi,ebp
  137. edit_box_mouse:
  138. pushad
  139.         mov     edi,dword [esp+36]
  140. ;debug
  141. ;----------------------------------------------------------
  142. ;--- получаем состояние кнопок мыши -----------------------
  143. ;----------------------------------------------------------
  144.         mcall   37,2
  145. ;----------------------------------------------------------
  146. ;--- проверяем состояние ----------------------------------
  147. ;----------------------------------------------------------
  148.         test    eax,1
  149.         jnz     edit_box_mouse.mouse_left_button
  150.         and     word ed_flags,ed_mouse_on_off
  151.         mov     ebx,dword ed_mouse_variable
  152.         push    0
  153.         pop     dword [ebx]
  154. ;        mov     dword [ebx],ebx
  155.         jmp     edit_box.editbox_exit
  156. .mouse_left_button:
  157. ;----------------------------------------------------------
  158. ;--- блокировка от фокусировки в других боксах при попадании на них курсора
  159. ;----------------------------------------------------------
  160.         mov     eax,dword ed_mouse_variable
  161.         push    dword [eax]
  162.         pop     eax
  163.         test    eax,eax
  164.         jz      @f
  165.         cmp     eax,edi
  166.         je      @f
  167.         jmp     edit_box_mouse._blur
  168. ;----------------------------------------------------------
  169. ;--- получаем координаты мыши относительно 0 т.е всей области экрана
  170. ;----------------------------------------------------------
  171. @@:     mcall   37,1
  172. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  173. ;Функция обработки  мышки получение координат и проверка их + выделения
  174. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  175. use_work_mouse
  176. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  177. ;Общие функции обработки
  178. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  179. use_general_func
  180. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  181. ;Функции для работы с key
  182. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  183. use_key_func
  184. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  185. ;Функции для работы с mouse
  186. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  187. use_mouse_func
  188. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  189. ;Bit mask from editbox
  190. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  191. }
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  216. ;ниже расположены функции которыми реализуется весь алгоритм
  217. ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  218. ;Макрос для вывода основных функций которые испльзуются боксом
  219. macro use_general_func
  220. {
  221. ;debug_func
  222. ;----------------------------------------------------------
  223. ;--- процедура прорисовки выделеной части -----------------
  224. ;----------------------------------------------------------
  225. edit_box.draw_shift:
  226.         test    word ed_flags,ed_shift_bac ;установка флага, выделенной области
  227.         jz      @f
  228.         mov     ebp,shift_color
  229.         mov     ebx,dword       ed_shift_pos
  230.         call    edit_box_key.sh_cl_
  231. @@:     ret
  232. ;----------------------------------------------------------
  233. ;--- процедура прорисовки текста --------------------------
  234. ;----------------------------------------------------------
  235. edit_box.draw_text:
  236. ;--- вычисляем, сколько помещается символов ---
  237. ;--- чтобы мусор не рисовать ---
  238.         call    edit_box.get_n
  239.         mov     esi,ed_size
  240.         mov     ebx,ed_offset
  241.         sub     esi,ebx
  242.         cmp     eax,esi
  243.         jae     @F
  244.         mov     esi,eax         ;чтобы не выходить за пределы экрана
  245. ;--- рисуем текст ---                                            
  246. @@:     mov     eax,4
  247.         mov     ebx,ed_left
  248.         mov     edx,ed_offset
  249.         add     ebx,2
  250.         shl     ebx,16
  251.         add     ebx,ed_top
  252.         mov     ecx,ed_text_color
  253.         add     ebx,4
  254.         add     edx,ed_text
  255.         mcall
  256. ret
  257. ;----------------------------------------------------------
  258. ;--- процедура прорисовки фона ----------------------------
  259. ;входные данные
  260. ;eax
  261. ;edx - color
  262. ;----------------------------------------------------------
  263. ;вход только цвет edx
  264. edit_box.draw_bg:
  265.         mov     ebx,ed_left
  266.         add     ebx,1
  267.         mov     edx,ed_color
  268.         shl     ebx,16
  269.         add     ebx,ed_width
  270.         sub     ebx,1
  271. edit_box.draw_bg_eax:
  272.         mov     ecx,ed_top
  273.         mov     eax,13
  274.         add     ecx,1
  275.         shl     ecx,16
  276.         add     ecx,ed_height
  277.         dec     ecx
  278.         mcall  
  279. ret
  280. ;----------------------------------------------------------
  281. ;--- процедура получения количества символов в текущей щирине компонента
  282. ;----------------------------------------------------------
  283. edit_box.get_n:
  284.         mov     eax,ed_width    ;получем ширину компонента
  285.         xor     edx,edx   ;результат распологается в паре edx:eax в eax - остаток
  286.         sub     eax,4           ;вычтим 4
  287.         mov     ebx,6           ;загрузми делитель
  288.         div     ebx             ;размделим на 6
  289. ret
  290. ;----------------------------------------------------------
  291. ;--- процедура рисования курсора --------------------------
  292. ;----------------------------------------------------------
  293. ;входные ebp- цвет
  294. edit_box.clear_cursor:
  295.         mov     edx,ebp
  296.         mov     ebx,cl_curs_x
  297.         mov     ecx,cl_curs_y
  298.         jmp     edit_box.draw_curs
  299. edit_box.draw_cursor:
  300.         mov     edx,ed_text_color
  301.         mov     ebx,ed_pos
  302.         mov     ecx,ed_offset
  303.         sub     ebx,ecx
  304.  
  305.         lea     ebx,[ebx*2+ebx]
  306.         shl     ebx,1
  307.         ;imul   ebx,6
  308.         add     ebx,ed_left
  309.         mov     ecx,ed_top
  310.         inc     ebx
  311.         add     ecx,2
  312.         mov     ebp,ebx
  313.         shl     ebx,16
  314.         mov     bx,bp
  315.         mov     ebp,ecx
  316.        
  317.         shl     ecx,16
  318.         mov     cx,bp
  319.         add     ecx,ed_height-4
  320.        
  321.         mov     cl_curs_x,ebx
  322.         mov     cl_curs_y,ecx
  323. edit_box.draw_curs:              
  324.         mcall   38
  325. ret
  326. ;----------------------------------------------------------
  327. ;--- процедура рисования рамки ----------------------------
  328. ;----------------------------------------------------------
  329. edit_box.draw_border:
  330. ;--- цвет рамки ---
  331.         test    word ed_flags,ed_focus
  332.         mov     edx,ed_focus_border_color
  333.         jne     @f
  334.         mov     edx,ed_blur_border_color
  335. @@:
  336. ;--- сверху ---
  337.         mov     eax,38
  338.         mov     ebx,ed_left
  339.         mov     ecx,ebx
  340.         shl     ebx,16
  341.         mov     bx,cx
  342.         add     ebx,ed_width
  343.         mov     ecx,ed_top
  344.         mov     esi,ecx
  345.         shl     ecx,16
  346.         mov     cx,si
  347.         mcall
  348. ;--- снизу ---
  349.         mov     esi,ecx
  350.         add     ecx,ed_height
  351.         mov     ebp,ecx
  352.         shl     ecx,16
  353.         mov     cx,bp
  354.         mcall
  355. ;--- слева ---
  356.         mov     cx,si
  357.         mov     ebp,ebx
  358.         sub     ebx,ed_width
  359.         mcall
  360. ;--- справа ---
  361.         mov     ebx,ebp
  362.         shl     ebx,16
  363.         mov     bx,bp
  364.         mcall
  365. ret
  366. ;----------------------------------------------------------
  367. ;--- проверка, зашел ли курсор за границы и, если надо, ---
  368. ;--- изменяем смещение ------------------------------------
  369. ;--- если смещение было установка флага ed_offset_cl иначе
  370. ; если ничего не изменилось то выставление ed_offset_fl
  371. ; в общей битовой маррице состояния компонентов word ed_flags
  372. ;----------------------------------------------------------
  373. edit_box.check_offset:
  374. pushad
  375.         mov     ecx,ed_pos
  376.         mov     ebx,ed_offset
  377.         cmp     ebx,ecx
  378.         ja      edit_box.sub_8
  379.  
  380.         push    ebx
  381.         call    edit_box.get_n                  ;получим кол-во символов в паре регистров edx:eax
  382.         pop     ebx
  383.         mov     edx,ebx
  384.         add     edx,eax         ;ed_offset+width editbox
  385.         inc     edx             ;необходимо для номального положения курсора в крайней левой позиции
  386.         cmp     edx,ecx
  387.         ja      @f
  388.  
  389.         mov     edx,ed_size
  390.         cmp     edx,ecx
  391.         je      edit_box.add_end
  392.  
  393.         sub     edx,ecx
  394.         cmp     edx,8
  395.         jbe     edit_box.add_8
  396.         add     ebx,8
  397.         jmp     edit_box.chk_d
  398.  
  399. edit_box.sub_8: cmp     ecx,0
  400.         je      edit_box.sub_min
  401.         cmp     ebx,8
  402.         jbe     edit_box.sub_min
  403.         sub     ebx,8   ;ebx=ed_offset
  404.         jmp     edit_box.chk_d
  405. edit_box.sub_min:
  406.         xor     ebx,ebx
  407.         jmp     edit_box.chk_d
  408.  
  409. edit_box.add_end:sub    edx,eax
  410.         mov     ebx,edx
  411.         jmp     edit_box.chk_d
  412. edit_box.add_8: add     ebx,edx
  413. edit_box.chk_d: mov     ed_offset,ebx
  414.         call    edit_box.draw_bg
  415.         and     word ed_flags,ed_offset_cl
  416. edit_ex
  417. @@:
  418.         or      word ed_flags,ed_offset_fl
  419. edit_ex
  420. }
  421.  
  422. macro use_key_func
  423. {
  424. ;Обработка Shift для снятия выделения неизвестной области
  425. edit_box_key.shift: ;;;;;;;SHIFT
  426.         test    word ed_flags,ed_shift
  427.         je      edit_box_key.f_exit
  428.  
  429. @@:     mov     ebp,shift_color
  430.         or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
  431.         mov     ebx,dword       ed_shift_pos
  432.         call    edit_box_key.sh_cl_
  433.         jmp     edit_box.draw_cursor_text
  434. ;;;;;;;;;;;;;;;;;;;;;
  435. edit_box_key.f_exit:    call   edit_box.check_offset
  436.         and     word ed_flags,ed_shift_cl
  437.         call    edit_box_key.enable_null
  438.         jmp     edit_box.draw_cursor_text
  439. edit_box_key.sh_cl_:
  440. ;;;;;;SHIFT end
  441. ;обработка очистки, при левом - правом движении выделения
  442. ;для обработки снятия выделения
  443. ;входные параметры ebp=color ebx=ed_shift_pos
  444.         mov     eax,dword       ed_pos
  445.         cmp     eax,ebx
  446.  
  447.         jae     edit_box_key.sh_n
  448.         push    eax  ;меньшее в eax
  449.         push    ebx  ;большее
  450.         jmp     edit_box_key.sh_n1
  451.                      ;если иначе
  452. edit_box_key.sh_n:
  453.         push    ebx  
  454.         push    eax
  455. edit_box_key.sh_n1:
  456.         call    edit_box.check_offset
  457.         call    edit_box.get_n
  458.         mov     edx,eax ;size of ed_box
  459.         mov     ecx,ed_offset
  460.         add     eax,ecx ;eax = w_off= ed_offset+width
  461.         mov     edx,eax ;save
  462.         pop     ebx     ;большее
  463.         pop     eax     ;меньшее
  464.  
  465.         cmp     eax,ecx         ;сравнение с меньшего с offset.
  466.         jae     edit_box_key.f_f            ;если больше
  467.         xor     eax,eax
  468.         cmp     edx,ebx         ;cравним размер w_off с большим
  469.         jb      @f
  470.         sub     ebx,ecx
  471.         jmp     edit_box_key.nxt_f
  472. @@:     mov     ebx,edx
  473.         sub     ebx,ecx
  474.         jmp     edit_box_key.nxt_f
  475. edit_box_key.f_f:  
  476.         sub     eax,ecx
  477.         cmp     edx,ebx         ;cравним размер w_off с большим
  478.         jle     @f
  479.         sub     ebx,ecx
  480.         sub     ebx,eax
  481.         jmp     edit_box_key.nxt_f
  482. @@:
  483.         mov     ebx,edx
  484.         sub     ebx,ecx
  485.         sub     ebx,eax
  486. edit_box_key.nxt_f:
  487.         mov     edx,ebx
  488.         lea     ebx,[eax*2+eax]
  489.         shl     ebx,1
  490.         add     ebx,ed_left
  491.         inc     ebx
  492.         shl     ebx,16
  493.         lea     ecx,[edx*2+edx]
  494.         shl     ecx,1  
  495.         mov     bx,cx
  496.         inc     ebx
  497.         mov     edx,ebp;shift_color
  498.  
  499.         call    edit_box.draw_bg_eax
  500. @@:     call    edit_box_key.enable_null
  501.         ret
  502. ;;;;;;;;;;;;;;;;;;;;;
  503. ;Установка- снятие выделения в один символ
  504. ;;;;;;;;;;;;;;;;;;;;;
  505. edit_box_key.drw_sim:
  506.         mov     eax,dword       ed_pos
  507.         call    edit_box_key.draw_rectangle   ;нарисовать прямоугольник с заданным цветом
  508.         jmp     @b
  509. ;;;;;;;;;;;;;;;;;;;;;
  510. ;Фукция установки выделения при движения влево и вправо и нажатии shift
  511. ;Логика:
  512. ;;;;;;;;;;
  513. edit_box_key.draw_wigwag:
  514. ;функция установки переменных
  515.         mov     ebp,shift_color
  516.         call    edit_box.clear_cursor
  517.  
  518.         or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
  519.         mov     ebp,shift_color
  520.         mov     eax,dword       ed_pos
  521.         test    word ed_flags,ed_left_fl
  522.         jz      edit_box_key.low
  523.         jmp     @f
  524. ;;;;;;;;;;
  525. ;Фукция удаления выделения при движения влево и вправо и нажатии shift
  526. ;Логика:
  527. ;;;;;;;;;;
  528. edit_box_key.draw_wigwag_cl:
  529. ;функция установки переменных
  530.         mov     ebp,ed_color
  531.         call    edit_box.clear_cursor
  532.  
  533.         mov     ebp,ed_color
  534.         mov     eax,dword       ed_pos
  535.         test    word ed_flags,ed_left_fl
  536.         jz      edit_box_key.low
  537. @@:     call    edit_box_key.draw_rectangle  ;нарисовать прямоугольник закрашиваемой области
  538.         ret
  539. edit_box_key.low:   dec     eax
  540.         jmp     @b
  541. ;входной параметр ebx - ed_pos
  542. edit_box_key.sh_first_sh:
  543.         test    word ed_flags,ed_shift
  544.         je      @f
  545.         mov     dword ed_shift_pos_old,ebx
  546.         test    word ed_flags,ed_shift_on
  547.         jne     @f
  548.         mov     dword ed_shift_pos,ebx
  549.         or      word ed_flags,ed_shift_on
  550. @@:     ret
  551. ;Обработка крайних положений в editbox при нажатом shift
  552. ;производит снятие выделение, если нет shift
  553. ;иначе вообще выходит
  554. edit_box_key.sh_st_of:
  555.         test    word ed_flags,ed_shift
  556.         jne     @f
  557.         test    word ed_flags,ed_shift_bac
  558.         je      @f
  559.         mov     ebp,ed_color
  560.         mov     ebx,dword       ed_shift_pos
  561.         call    edit_box_key.sh_cl_  ;очистка выделеного фрагмента
  562.         and     word ed_flags,ed_shift_cl ; очистка от того что убрали выделение
  563.         jmp     edit_box.draw_cursor_text
  564. @@:
  565.         and     word ed_flags,ed_shift_off
  566.         popad
  567.         ret     4
  568. ;проверка состояния shift был ли он нажат раньше?
  569. edit_box_key.sh_enable:
  570.         test    word ed_flags,ed_shift
  571.         jne     edit_box_key.sh_ext_en ;нарисовать закрашеный прямоугольник
  572.  
  573.         test    word ed_flags,ed_shift_bac
  574.         je      @f
  575.         call    edit_box.check_offset
  576.  
  577.         mov     ebp,ed_color
  578.         mov     ebx,dword       ed_shift_pos
  579.         call    edit_box_key.sh_cl_  ;очистка выделеного фрагмента
  580.         call    edit_box_key.draw_wigwag_cl
  581.         and     word ed_flags,ed_shift_cl ; 1вар не нужно
  582.         ret
  583.  
  584. @@:     mov     ebp,ed_color
  585.         call    edit_box.clear_cursor
  586.         call    edit_box.check_offset
  587.         ret
  588. edit_box_key.sh_ext_en:    
  589.         call    edit_box.check_offset
  590.         test    word ed_flags,ed_offset_fl
  591.         je      @f
  592. ;Рисование закрашеных прямоугольников и очистка их
  593.         mov     eax,dword       ed_shift_pos
  594.         mov     ebx,dword       ed_pos
  595.         mov     ecx,dword       ed_shift_pos_old
  596. ;проверка и рисование закрашеных областей
  597.         cmp     eax,ecx
  598.         je      edit_box_key.1_shem
  599.         jb      edit_box_key.smaller
  600.         cmp     ecx,ebx
  601.         ja      edit_box_key.1_shem
  602.         call    edit_box_key.draw_wigwag_cl ;clear
  603.         jmp     edit_box_key.sh_e_end
  604. edit_box_key.smaller:
  605.         cmp     ecx,ebx
  606.         jb      edit_box_key.1_shem
  607.         call    edit_box_key.draw_wigwag_cl ;clear
  608.         jmp     edit_box_key.sh_e_end
  609. ;alike  =
  610. edit_box_key.1_shem:        call   edit_box_key.draw_wigwag
  611. edit_box_key.sh_e_end:      and     word ed_flags,ed_shift_off
  612.         ret
  613. @@:     mov     ebp,shift_color
  614.         mov     ebx,dword       ed_shift_pos
  615.         call    edit_box_key.sh_cl_
  616.         jmp     edit_box_key.sh_e_end
  617. ;функция для обработки shift при нажатии home and end
  618. edit_box_key.sh_home_end:
  619.         mov     ebp,ed_color
  620.         call    edit_box.clear_cursor
  621.         test    word ed_flags,ed_shift_bac
  622.         je      @f
  623.         mov     ebp,ed_color
  624.         mov     ebx,dword       ed_shift_pos_old
  625.         call    edit_box_key.sh_cl_
  626.  
  627. @@:     test    word ed_flags,ed_shift
  628.         je      edit_box_key.sh_exit_ ;выйти
  629.         mov     ebp,shift_color
  630.         mov     ebx,dword       ed_shift_pos
  631.         call    edit_box_key.sh_cl_
  632.         or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
  633.         jmp     edit_box_key.sh_e_end
  634. edit_box_key.sh_exit_:      call    edit_box.check_offset
  635.         ret
  636. ;функция внесения 0 по адресу ed_size+1
  637. edit_box_key.enable_null:
  638.         pusha
  639.         mov     eax,ed_size
  640.         mov     ebx,ed_text
  641.         test    eax,eax
  642.         add     eax,ebx
  643.         jne     @f
  644.         inc     eax
  645. @@:     xor     ebx,ebx
  646.         mov     [eax],bl
  647. edit_ex
  648. ;- удаление символа
  649. ;Входные данные edx=ed_size;ecx=ed_pos
  650. edit_box_key.del_char:
  651.         mov     esi,ed_text
  652.         test    word ed_flags,ed_shift_on
  653.         je      @f
  654.         mov     eax,dword ed_shift_pos
  655.         mov     ebx,esi
  656.         cmp     eax,ecx
  657.         jae     edit_box_key.dh_n
  658.  
  659.         mov     ed_pos,eax      ;что бы не было убегания курсора
  660.         mov     ebp,ecx
  661.         sub     ebp,eax
  662.         add     ebx,eax  ;eax меньше
  663.         sub     edx,ecx
  664.         add     esi,ecx
  665.  
  666.         mov     dword ed_shift_pos,ebp
  667.         jmp     edit_box_key.del_ch_sh
  668.                      ;если иначе
  669. edit_box_key.dh_n:  
  670.         mov     ebp,eax
  671.         sub     ebp,ecx
  672.         add     ebx,ecx
  673.         sub     edx,eax
  674.         add     esi,eax
  675.         mov     dword ed_shift_pos,ebp
  676.         jmp     edit_box_key.del_ch_sh
  677.  
  678. @@:     add     esi,ecx ;указатель + смещение к реальному буфферу
  679.         mov     ebx,esi
  680.         inc     esi
  681.         cld
  682.  
  683.         sub     edx,ecx
  684. edit_box_key.del_ch_sh:
  685.  
  686.         push    edi
  687.         mov     edi,ebx
  688. @@:
  689.         lodsb
  690.         stosb
  691.         dec edx
  692.         jns @b
  693.        
  694.         pop edi
  695.         ret
  696. ;вычислить закрашиваемую область
  697. ;соглашение в ebp - передается ed_size
  698. edit_box_key.clear_bg:
  699.         call    edit_box.get_n  ;получить размер в символах ширины компонента
  700.         push    eax
  701.         mov     ebx,ed_offset
  702.         add     eax,ebx ;eax = w_off= ed_offset+width
  703.         mov     ebx,ebp ;ed_size
  704.        
  705.         cmp     eax,ebx
  706.         jb      @f
  707.         mov     eax,ed_pos
  708.         sub     ebx,eax
  709.         mov     ecx,ed_offset
  710.         sub     eax,ecx
  711.         jmp     edit_box_key.nxt
  712. @@:     mov     ebx,ed_pos
  713.         push    ebx
  714.         sub     eax,ebx
  715.         mov     ebx,eax ;It is don't optimal
  716.        
  717.         pop     eax     ;ed_pos
  718.         mov     ecx,ed_offset
  719.         sub     eax,ecx
  720. edit_box_key.nxt:
  721.         mov     ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
  722.         add     ebp,ebx
  723.         pop     edx
  724.         cmp     ebp,edx
  725.         je      @f
  726.         inc     ebx
  727.  
  728. @@:     mov     edx,ebx
  729.         lea     ebx,[eax*2+eax]
  730.         shl     ebx,1
  731.         add     ebx,ed_left
  732.         inc     ebx
  733.         shl     ebx,16
  734.         lea     ecx,[edx*2+edx]
  735.         shl     ecx,1  
  736.         mov     bx,cx
  737.         mov     edx,ed_color
  738.         call    edit_box.draw_bg_eax
  739.         ret
  740. ;;;;;;;;;;;;;;;;;;;
  741. ;;; Обработка примитивов
  742. ;;;;;;;;;;;;;;;;;;;;
  743. ;Нарисовать прямоугольник, цвет передается в ebp
  744. ;входные параметры:
  745. ;eax=dword ed_pos
  746. ;ebp=-цвет ed_color or shift_color
  747. edit_box_key.draw_rectangle:
  748.         mov     ecx,dword ed_offset
  749.         sub     eax,ecx
  750.         lea     ebx,[eax*2+eax]
  751.         shl     ebx,1
  752.         inc     ebx
  753.         add     ebx,ed_left
  754.         shl     ebx,16
  755.         add     ebx,6
  756.         mov     edx,ebp
  757.         call    edit_box.draw_bg_eax
  758.         ret
  759. ;;;;;;;;;;;;;;;;;;
  760. ;;Проверка нажат ли shift
  761. ;;;;;;;;;;;;;;;;;;
  762. edit_box_key.check_shift:
  763. pusha   ;сохраним все регистры
  764.         mcall   66,3
  765.         test    al,0x03
  766.         je      @f
  767.         or      word ed_flags,ed_shift   ;установим флаг
  768. @@:edit_ex
  769. }
  770. ;макрос клавиш на которые происходит реакция
  771. macro use_key_process backspase,delete,left,right,home,end,insert
  772. {
  773. if backspase eq
  774. else
  775.         cmp     ah,8
  776.         jz      edit_box_key.backspace
  777. end if
  778. if delete eq
  779. else
  780.         cmp     ah,0xb6
  781.         jz      edit_box_key.delete
  782. end if
  783. if left eq
  784. else
  785.         cmp     ah,176
  786.         jz      edit_box_key.left
  787. end if
  788. if right eq
  789. else
  790.         cmp     ah,179
  791.         jz      edit_box_key.right
  792. end if
  793. if home eq
  794. else
  795.         cmp     ah,180
  796.         jz      edit_box_key.home
  797. end if
  798. if home eq
  799. else
  800.         cmp     ah,181
  801.         jz      edit_box_key.end
  802. end if
  803. if insert eq
  804. else
  805.         cmp     ah,185  ;insert
  806.         jz      edit_box_key.insert
  807. end if
  808. }
  809.  
  810. macro use_key_no_process  up,down,esc,enter,tab,numl,capsl,scrolll
  811. {
  812. if up eq
  813. else
  814.         cmp     ah,177
  815.         jz      edit_box.editbox_exit
  816. end if
  817. if down eq
  818. else
  819.         cmp     ah,178
  820.         jz      edit_box.editbox_exit
  821. end if
  822. if esc eq
  823. else
  824.         cmp     ah,27   ;ESC - клавиша ))
  825.         jz      edit_box.editbox_exit
  826. end if
  827. if enter eq
  828. else
  829.         cmp     ah,13   ;ENTER - клавиша ))
  830.         jz      edit_box.editbox_exit
  831. end if
  832. if tab eq
  833. else
  834.         cmp     ah,9   ;TAB - клавиша ))
  835.         jz      edit_box.editbox_exit
  836. end if
  837.  
  838. if numl eq
  839. else
  840.         cmp     ah,4   ;Num Lock - клавиша ))
  841.         jz      edit_box.editbox_exit
  842. end if
  843.  
  844. if capsl eq
  845. else
  846.         cmp     ah,2   ;Caps Lock - клавиша ))
  847.         jz      edit_box.editbox_exit
  848. end if
  849.  
  850. if scrolll eq
  851. else
  852.         cmp     ah,1   ;Scroll Lock - клавиша ))
  853.         jz      edit_box.editbox_exit
  854. end if
  855.  
  856. }
  857.  
  858. macro use_key_figures_only
  859. {
  860.         test    word ed_flags,ed_figure_only  ; только цифры ?
  861.         jz      @f
  862.         cmp     ah,'0'
  863.         jb      edit_box.editbox_exit
  864.         cmp     ah,'9'
  865.         ja      edit_box.editbox_exit
  866. @@:
  867. }
  868. macro are_key_shift_press
  869. {
  870.         test    word ed_flags,ed_shift_on
  871.         je      @f
  872.         ;Входные данные edx=ed_size;ecx=ed_pos
  873.         push    eax
  874.         mov     edx,ed_size
  875.         mov     ecx, ed_pos
  876.         pusha
  877. ;;;;;;;;;;;;;;;;;;;;;
  878. ;clear input arrea
  879.         mov     ebp,ed_color
  880.         mov     ebx,dword       ed_shift_pos
  881.         call    edit_box_key.sh_cl_
  882.         mov     ebp,ed_size
  883.         call    edit_box_key.clear_bg
  884. ;;;;;;;;;;;;;;;;;;;;;
  885.         popa
  886.         call    edit_box_key.del_char
  887. ;;;;
  888.         mov     eax,dword ed_shift_pos
  889.         mov     ebx,ed_size
  890.         sub     ebx,eax
  891.         mov     ed_size,ebx
  892.         pop     eax
  893. @@:
  894. }
  895. macro are_key_cur_end
  896. {
  897.         mov     ecx,ed_size
  898.         mov     edx, ed_max
  899.         test    word ed_flags,ed_insert
  900.         jne     @f
  901.         cmp     ecx,edx
  902.         jae     edit_box.editbox_exit
  903. @@:     mov     ebx, ed_pos
  904.         cmp     ebx,edx
  905.         jl      @f ; если меньше или равно
  906.         jmp     edit_box.editbox_exit
  907.  
  908. @@:     ; сдвигаем символы после курсора вправо
  909.         mov     ecx,ed_size
  910.         push    edi eax
  911.         mov     ebp,edi
  912.         mov     esi,ed_text     ; Указатель на буфер
  913.                                 ;Будем работать со строкой
  914.         add     esi,ecx         ;add ed_size добавим max size
  915.         mov     edi,esi
  916.  
  917.         cmp     ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
  918.         je      edit_box_key.In_k
  919.  
  920.         test    word [ebp+40],ed_insert ;IF insert is enable  т.к. edi изменен адресуем через ebp
  921.         jne     edit_box_key.ins_v
  922. ;clear
  923. pusha
  924.         mov     edi,ebp
  925.         mov     ebp,ed_size
  926.         call    edit_box_key.clear_bg
  927. popa
  928.         sub     ecx,ebx         ;Найдем кол-во символов для передвижения.
  929.         inc     edi             ;Сместим наши символы в право
  930.         std
  931.         inc     ecx
  932.    @@:  
  933.         ;--------
  934.         lodsb
  935.         stosb
  936.         ;--------
  937.         loop    @b
  938. edit_box_key.In_k:  
  939.         cld
  940.         pop eax
  941.         mov al,ah
  942.         stosb
  943.         pop edi
  944. ; вставляем код клавиши туда, где курсор
  945.         ; увеличиваем значение размера и позиции
  946.         inc      dword ed_size
  947.         inc      dword ed_pos
  948.         call    edit_box_key.draw_all2
  949.         jmp     edit_box_key.shift
  950. }
  951. macro use_work_key
  952. {
  953. edit_box_key.insert: test   word ed_flags,ed_insert ;not    word ed_insert
  954.          je     @f
  955.          and    word ed_flags,ed_insert_cl
  956.  
  957.         jmp     edit_box.editbox_exit
  958. @@:
  959.         or      word ed_flags,ed_insert
  960.         jmp     edit_box.editbox_exit
  961. edit_box_key.ins_v:
  962.         dec     dword [ebp+42];ed_size    ;processing is insert
  963.         sub     esi,ecx
  964.         add     esi,ebx
  965.         mov     edi,esi
  966. ;clear
  967. pusha
  968.         mov     edi,ebp
  969.         mov     ebp,ed_pos
  970.         call    edit_box_key.clear_bg
  971. popa
  972.         jmp     edit_box_key.In_k
  973. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  974. edit_box_key.delete:        
  975.         mov     edx,ed_size
  976.         mov     ecx,ed_pos
  977.         cmp     edx,ecx
  978.         jg      edit_box_key.bac_del
  979.         test    word ed_flags,ed_shift_on
  980.         jne     edit_box_key.del_bac
  981.         popad
  982.         ret     4
  983. edit_box_key.bac_del:      
  984.         call    edit_box_key.del_char
  985.         jmp     edit_box_key.draw_all
  986. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;        
  987. ;--- нажата клавиша backspace ---
  988. edit_box_key.backspace:
  989.         ; проверяем, курсор у левого края ?
  990.         mov     ecx,ed_pos
  991.         test    ecx,ecx
  992.         jnz     edit_box_key.del_bac
  993.         test    word ed_flags,ed_shift_on
  994.         jne     edit_box_key.bac_del
  995.         popad
  996.         ret     4
  997.  
  998. edit_box_key.del_bac:
  999.         mov     edx,ed_size
  1000.         cmp     edx,ecx ;if ed_pos=ed_size
  1001.         je      @f
  1002.         dec     ecx
  1003.         call    edit_box_key.del_char
  1004. @@:     test    word ed_flags,ed_shift_on
  1005.         jne     edit_box_key.bac_del
  1006.         dec      dword ed_pos
  1007. edit_box_key.draw_all:
  1008.         push    edit_box_key.shift;.draw_cursor_text;eax
  1009.  
  1010.         test    word ed_flags,ed_shift_on
  1011.         je      @f
  1012.         mov     eax,dword ed_shift_pos
  1013.         mov     ebx,ed_size
  1014.         sub     ebx,eax
  1015.         mov     ed_size,ebx
  1016.  
  1017.         mov     ebp,ed_color
  1018.         call    edit_box.clear_cursor
  1019.         call    edit_box.check_offset
  1020.         call    edit_box.draw_bg
  1021.         ret
  1022. @@:     dec      dword ed_size
  1023.  
  1024. edit_box_key.draw_all2:
  1025.         and    word ed_flags,ed_shift_cl
  1026.         mov     ebp,ed_color
  1027.         call    edit_box.clear_cursor
  1028.         call    edit_box.check_offset
  1029.         mov     ebp,ed_size
  1030.         call    edit_box_key.clear_bg
  1031.         ret
  1032. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1033. ;--- нажата клавиша left ---
  1034. edit_box_key.left:  
  1035.         mov     ebx,ed_pos
  1036.         test    ebx,ebx
  1037.         jz      edit_box_key.sh_st_of
  1038.         or      word ed_flags,ed_left_fl
  1039.         call    edit_box_key.sh_first_sh
  1040.         dec      dword ed_pos
  1041.         call    edit_box_key.sh_enable
  1042.         jmp     edit_box.draw_cursor_text
  1043. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1044. ;--- нажата клавиша right ---
  1045. edit_box_key.right:
  1046.         mov     ebx,ed_pos
  1047.         cmp     ebx,ed_size
  1048.         je      edit_box_key.sh_st_of
  1049.         and     word ed_flags,ed_right_fl
  1050.         call    edit_box_key.sh_first_sh
  1051.         inc     dword  ed_pos
  1052.         call    edit_box_key.sh_enable
  1053.         jmp     edit_box.draw_cursor_text
  1054. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1055. edit_box_key.home:  
  1056.         mov     ebx,ed_pos
  1057.         test    ebx,ebx
  1058.         jz      edit_box_key.sh_st_of
  1059.         call    edit_box_key.sh_first_sh
  1060.         xor     eax,eax
  1061.         mov     ed_pos,eax
  1062.         call    edit_box_key.sh_home_end
  1063.         jmp     edit_box.draw_cursor_text
  1064. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1065. edit_box_key.end:  
  1066.         mov     ebx,ed_pos
  1067.         cmp     ebx,dword ed_size
  1068.         je      edit_box_key.sh_st_of
  1069.         call    edit_box_key.sh_first_sh
  1070.         mov     eax,ed_size
  1071.         mov     ed_pos,eax
  1072.         call    edit_box_key.sh_home_end
  1073.         jmp     edit_box.draw_cursor_text
  1074. }
  1075.  
  1076. macro use_mouse_func
  1077. {
  1078. ;----------------------------------------------------------
  1079. ;--- Обработка .mouse_wigwag
  1080. ;----------------------------------------------------------
  1081. edit_box_mouse.mouse_wigwag:
  1082.         shr     eax,16
  1083.         or      word ed_flags,ed_shift_bac+ed_shift_on+ed_shift
  1084. ;;;;;;;;;;;;;;;;;;
  1085. ;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox
  1086. ;;;;;;;;;;;;;;;;;;
  1087.         test    ax,0x8000
  1088.         jnz     edit_box_mouse.mleft
  1089.  
  1090.         mov     ebx,ed_left
  1091.         cmp     eax,ebx
  1092.         jb      edit_box_mouse.mleft
  1093.  
  1094.         add     ebx,ed_width
  1095.         cmp     eax,ebx
  1096.         ja      edit_box_mouse.mright
  1097.  
  1098.         sub     ebx,ed_width
  1099.  
  1100.         xor     edx,edx
  1101.         sub     eax,ebx ; вычтим из координат мышки по оси х координаты до editbox по оси х
  1102.         mov     ebx,6
  1103.         div     ebx
  1104. ;;;;;;;;;;;;;;;;;;
  1105. ;;процедура обработки положения выделенного текста, в пределах области editbox
  1106. ;;;;;;;;;;;;;;;;;;
  1107. ;Получили координаты в eax мышки, т.е. куда она переместилась
  1108. ;Рисование закрашеных прямоугольников и очистка их
  1109.         add     eax,ed_offset   ;добавим смещение
  1110.         cmp     eax,dword ed_size       ;если вышли за пределы, то ничего не делать
  1111.         ja      edit_box_mouse.mwigvag
  1112. edit_box_mouse.mdraw:
  1113.         mov     dword   ed_pos,eax ;сохраним новое значение
  1114. ;Рисование закрашеных прямоугольников и очистка их
  1115.         mov     ecx,dword       ed_shift_pos
  1116.         mov     ebx,dword       ed_shift_pos_old
  1117.         mov     dword   ed_shift_pos_old,eax    ;внесем новое значение старой позиции курсора
  1118. ;проверка и рисование закрашеных областей
  1119.         cmp     ecx,ebx         ;выясняем куда было движение на один шаг назад
  1120.         je      edit_box_mouse.m1_shem        ;движения не было ранее
  1121.         jb      edit_box_mouse.msmaller       ;движение было ->
  1122.         cmp     ebx,eax         ;движение было до этого <- и тут мы проверяем сейчас куда движение происходит
  1123.         ja      edit_box_mouse.m1_shem        ;если было движение <- то нужно закрасить область
  1124.         je      edit_box_mouse.mwigvag        ;если изменения не было, то ничего не делать
  1125.         mov     ebp,ed_color    ;тут нужно очистить область c ed_pos ed_shift_pos_old
  1126. ;входные параметры ebp=color ebx=ed_shift_pos
  1127.         call    edit_box_key.sh_cl_
  1128.         jmp     edit_box_mouse.mwigvag
  1129. edit_box_mouse.msmaller:
  1130.         cmp     ebx,eax
  1131.         jb      edit_box_mouse.m1_shem
  1132.         mov     ebp,ed_color
  1133. ;входные параметры ebp=color ebx=ed_shift_pos
  1134.         call    edit_box_key.sh_cl_
  1135.         jmp     edit_box_mouse.mwigvag
  1136. ;alike  =
  1137. edit_box_mouse.m1_shem:
  1138.         mov     ebp,shift_color
  1139. ;входные параметры ebp=color ebx=ed_shift_pos
  1140.         mov     ebx,ecx
  1141.         call    edit_box_key.sh_cl_
  1142.         jmp     edit_box_mouse.mwigvag
  1143. edit_box_mouse.mwigvag:
  1144.         and     word ed_flags,ed_shift_mcl
  1145.         jmp     edit_box.draw_cursor_text
  1146. ;       popa
  1147. ;       ret
  1148. edit_box_mouse.mleft:
  1149.         mov     eax,ed_pos
  1150.         cmp     eax,0                                        
  1151.         jbe      edit_box_mouse.mwigvag
  1152.         dec     eax
  1153.         call    edit_box.check_offset
  1154.         push    eax
  1155.         mov     ebx,ed_shift_pos
  1156.         mov     ebp,shift_color
  1157.         call    edit_box_key.sh_cl_
  1158.         pop     eax
  1159.         jmp     edit_box_mouse.mdraw
  1160. edit_box_mouse.mright:
  1161.         mov     eax,ed_pos
  1162.         mov     ebx,ed_size
  1163.         cmp     eax,ebx
  1164.         jae     edit_box_mouse.mwigvag
  1165.         inc     eax
  1166.         call    edit_box.check_offset
  1167.         mov     ebx,ed_shift_pos
  1168.         mov     ebp,shift_color
  1169.         push    eax
  1170.         call    edit_box_key.sh_cl_
  1171.         pop     eax
  1172.         jmp     edit_box_mouse.mdraw  
  1173. }
  1174.  
  1175. macro use_work_mouse
  1176. ;----------------------------------------------------------
  1177. ;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны?
  1178. ;----------------------------------------------------------
  1179. {
  1180.         test    word ed_flags,ed_mouse_on
  1181.         jne     edit_box_mouse.mouse_wigwag
  1182. ;----------------------------------------------------------
  1183. ;--- проверяем, попадает ли курсор в edit box -------------
  1184. ;----------------------------------------------------------
  1185.         mov     ebx,ed_top
  1186.         cmp     ax,bx
  1187.         jl      edit_box_mouse._blur;.mouse_end_no_focus
  1188.        
  1189.         add     ebx,ed_height
  1190.         cmp     ax,bx
  1191.         jg      edit_box_mouse._blur;.mouse_end_no_focus
  1192.  
  1193.         shr     eax,16
  1194.  
  1195.         mov     ebx,ed_left
  1196.         cmp     ax,bx
  1197.         jl      edit_box_mouse._blur;.mouse_end_no_focus
  1198.  
  1199.         add     ebx,ed_width
  1200.  
  1201.         cmp     ax,bx
  1202.         jg      edit_box_mouse._blur;.mouse_end_no_focus        
  1203.  
  1204. ;--- изменяем позицию курсора ---
  1205.         push    eax
  1206.         mov     ebp,ed_color
  1207.         call    edit_box.clear_cursor
  1208.         pop     eax
  1209. edit_box_mouse._mvpos:
  1210.         xor     edx,edx
  1211.         sub     eax,ed_left
  1212.  
  1213.         mov     ebx,6
  1214.         div     bx
  1215.         add     eax,ed_offset
  1216.         cmp     eax,ed_size
  1217.         jna     edit_box_mouse._mshift
  1218.         mov     eax,ed_size
  1219.  
  1220. edit_box_mouse._mshift:
  1221. ;;;;;;;
  1222. ;;Секция обработки shift и выделения по shift
  1223. ;;;;;;;
  1224.         test    word ed_flags,ed_shift_bac
  1225.         je      @f
  1226.         mov     ebp,dword       ed_color
  1227.         mov     ebx,dword ed_shift_pos
  1228.         push    eax
  1229.         call    edit_box_key.sh_cl_
  1230.         and     word ed_flags,ed_shift_bac_cl
  1231.         pop     eax
  1232. @@:    
  1233.         test    word ed_flags,ed_mouse_on
  1234.         jne     @f
  1235.        
  1236.         mov     dword ed_shift_pos,eax
  1237.         or      word  ed_flags,ed_mouse_on
  1238.         mov     dword ed_pos,eax
  1239.  
  1240. ;        mov     dword [mouse_flag],edi          ;установим идентификатор
  1241.  
  1242.         mov     ebx,dword ed_mouse_variable
  1243.         push    edi
  1244.         pop     dword [ebx]
  1245.  
  1246.  
  1247.  
  1248.  
  1249.         bts     word ed_flags,1                 ;установка фокуса
  1250.         jmp     edit_box_mouse.m_sh
  1251. @@:            
  1252.         cmp     eax,dword ed_shift_pos  ;если позиции не изменились
  1253.         je      edit_box.editbox_exit
  1254.         mov     ed_pos,eax
  1255.         mov     ebp,dword shift_color
  1256.         mov     ebx,dword ed_shift_pos
  1257.         call    edit_box_key.sh_cl_
  1258.         or      word ed_flags,ed_mous_adn_b     ;установим бит что мы выделили +shift_on +
  1259. edit_box_mouse.m_sh:  
  1260.         call    edit_box.draw_text
  1261.         call    edit_box.draw_cursor
  1262. ;----------------------------------------------------------
  1263. ;--- процедура установки фокуса ---------------------------
  1264. ;----------------------------------------------------------
  1265.         jmp     edit_box_mouse.drc
  1266. edit_box_mouse._blur:
  1267.         test    word ed_flags,ed_always_focus
  1268.         jne     edit_box.editbox_exit
  1269.         btr     word ed_flags,1 ; если не в фокусе, выходим
  1270.         jnc     edit_box.editbox_exit
  1271.  
  1272.         mov     ebp,ed_color
  1273.         call    edit_box.clear_cursor
  1274. edit_box_mouse.drc:   call    edit_box.draw_border
  1275.         jmp     edit_box.editbox_exit
  1276. }
  1277.  
  1278.  
  1279. ; Макрос выхода
  1280. macro edit_ex
  1281. {
  1282. popad          
  1283. ret
  1284. }
  1285. macro debug
  1286. {
  1287.         ;-----------  отладка
  1288.         pushad
  1289. ;        mov     dword [ed_buffer.2],0
  1290. ;        mov     eax,edi
  1291.         mov eax,dword [ed_buffer.2]
  1292.         mov edi,ed_buffer.3
  1293.         call .str
  1294.         ;рисование фона
  1295.         mov eax,13
  1296.         mov ebx,178*65536+70
  1297.         mov ecx,28*65536+10
  1298.         xor edx,edx
  1299.         int 0x40
  1300.         ;вывод значения на экран
  1301.         mov eax,4
  1302.         mov ebx,180*65536+30
  1303.         mov ecx,0x10DDBBCC
  1304.         mov edx,ed_buffer.3
  1305.         mov esi,8
  1306.         int 0x40
  1307.         popad
  1308.         ;----------- отладка
  1309. }
  1310. macro   debug_func
  1311. {
  1312. .str:
  1313.         mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
  1314.          ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
  1315.         cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
  1316.         jb @f
  1317.         xor edx,edx  ;очистить edx
  1318.         div ecx      ;разделить - остаток в edx
  1319.         push edx     ;положить в стек
  1320.         ;dec edi             ;смещение необходимое для записи с конца строки
  1321.         call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
  1322.         pop eax
  1323.         @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
  1324.         ;sbb al,$69  ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает
  1325.         ;das        ;после данной команды как бы происходит уменьшение al на 66h  (в книге написано другое)
  1326.         or al,0x30  ;данная команда короче  чем две выше
  1327.         stosb       ;записать элемент из регистра al в ячеку памяти es:edi
  1328.  
  1329.         ret         ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
  1330. }
  1331.  
  1332. ;;;;;;;;;;;;;;;
  1333. ;For LibGui
  1334. ;;;;;;;;;;;;;;;
  1335. macro srt_ed_libgui
  1336. {
  1337. ed_width        equ [EditBox.ed_width]            ;ширина компонента
  1338. ed_left         equ [EditBox.ed_left]             ;положение по оси х
  1339. ed_top          equ [EditBox.ed_top]              ;положение по оси у
  1340. ed_color        equ [EditBox.ed_color]            ;цвет фона компонента
  1341. shift_color     equ [EditBox.shift_color]         ;=0x6a9480
  1342. ed_focus_border_color   equ [EditBox.ed_focus_border_color]   ;цвет рамки компонента
  1343. ed_blur_border_color    equ [EditBox.ed_blur_border_color]    ;цвет не активного компонента
  1344. ed_text_color   equ [EditBox.ed_text_color]       ;цвет текста
  1345. ed_max          equ [EditBox.ed_max]              ;кол-во символов которые можно максимально ввести
  1346. ed_text         equ [EditBox.ed_text]             ;указатель на буфер
  1347. ed_flags        equ [EditBox.ed_flags]            ;флаги
  1348. ed_size equ [EditBox.ed_size]                     ;кол-во символов
  1349. ed_pos  equ [EditBox.ed_poz]                      ;позиция курсора
  1350. ed_offset       equ [EditBox.ed_offset]           ;смещение
  1351. cl_curs_x       equ [EditBox.cl_curs_x]           ;предыдущее координата курсора по х
  1352. cl_curs_y       equ [EditBox.cl_curs_y]           ;предыдущее координата курсора по у
  1353. ed_shift_pos    equ [EditBox.ed_shift_pos]        ;положение курсора
  1354. ed_shift_pos_old equ [EditBox.ed_shift_pos_old]   ;старое положение курсора
  1355. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1356. ;Bit mask from editbox
  1357. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1358. ed_figure_only= 1000000000000000b   ;одни символы
  1359. ed_always_focus= 100000000000000b
  1360. ed_focus=                     10b   ;фокус приложения
  1361. ed_shift_on=                1000b   ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift
  1362. ed_shift_on_off=1111111111110111b
  1363. ed_shift=                    100b   ;включается при нажатии на shift т.е. если нажимаю
  1364. ed_shift_off=   1111111111111011b
  1365. ed_shift_bac=              10000b   ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение
  1366. ed_shift_bac_cl=1111111111101111b   ;очистка при удалении выделения
  1367. ed_shift_cl=    1111111111100011b
  1368. ed_shift_mcl=   1111111111111011b
  1369. ed_left_fl=               100000b
  1370. ed_right_fl=    1111111111011111b
  1371. ed_offset_fl=            1000000b
  1372. ed_offset_cl=   1111111110111111b
  1373. ed_insert=              10000000b
  1374. ed_insert_cl=   1111111101111111b
  1375. ed_mouse_on =          100000000b
  1376. ed_mous_adn_b=         100011000b
  1377. ed_mouse_on_off=1111111011111111b
  1378. ed_height=24 ; высота
  1379. }
  1380.  
  1381. ed_struc_size=76
  1382. struc  edit_box width,left,top,color,shift_color,focus_border_color,\
  1383.        blur_border_color,text_color,max,text,mouse_variable,flags,size,pos
  1384. {
  1385. .width dd width
  1386. .left dd left
  1387. .top dd top
  1388. .color dd color
  1389. .shift_color dd shift_color
  1390. .focus_border_color dd focus_border_color
  1391. .blur_border_color dd blur_border_color
  1392. .text_color dd text_color
  1393. .max dd max
  1394. .text dd text
  1395. .mouse_variable dd mouse_variable
  1396. .flags dd flags+0
  1397. .size dd size+0
  1398. .pos dd pos+0
  1399. .offset dd 0
  1400. .cl_curs_x dd 0
  1401. .cl_curs_y dd 0
  1402. .shift   dd 0
  1403. .shift_old   dd 0
  1404. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1405. ;Bit mask from editbox
  1406. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1407. ed_figure_only= 1000000000000000b   ;одни символы
  1408. ed_always_focus= 100000000000000b
  1409. ed_focus=                     10b   ;фокус приложения
  1410. ed_shift_on=                1000b   ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift
  1411. ed_shift_on_off=1111111111110111b
  1412. ed_shift=                    100b   ;включается при нажатии на shift т.е. если нажимаю
  1413. ed_shift_off=   1111111111111011b
  1414. ed_shift_bac=              10000b   ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение
  1415. ed_shift_bac_cl=1111111111101111b   ;очистка при удалении выделения
  1416. ed_shift_cl=    1111111111100011b
  1417. ed_shift_mcl=   1111111111111011b
  1418. ed_left_fl=               100000b
  1419. ed_right_fl=    1111111111011111b
  1420. ed_offset_fl=            1000000b
  1421. ed_offset_cl=   1111111110111111b
  1422. ed_insert=              10000000b
  1423. ed_insert_cl=   1111111101111111b
  1424. ed_mouse_on =          100000000b
  1425. ed_mous_adn_b=         100011000b
  1426. ed_mouse_on_off=1111111011111111b
  1427. ed_height=14 ; высота
  1428.  
  1429. }
  1430.