Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

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