From 038e72e9ee3d8f7dedce9316d4f5544c91920a87 Mon Sep 17 00:00:00 2001 From: pathoswithin Date: Sat, 5 Nov 2016 04:15:05 +0000 Subject: [PATCH] editbox font options support (sysfunc 4 format) git-svn-id: svn://kolibrios.org@6675 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../libraries/box_lib/trunk/box_lib.mac | 175 ++-- .../libraries/box_lib/trunk/editbox.mac | 753 ++++++++---------- 2 files changed, 419 insertions(+), 509 deletions(-) diff --git a/programs/develop/libraries/box_lib/trunk/box_lib.mac b/programs/develop/libraries/box_lib/trunk/box_lib.mac index d4b0a4f84..fa28dd3e1 100644 --- a/programs/develop/libraries/box_lib/trunk/box_lib.mac +++ b/programs/develop/libraries/box_lib/trunk/box_lib.mac @@ -1,83 +1,86 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Basic macros for use EditBox ; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -ed_width equ [edi] ;ширина компонента -ed_left equ [edi+4] ;положение по оси х -ed_top equ [edi+8] ;положение по оси у -ed_color equ [edi+12] ;цвет фона компонента -shift_color equ [edi+16] ;=0x6a9480 для примера возьем желеный цвет бокса -ed_focus_border_color equ [edi+20] ;цвет рамки компонента -ed_blur_border_color equ [edi+24] ;цвет не активного компонента -ed_text_color equ [edi+28] ;цвет текста -ed_max equ [edi+32] ;кол-во символов которые можно максимально ввести -ed_text equ [edi+36] ;указатель на буфер -ed_mouse_variable equ [edi+40] ; указатель на переменную для бокса/группы -ed_flags equ [edi+44] ;флаги -bp_flags equ [ebp+44] ;в некоторых процедурах edi используется, взамен указатель храниться в ebp -ed_size equ [edi+48] ;кол-во символов -bp_size equ [ebp+48] ;кол-во симвполов, для адресации испльзуется ebpб edi занят -ed_pos equ [edi+52] ;позиция курсора -ed_offset equ [edi+56] ;смещение -cl_curs_x equ [edi+60] ;предыдущее координата курсора по х -cl_curs_y equ [edi+64] ;предыдущее координата курсора по у -ed_shift_pos equ [edi+68] ;положение курсора -ed_shift_pos_old equ [edi+72] ;старое положение курсора +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; basic macros for EditBox ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ed_width equ [edi] ; field width +ed_left equ [edi+4] ; left border X +ed_top equ [edi+8] ; top border Y +ed_color equ [edi+12] ; field color +shift_color equ [edi+16] ; select color +ed_focus_border_color equ [edi+20] ; border color active +ed_blur_border_color equ [edi+24] ; border color inactive +ed_text_color equ [edi+28] ; color and font (as in sysfunc 4) +ed_max equ [edi+32] ; chars max +ed_text equ [edi+36] ; buffer pointer +ed_mouse_variable equ [edi+40] ; pointer +ed_flags equ [edi+44] +bp_flags equ [ebp+44] +ed_size equ [edi+48] ; chars currently +bp_size equ [ebp+48] +ed_pos equ [edi+52] ; carret current position +ed_offset equ [edi+56] +cl_curs_x equ [edi+60] ; previous cursor X +cl_curs_y equ [edi+64] ; previous cursor Y +ed_shift_pos equ [edi+68] ; selection current position +ed_shift_pos_old equ [edi+72] ; selection previous position +ed_height equ [edi+76] +ed_char_width equ [edi+80] -ed_struc_size=76 +ed_struc_size = 84 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Bit mask from editbox -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -ed_figure_only= 1000000000000000b ;одни символы -ed_always_focus= 100000000000000b -ed_focus= 10b ;фокус приложения -ed_pass= 1b ;поле с паролем -ed_shift_on= 1000b ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift -ed_shift_on_off= not (ed_shift_on) -ed_shift= 100b ;включается при нажатии на shift т.е. если нажимаю -ed_shift_off= not (ed_shift) -ed_shift_bac= 10000b ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение -ed_shift_bac_cl= not (ed_shift_bac) -ed_shift_cl= not (ed_shift or ed_shift_bac or ed_shift_on) -ed_shift_mcl= not (ed_shift) -ed_left_fl= 100000b -ed_right_fl= not (ed_left_fl) -ed_offset_fl= 1000000b -ed_offset_cl= not (ed_offset_fl) -ed_insert= 10000000b -ed_insert_cl= not (ed_insert) -ed_mouse_on = 100000000b -ed_mous_adn_b= 100011000b -ed_mouse_on_off= not (ed_mouse_on) -ed_ctrl_on = 1000000000b -ed_ctrl_off = not (ed_ctrl_on) -ed_alt_on = 10000000000b -ed_alt_off = not (ed_alt_on) -ed_disabled= 100000000000b -ed_height=14 ; высота +;;;;;;;;;;;;;;;;;;;;;;; +;; flags for EditBox ;; +;;;;;;;;;;;;;;;;;;;;;;; +ed_pass = 1 ; password mode +ed_focus = 2 ; active +ed_shift = 4 ; shift holded +ed_shift_on = 8 ; selection active +ed_shift_bac = 16 ; clear selection +ed_left_fl = 32 +ed_offset_fl = 64 +ed_insert = 128 +ed_mouse_on = 256 +ed_ctrl_on = 512 +ed_alt_on = 400h +ed_disabled = 800h +ed_always_focus = 4000h +ed_figure_only = 8000h +ed_mous_adn_b = ed_mouse_on or ed_shift_on or ed_shift_bac +ed_shift_off = not ed_shift +ed_shift_mcl = not ed_shift +ed_shift_on_off = not ed_shift_on +ed_shift_bac_cl = not ed_shift_bac +ed_shift_cl = not (ed_shift or ed_shift_on or ed_shift_bac) +ed_right_fl = not ed_left_fl +ed_offset_cl = not ed_offset_fl +ed_insert_cl = not ed_insert +ed_mouse_on_off = not ed_mouse_on +ed_ctrl_off = not ed_ctrl_on +ed_alt_off = not ed_alt_on struc edit_box width,left,top,color,shift_color,focus_border_color,\ blur_border_color,text_color,max,text,mouse_variable,flags,size,pos { -.width dd width -.left dd left -.top dd top -.color dd color -.shift_color dd shift_color -.focus_border_color dd focus_border_color -.blur_border_color dd blur_border_color -.text_color dd text_color -.max dd max -.text dd text -.mouse_variable dd mouse_variable -.flags dd flags+0 -.size dd size+0 -.pos dd pos+0 -.offset dd 0 -.cl_curs_x dd 0 -.cl_curs_y dd 0 -.shift dd 0 -.shift_old dd 0 +.width dd width +.left dd left +.top dd top +.color dd color +.shift_color dd shift_color +.focus_border_color dd focus_border_color +.blur_border_color dd blur_border_color +.text_color dd text_color +.max dd max +.text dd text +.mouse_variable dd mouse_variable +.flags dd flags +.size dd size +.pos dd pos +.offset dd 0 +.cl_curs_x dd 0 +.cl_curs_y dd 0 +.shift dd 0 +.shift_old dd 0 +.height dd 0 +.char_width dd 0 } macro edit_boxes_set_sys_color start,end,color_table @@ -115,12 +118,12 @@ macro edit_boxes_set_sys_color start,end,color_table ;Basic macros for use CheckBox ; ;Last change 17.01.2013 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -ch_text_margin equ [edi+8] ;=4 расстояние от прямоугольника чек бокса до надписи +ch_text_margin equ [edi+8] ;=4 расстояние от прямоугольника чек бокса до надписи ch_color equ [edi+12] ;цвет внутри checkbox ch_border_color equ [edi+16] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно ch_text_color equ [edi+20] ;[edi+4] ;цвет текста -ch_text_ptr equ [edi+24] ;указатель на начало текстовой строки -ch_flags equ [edi+28] ;флаги +ch_text_ptr equ [edi+24] ;указатель на начало текстовой строки +ch_flags equ [edi+28] ;флаги ch_struc_size=36 ;размер структуры ch_flag_en=10b ;флаг установленного чек бокса. @@ -130,11 +133,11 @@ ch_flag_bottom=1000b ;фла 2ch_left_s equ [ebp] ;кордината начала рисования по х 2ch_top_s equ [ebp+4] ;координата начала рисования по у -2ch_text_margin equ [ebp+8] ;=4 расстояние от прямоугольника чек бокса до надписи +2ch_text_margin equ [ebp+8] ;=4 расстояние от прямоугольника чек бокса до надписи 2ch_color equ [ebp+12] ;цвет внутри checkbox 2ch_border_color equ [ebp+16] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно 2ch_text_color equ [ebp+20] ;[edi+4] ;цвет текста -2ch_text_ptr equ [ebp+24] ;указатель на начало текстовой строки +2ch_text_ptr equ [ebp+24] ;указатель на начало текстовой строки 2ch_flags equ [ebp+28] ;флаги 2ch_sz_str equ [ebp+32] ;длинна строки, вычисляется при инициализации компонента @@ -251,12 +254,12 @@ op_flag_en=10b option_group equ [edi] op_left equ [edi+4] ;координата начала рисования по х op_top equ [edi+6] ;координата начала рисования по у -op_text_margin equ [edi+8] ;=4 расстояние от прямоугольника чек бокса до надписи -op_size equ [edi+12] ;12 размер квадрата чек бокса +op_text_margin equ [edi+8] ;=4 расстояние от прямоугольника чек бокса до надписи +op_size equ [edi+12] ;12 размер квадрата чек бокса op_color equ [edi+16] op_border_color equ [edi+20] ; or [edi+4] ;цвет рамки optionbox ее можно задать самостоятельно op_text_color equ [edi+24];[edi+4] ;цвет текста -op_text_ptr equ [edi+28] ;указатель на начало текстовой строки +op_text_ptr equ [edi+28] ;указатель на начало текстовой строки op_text_length equ [edi+32] op_flags equ [edi+36] ;флаги @@ -502,10 +505,10 @@ PB_FRAME_COLOR equ +40 ; *** Frame constants *** ; FR_STYLE equ +0 ; Dword -FR_WIDTH equ +4 ; Word -FR_LEFT equ +6 ; Word -FR_HEIGHT equ +8 ; Word -FR_TOP equ +10 ; Word +FR_WIDTH equ +4 ; Word +FR_LEFT equ +6 ; Word +FR_HEIGHT equ +8 ; Word +FR_TOP equ +10 ; Word FR_OUTER_COLOR equ +12 ; Dword FR_INNER_COLOR equ +16 ; Dword FR_FLAGS equ +20 ; Dword diff --git a/programs/develop/libraries/box_lib/trunk/editbox.mac b/programs/develop/libraries/box_lib/trunk/editbox.mac index 4b48bd18a..4ec5e3aa9 100644 --- a/programs/develop/libraries/box_lib/trunk/editbox.mac +++ b/programs/develop/libraries/box_lib/trunk/editbox.mac @@ -2,27 +2,39 @@ ;Basic macros for use editbox ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - macro use_editbox_draw { edit_box: .draw: pushad -.draw_1: -;--- рисуем рамку --- - mov edi,dword [esp+36] + mov edi,[esp+36] + and dword ed_text_color,17FFFFFFh + mov ecx,ed_text_color + mov ebx,ecx + shr ecx,28 + shl ebx,4 + shr ebx,28 + inc ebx + mov eax,6 + jecxz @f + mov al, 8 +@@: + mul bl + mov ed_char_width,eax + mov al, 9 + jecxz @f + mov al, 16 +@@: + mul bl + add eax,4 + mov ed_height,eax call .draw_border .draw_bg_cursor_text: -;--- изменяем смещение, если надо --- call .check_offset -;--- рисуем внутреннюю область --- call .draw_bg -;--- рисуем выделение, по shift если есть --- call .draw_shift .draw_cursor_text: call .draw_text -;--- рисуем курсор --- - ;--- может его не надо рисовать --- test word ed_flags,ed_focus jz .editbox_exit call .draw_cursor @@ -34,20 +46,18 @@ edit_box: ret 4 } - macro use_editbox_key { ;========================================================== ;=== обработка клавиатуры ================================= ;========================================================== edit_box_key: -pushad - mov edi,dword [esp+36] + pushad + mov edi,[esp+36] test word ed_flags,ed_focus ; если не в фокусе, выходим jz edit_box.editbox_exit test word ed_flags,ed_mouse_on or ed_disabled jnz edit_box.editbox_exit - ;-------------------------------------- ; this code for Win-keys, works with ; kernel SVN r.3356 or later @@ -62,8 +72,8 @@ pushad pop ebx pop eax jmp edit_box.editbox_exit -@@: - pop ebx + +@@: pop ebx pop eax ;-------------------------------------- ;Проверка нажат shift ? @@ -126,8 +136,8 @@ macro use_editbox_mouse ;========================================================== ;save for stdcall ebx,esi,edi,ebp edit_box_mouse: -pushad - mov edi,dword [esp+36] + pushad + mov edi,[esp+36] test word ed_flags,ed_disabled jnz edit_box.editbox_exit ;debug @@ -141,16 +151,16 @@ pushad test eax,1 jnz edit_box_mouse.mouse_left_button and word ed_flags,ed_mouse_on_off - mov ebx,dword ed_mouse_variable + mov ebx,ed_mouse_variable push 0 pop dword [ebx] -; mov dword [ebx],ebx jmp edit_box.editbox_exit + .mouse_left_button: ;---------------------------------------------------------- ;--- блокировка от фокусировки в других боксах при попадании на них курсора ;---------------------------------------------------------- - mov eax,dword ed_mouse_variable + mov eax,ed_mouse_variable push dword [eax] pop eax test eax,eax @@ -183,7 +193,6 @@ use_mouse_func ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; } - ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;ниже расположены функции которыми реализуется весь алгоритм ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -198,93 +207,83 @@ edit_box.draw_shift: test word ed_flags,ed_shift_bac ;установка флага, выделенной области jz @f mov ebp,shift_color - mov ebx,dword ed_shift_pos + mov ebx,ed_shift_pos call edit_box_key.sh_cl_ @@: ret ;---------------------------------------------------------- ;--- процедура прорисовки текста -------------------------- ;---------------------------------------------------------- edit_box.draw_text: -;--- вычисляем, сколько помещается символов --- call edit_box.get_n mov esi,ed_size - mov ebx,ed_offset - sub esi,ebx + sub esi,ed_offset cmp eax,esi - jae @F + jae @f mov esi,eax -;--- рисуем текст --- -@@: mov eax,4 +@@: + test esi,esi + jz @f + mov eax,4 mov ebx,ed_left - mov edx,ed_offset add ebx,2 shl ebx,16 add ebx,ed_top + add ebx,2 mov ecx,ed_text_color - add ebx,4 - add edx,ed_text - test word ed_flags,ed_pass - jnz edit_box.draw_password + test dword ed_flags,ed_pass + jnz .password + mov edx,ed_text + add edx,ed_offset mcall +@@: ret -txt_pass db '*',0 -proc edit_box.draw_password -locals - s_len dw ? ;длина выводимого текста -endl - cmp esi,1 - jl .end_f ;если строка пустая - mov [s_len],si - xor esi,esi - inc esi - lea edx,[txt_pass] + +.password: + mov ebp,esi + mov esi,1 + mov edx,txt_pass @@: mcall - add ebx,6 shl 16 ;добавляем стандартную ширину символа - dec word[s_len] - cmp word[s_len],0 - jg @b -.end_f: + rol ebx,16 + add ebx,ed_char_width + rol ebx,16 + dec ebp + jnz @b ret -endp + +txt_pass db '*' ;---------------------------------------------------------- ;--- процедура прорисовки фона ---------------------------- -;входные данные -;eax -;edx - color ;---------------------------------------------------------- - edit_box.draw_bg: mov ebx,ed_left - add ebx,1 - mov edx,ed_color - test word ed_flags, ed_disabled - jz @f - mov edx, 0x00cacaca ; TODO: add new value disabled_color to editbox struct - @@: + inc ebx shl ebx,16 add ebx,ed_width - sub ebx,1 -;вход только цвет edx + dec ebx + mov edx,ed_color + test word ed_flags, ed_disabled + jz edit_box.draw_bg_eax + mov edx, 0xCACACA ; TODO: add disabled_color field to editbox struct edit_box.draw_bg_eax: mov ecx,ed_top - mov eax,13 - add ecx,1 + inc ecx shl ecx,16 add ecx,ed_height dec ecx - mcall -ret + mcall 13 + ret + ;---------------------------------------------------------- ;--- процедура получения количества символов в текущей ширине компонента ;---------------------------------------------------------- edit_box.get_n: - mov eax,ed_width ;получем ширину компонента - xor edx,edx ;результат располагается в паре edx:eax в eax - остаток - sub eax,4 ;вычтем 4 - mov ebx,6 ;загрузим делитель - div ebx ;разделим на 6 -ret + mov eax,ed_width + sub eax,4 + xor edx,edx + div word ed_char_width + ret + ;---------------------------------------------------------- ;--- процедура рисования курсора -------------------------- ;---------------------------------------------------------- @@ -294,33 +293,31 @@ edit_box.clear_cursor: mov ebx,cl_curs_x mov ecx,cl_curs_y jmp edit_box.draw_curs + edit_box.draw_cursor: - mov edx,ed_text_color - mov ebx,ed_pos - mov ecx,ed_offset - sub ebx,ecx - - lea ebx,[ebx*2+ebx] - shl ebx,1 - ;imul ebx,6 + mov eax,ed_pos + sub eax,ed_offset + mul dword ed_char_width + mov ebx,eax add ebx,ed_left - mov ecx,ed_top inc ebx - add ecx,2 - mov ebp,ebx + mov edx,ebx shl ebx,16 - mov bx,bp - mov ebp,ecx - + add ebx,edx + mov ecx,ed_top + add ecx,2 + mov edx,ecx shl ecx,16 - mov cx,bp - add ecx,ed_height-4 - + add ecx,edx + add ecx,ed_height + sub ecx,4 mov cl_curs_x,ebx mov cl_curs_y,ecx + mov edx,ed_text_color edit_box.draw_curs: mcall 38 -ret + ret + ;---------------------------------------------------------- ;--- процедура рисования рамки ---------------------------- ;---------------------------------------------------------- @@ -360,7 +357,8 @@ edit_box.draw_border: shl ebx,16 mov bx,bp mcall -ret + ret + ;---------------------------------------------------------- ;--- проверка, зашел ли курсор за границы и, если надо, --- ;--- изменяем смещение ------------------------------------ @@ -369,114 +367,110 @@ ret ; в общей битовой матрице состояния компонентов word ed_flags ;---------------------------------------------------------- edit_box.check_offset: -pushad + pushad mov ecx,ed_pos mov ebx,ed_offset cmp ebx,ecx ja edit_box.sub_8 - push ebx - call edit_box.get_n ;получим кол-во символов которые умещаются в ширине компонента, в паре регистров edx:eax + call edit_box.get_n pop ebx mov edx,ebx - add edx,eax ;ed_offset+width editbox - inc edx ;необходимо для нормального положения курсора в крайней левой позиции + add edx,eax + inc edx ;необходимо для нормального положения курсора в крайней левой позиции cmp edx,ecx ja @f - mov edx,ed_size cmp edx,ecx je edit_box.add_end - sub edx,ecx cmp edx,8 jbe edit_box.add_8 add ebx,8 jmp edit_box.chk_d +@@: or word ed_flags,ed_offset_fl + popad + ret + edit_box.sub_8: test ecx,ecx - jz edit_box.sub_min - cmp ebx,8 - jbe edit_box.sub_min + jz @f sub ebx,8 ;ebx=ed_offset - jmp edit_box.chk_d -edit_box.sub_min: + ja edit_box.chk_d +@@: xor ebx,ebx jmp edit_box.chk_d -edit_box.add_end:sub edx,eax +edit_box.add_end: + sub edx,eax mov ebx,edx jmp edit_box.chk_d -edit_box.add_8: add ebx,edx -edit_box.chk_d: mov ed_offset,ebx + +edit_box.add_8: + add ebx,edx +edit_box.chk_d: + mov ed_offset,ebx call edit_box.draw_bg and word ed_flags,ed_offset_cl -edit_ex -@@: - or word ed_flags,ed_offset_fl + popad + ret -edit_ex - -align 4 proc edit_box_set_text, edit:dword, text:dword -pushad - mov edi,dword[edit] - mov ecx,ed_max - inc ecx ;учитываем будущее обрезание строки для ascii 0 - mov edi,dword[text] - xor al,al + pushad + mov edi,[edit] + mov ecx,ed_max + inc ecx + mov edi,[text] + xor al,al cld - repne scasb ;поиск в строке edi символа al - mov ecx,edi ;ecx = text + мин. значение из: 1) ed_max или 2) длины строки text - - mov edi,dword[edit] - mov esi,dword[text] - sub ecx,esi ;ecx = длина строки text (но не больше чем ed_max) - dec ecx - mov ed_size,ecx ;ставим новый размер строки - mov ed_pos,ecx ;ставим курсор в конец новой строки - and word ed_flags,ed_shift_cl ;снимаем выделение если оно было - mov edi,ed_text - repne movsb ;копирование текстовой строки text в edit_box - mov byte[edi],0 ;ставим ascii 0 в конце строки -popad -ret + repne scasb + mov ecx,edi + mov edi,[edit] + mov esi,[text] + sub ecx,esi + dec ecx + mov ed_size,ecx + mov ed_pos,ecx + and word ed_flags,ed_shift_cl + mov edi,ed_text + repne movsb + mov byte[edi],0 + popad + ret endp } macro use_key_func { ;Обработка Shift для снятия выделения неизвестной области -edit_box_key.shift: ;;;;;;;SHIFT +edit_box_key.shift: call edit_box.draw_bg test word ed_flags,ed_shift je edit_box_key.f_exit - mov ebp,shift_color or word ed_flags,ed_shift_bac ;установка флага, выделенной области - mov ebx,dword ed_shift_pos + mov ebx,ed_shift_pos call edit_box_key.sh_cl_ jmp edit_box.draw_cursor_text -;;;;;;;;;;;;;;;;;;;;; + edit_box_key.f_exit: call edit_box.check_offset and word ed_flags,ed_shift_cl call edit_box_key.enable_null jmp edit_box.draw_cursor_text + edit_box_key.sh_cl_: -;;;;;;SHIFT end ;обработка очистки, при левом - правом движении выделения ;для обработки снятия выделения ;входные параметры ebp=color ebx=ed_shift_pos - mov eax,dword ed_pos + mov eax,ed_pos cmp eax,ebx - jae edit_box_key.sh_n push eax ;меньшее в eax push ebx ;большее jmp edit_box_key.sh_n1 - ;если иначе + edit_box_key.sh_n: push ebx push eax @@ -489,17 +483,16 @@ edit_box_key.sh_n1: mov edx,eax ;save pop ebx ;большее pop eax ;меньшее - cmp eax,ecx ;сравнение меньшего с offset. jae edit_box_key.f_f ;если больше xor eax,eax cmp edx,ebx ;cравним размер w_off с большим - jb @f - sub ebx,ecx - jmp edit_box_key.nxt_f -@@: mov ebx,edx + jnb @f + mov ebx,edx +@@: sub ebx,ecx jmp edit_box_key.nxt_f + edit_box_key.f_f: sub eax,ecx cmp edx,ebx ;cравним размер w_off с большим @@ -507,73 +500,60 @@ edit_box_key.f_f: sub ebx,ecx sub ebx,eax jmp edit_box_key.nxt_f -@@: - mov ebx,edx + +@@: mov ebx,edx sub ebx,ecx sub ebx,eax edit_box_key.nxt_f: - mov edx,ebx - lea ebx,[eax*2+eax] - shl ebx,1 + mul dword ed_char_width + xchg eax,ebx + mul dword ed_char_width add ebx,ed_left inc ebx shl ebx,16 - lea ecx,[edx*2+edx] - shl ecx,1 - mov bx,cx - inc ebx - mov edx,ebp;shift_color - + inc eax + mov bx, ax + mov edx,ebp ;shift_color call edit_box.draw_bg_eax -@@: call edit_box_key.enable_null - ret -;;;;;;;;;;;;;;;;;;;;; + jmp edit_box_key.enable_null + ;Установка- снятие выделения в один символ -;;;;;;;;;;;;;;;;;;;;; edit_box_key.drw_sim: - mov eax,dword ed_pos - call edit_box_key.draw_rectangle ;нарисовать прямоугольник с заданным цветом - jmp @b -;;;;;;;;;;;;;;;;;;;;; + mov eax,ed_pos + call edit_box_key.draw_rectangle + jmp edit_box_key.enable_null + ;Функция установки выделения при движении влево и вправо и нажатии shift -;Логика: -;;;;;;;;;; edit_box_key.draw_wigwag: -;функция установки переменных mov ebp,shift_color call edit_box.clear_cursor - or word ed_flags,ed_shift_bac ;установка флага выделенной области mov ebp,shift_color - mov eax,dword ed_pos + mov eax,ed_pos test word ed_flags,ed_left_fl - jz edit_box_key.low - jmp @f -;;;;;;;;;; + jnz edit_box_key.draw_rectangle + dec eax + jmp edit_box_key.draw_rectangle + ;Функция удаления выделения при движении влево и вправо и нажатии shift -;Логика: -;;;;;;;;;; edit_box_key.draw_wigwag_cl: -;функция установки переменных mov ebp,ed_color call edit_box.clear_cursor - mov ebp,ed_color - mov eax,dword ed_pos + mov eax,ed_pos test word ed_flags,ed_left_fl - jz edit_box_key.low -@@: call edit_box_key.draw_rectangle ;нарисовать прямоугольник закрашиваемой области - ret -edit_box_key.low: dec eax - jmp @b + jnz edit_box_key.draw_rectangle + dec eax + jmp edit_box_key.draw_rectangle + ;входной параметр ebx - ed_pos edit_box_key.sh_first_sh: test word ed_flags,ed_shift je @f - mov dword ed_shift_pos_old,ebx + mov ed_shift_pos_old,ebx test word ed_flags,ed_shift_on jne @f - mov dword ed_shift_pos,ebx + mov ed_shift_pos,ebx or word ed_flags,ed_shift_on @@: ret ;Обработка крайних положений в editbox при нажатом shift @@ -586,25 +566,23 @@ edit_box_key.sh_st_of: je @f call edit_box.draw_bg mov ebp,ed_color - mov ebx,dword ed_shift_pos + mov ebx,ed_shift_pos call edit_box_key.sh_cl_ ;очистка выделеного фрагмента and word ed_flags,ed_shift_cl ; очистка от того, что убрали выделение jmp edit_box.draw_cursor_text -@@: - and word ed_flags,ed_shift_off + +@@: and word ed_flags,ed_shift_off popad ret 4 ;проверка состояния shift, был ли он нажат раньше? edit_box_key.sh_enable: test word ed_flags,ed_shift jne edit_box_key.sh_ext_en ;нарисовать закрашенный прямоугольник - test word ed_flags,ed_shift_bac je @f call edit_box.check_offset - mov ebp,ed_color - mov ebx,dword ed_shift_pos + mov ebx,ed_shift_pos call edit_box_key.sh_cl_ ;очистка выделенного фрагмента call edit_box_key.draw_wigwag_cl and word ed_flags,ed_shift_cl ; 1вар не нужно @@ -612,16 +590,16 @@ edit_box_key.sh_enable: @@: mov ebp,ed_color call edit_box.clear_cursor - call edit_box.check_offset - ret + jmp edit_box.check_offset + edit_box_key.sh_ext_en: call edit_box.check_offset test word ed_flags,ed_offset_fl je @f ;Рисование закрашенных прямоугольников и их очистка - mov eax,dword ed_shift_pos - mov ebx,dword ed_pos - mov ecx,dword ed_shift_pos_old + mov eax,ed_shift_pos + mov ebx,ed_pos + mov ecx,ed_shift_pos_old ;проверка и рисование закрашенных областей cmp eax,ecx je edit_box_key.1_shem @@ -630,17 +608,21 @@ edit_box_key.sh_ext_en: ja edit_box_key.1_shem call edit_box_key.draw_wigwag_cl ;clear jmp edit_box_key.sh_e_end + edit_box_key.smaller: cmp ecx,ebx jb edit_box_key.1_shem call edit_box_key.draw_wigwag_cl ;clear jmp edit_box_key.sh_e_end -;alike = -edit_box_key.1_shem: call edit_box_key.draw_wigwag -edit_box_key.sh_e_end: and word ed_flags,ed_shift_off + +edit_box_key.1_shem: + call edit_box_key.draw_wigwag +edit_box_key.sh_e_end: + and word ed_flags,ed_shift_off ret + @@: mov ebp,shift_color - mov ebx,dword ed_shift_pos + mov ebx,ed_shift_pos call edit_box_key.sh_cl_ jmp edit_box_key.sh_e_end ;функция для обработки shift при нажатии home and end @@ -650,20 +632,21 @@ edit_box_key.sh_home_end: test word ed_flags,ed_shift_bac je @f mov ebp,ed_color - mov ebx,dword ed_shift_pos_old + mov ebx,ed_shift_pos_old call edit_box_key.sh_cl_ - -@@: test word ed_flags,ed_shift +@@: + test word ed_flags,ed_shift je edit_box_key.sh_exit_ ;выйти mov ebp,shift_color - mov ebx,dword ed_shift_pos + mov ebx,ed_shift_pos call edit_box_key.sh_cl_ or word ed_flags,ed_shift_bac ;установка флага, выделенной области jmp edit_box_key.sh_e_end + edit_box_key.sh_exit_: call edit_box.draw_bg - call edit_box.check_offset - ret + jmp edit_box.check_offset + ;функция внесения 0 по адресу ed_size+1 edit_box_key.enable_null: pusha @@ -675,54 +658,51 @@ edit_box_key.enable_null: inc eax @@: xor ebx,ebx mov [eax],bl -edit_ex + popad + ret + ;- удаление символа ;Входные данные edx=ed_size;ecx=ed_pos edit_box_key.del_char: mov esi,ed_text test word ed_flags,ed_shift_on je @f - mov eax,dword ed_shift_pos + mov eax,ed_shift_pos mov ebx,esi cmp eax,ecx jae edit_box_key.dh_n - mov ed_pos,eax ;чтобы не было убегания курсора mov ebp,ecx sub ebp,eax add ebx,eax ;eax меньше sub edx,ecx add esi,ecx - - mov dword ed_shift_pos,ebp + mov ed_shift_pos,ebp jmp edit_box_key.del_ch_sh - ;если иначе + edit_box_key.dh_n: mov ebp,eax sub ebp,ecx add ebx,ecx sub edx,eax add esi,eax - mov dword ed_shift_pos,ebp + mov ed_shift_pos,ebp jmp edit_box_key.del_ch_sh @@: add esi,ecx ;указатель + смещение к реальному буферу mov ebx,esi inc esi cld - sub edx,ecx edit_box_key.del_ch_sh: - push edi mov edi,ebx @@: lodsb stosb - dec edx - jns @b - - pop edi + dec edx + jns @b + pop edi ret ;вычислить закрашиваемую область ;соглашение в ebp - передается ed_size @@ -732,7 +712,6 @@ edit_box_key.clear_bg: mov ebx,ed_offset add eax,ebx ;eax = w_off= ed_offset+width mov ebx,ebp ;ed_size - cmp eax,ebx jb @f mov eax,ed_pos @@ -740,11 +719,11 @@ edit_box_key.clear_bg: mov ecx,ed_offset sub eax,ecx jmp edit_box_key.nxt + @@: mov ebx,ed_pos push ebx sub eax,ebx mov ebx,eax ;It is not optimal - pop eax ;ed_pos mov ecx,ed_offset sub eax,ecx @@ -755,19 +734,18 @@ edit_box_key.nxt: cmp ebp,edx je @f inc ebx - -@@: mov edx,ebx - lea ebx,[eax*2+eax] - shl ebx,1 +@@: + mul dword ed_char_width + xchg eax,ebx + mul dword ed_char_width add ebx,ed_left inc ebx shl ebx,16 - lea ecx,[edx*2+edx] - shl ecx,1 - mov bx,cx + inc eax + mov bx, ax mov edx,ed_color - call edit_box.draw_bg_eax - ret + jmp edit_box.draw_bg_eax + ;;;;;;;;;;;;;;;;;;; ;;; Обработка примитивов ;;;;;;;;;;;;;;;;;;;; @@ -776,22 +754,21 @@ edit_box_key.nxt: ;eax=dword ed_pos ;ebp=-цвет ed_color or shift_color edit_box_key.draw_rectangle: - mov ecx,dword ed_offset - sub eax,ecx - lea ebx,[eax*2+eax] - shl ebx,1 - inc ebx - add ebx,ed_left - shl ebx,16 - add ebx,6 + sub eax,ed_offset + mul dword ed_char_width + add eax,ed_left + inc eax + shl eax,16 + add eax,ed_char_width + mov ebx,eax mov edx,ebp - call edit_box.draw_bg_eax - ret + jmp edit_box.draw_bg_eax + ;;;;;;;;;;;;;;;;;; ;;Проверка нажат ли shift ;;;;;;;;;;;;;;;;;; edit_box_key.check_shift_ctrl_alt: -pusha ;сохраним все регистры + pusha mcall 66,3 test al,11b je @f @@ -806,7 +783,9 @@ pusha ; test al,110000b je @f or word ed_flags,ed_alt_on ;установим флаг Alt -@@:edit_ex +@@: + popad + ret } macro use_key_no_process up,down,esc,enter,tab,numl,capsl,scrolll @@ -836,25 +815,21 @@ else cmp ah,9 ;TAB - клавиша )) jz edit_box.editbox_exit end if - if numl eq else cmp ah,4 ;Num Lock - клавиша )) jz edit_box.editbox_exit end if - if capsl eq else cmp ah,2 ;Caps Lock - клавиша )) jz edit_box.editbox_exit end if - if scrolll eq else cmp ah,1 ;Scroll Lock - клавиша )) jz edit_box.editbox_exit end if - } macro use_key_figures_only @@ -867,32 +842,31 @@ macro use_key_figures_only ja edit_box.editbox_exit @@: } + macro are_key_shift_press { test word ed_flags,ed_shift_on je @f - ;Входные данные edx=ed_size;ecx=ed_pos +; edx = ed_size, ecx = ed_pos push eax mov edx,ed_size mov ecx, ed_pos pusha -;;;;;;;;;;;;;;;;;;;;; -;clear input arrea +; clear input area mov ebp,ed_color - mov ebx,dword ed_shift_pos + mov ebx,ed_shift_pos call edit_box_key.sh_cl_ mov ebp,ed_size call edit_box_key.clear_bg -;;;;;;;;;;;;;;;;;;;;; popa call edit_box_key.del_char -;;;; mov ebx,ed_size - sub ebx,dword ed_shift_pos + sub ebx,ed_shift_pos mov ed_size,ebx pop eax @@: } + macro are_key_cur_end { mov ecx,ed_size @@ -903,76 +877,65 @@ macro are_key_cur_end jae edit_box.editbox_exit @@: mov ebx, ed_pos cmp ebx,edx - jl @f ; если меньше или равно - jmp edit_box.editbox_exit - -@@: ; сдвигаем символы после курсора вправо + jnl edit_box.editbox_exit mov ecx,ed_size push edi eax mov ebp,edi - mov esi,ed_text ; Указатель на буфер - ;Будем работать со строкой - add esi,ecx ;add ed_size добавим max size + mov esi,ed_text + add esi,ecx mov edi,esi - - cmp ecx,ebx ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце + cmp ecx,ebx je edit_box_key.In_k - - test dword bp_flags,ed_insert ;IF insert is enabled т.к. edi изменен, адресуем через ebp + test dword bp_flags,ed_insert jne edit_box_key.ins_v -;clear -pusha + pusha mov edi,ebp mov ebp,ed_size call edit_box_key.clear_bg -popa - sub ecx,ebx ;Найдем кол-во символов для передвижения. - inc edi ;Сместим наши символы вправо + popa + sub ecx,ebx + inc edi std inc ecx - @@: - ;-------- +@@: lodsb stosb - ;-------- loop @b edit_box_key.In_k: cld - pop eax - mov al,ah + pop eax + mov al,ah stosb - pop edi -; вставляем код клавиши туда, где курсор - ; увеличиваем значение размера и позиции - inc dword ed_size - inc dword ed_pos + pop edi + inc dword ed_size + inc dword ed_pos call edit_box_key.draw_all2 jmp edit_box_key.shift } + macro use_work_key { -edit_box_key.insert: test word ed_flags,ed_insert ;not word ed_insert - je @f - and word ed_flags,ed_insert_cl +edit_box_key.insert: + test word ed_flags,ed_insert + je @f + and word ed_flags,ed_insert_cl + jmp edit_box.editbox_exit +@@: or word ed_flags,ed_insert jmp edit_box.editbox_exit -@@: - or word ed_flags,ed_insert - jmp edit_box.editbox_exit + edit_box_key.ins_v: -; dec dword [ebp+48];ed_size ;processing is insert dec dword bp_size sub esi,ecx add esi,ebx mov edi,esi -;clear -pusha + pusha mov edi,ebp mov ebp,ed_pos call edit_box_key.clear_bg -popa + popa jmp edit_box_key.In_k -;;;;;;;;;;;;;;;;;;;;;;;;;;;; + edit_box_key.delete: mov edx,ed_size mov ecx,ed_pos @@ -982,15 +945,14 @@ edit_box_key.delete: jne edit_box_key.del_bac popad ret 4 + edit_box_key.bac_del: call edit_box_key.del_char jmp edit_box_key.draw_all -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;--- нажата клавиша backspace --- + edit_box_key.backspace: test word ed_flags,ed_shift_on jne edit_box_key.delete - ; проверяем, курсор у левого края? mov ecx,ed_pos test ecx,ecx jnz edit_box_key.del_bac @@ -1005,33 +967,29 @@ edit_box_key.del_bac: call edit_box_key.del_char @@: test word ed_flags,ed_shift_on jne edit_box_key.bac_del - dec dword ed_pos + dec dword ed_pos edit_box_key.draw_all: - push edit_box_key.shift;.draw_cursor_text;eax - + push edit_box_key.shift test word ed_flags,ed_shift_on je @f - mov eax,dword ed_shift_pos + mov eax,ed_shift_pos mov ebx,ed_size sub ebx,eax mov ed_size,ebx - mov ebp,ed_color call edit_box.clear_cursor call edit_box.check_offset - call edit_box.draw_bg - ret -@@: dec dword ed_size + jmp edit_box.draw_bg +@@: dec dword ed_size edit_box_key.draw_all2: - and word ed_flags,ed_shift_cl + and word ed_flags,ed_shift_cl mov ebp,ed_color call edit_box.clear_cursor call edit_box.check_offset mov ebp,ed_size - call edit_box_key.clear_bg - ret -;;;;;;;;;;;;;;;;;;;;;;;;;;;; + jmp edit_box_key.clear_bg + ;--- нажата клавиша left --- edit_box_key.left: mov ebx,ed_pos @@ -1039,12 +997,12 @@ edit_box_key.left: jz edit_box_key.sh_st_of or word ed_flags,ed_left_fl call edit_box_key.sh_first_sh - dec dword ed_pos + dec dword ed_pos call edit_box.draw_bg call edit_box.draw_shift call edit_box_key.sh_enable jmp edit_box.draw_cursor_text -;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;--- нажата клавиша right --- edit_box_key.right: mov ebx,ed_pos @@ -1052,12 +1010,12 @@ edit_box_key.right: je edit_box_key.sh_st_of and word ed_flags,ed_right_fl call edit_box_key.sh_first_sh - inc dword ed_pos + inc dword ed_pos call edit_box.draw_bg call edit_box.draw_shift call edit_box_key.sh_enable jmp edit_box.draw_cursor_text -;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + edit_box_key.home: mov ebx,ed_pos test ebx,ebx @@ -1069,10 +1027,11 @@ edit_box_key.home: call edit_box.draw_shift call edit_box_key.sh_home_end jmp edit_box.draw_cursor_text -;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;--- нажата клавиша end --- edit_box_key.end: mov ebx,ed_pos - cmp ebx,dword ed_size + cmp ebx,ed_size je edit_box_key.sh_st_of call edit_box_key.sh_first_sh mov eax,ed_size @@ -1081,7 +1040,7 @@ edit_box_key.end: call edit_box.draw_shift call edit_box_key.sh_home_end jmp edit_box.draw_cursor_text -;----------------------------------------------------------------------------- + edit_box_key.ctrl_c: ; add memory area mov ecx,ed_size @@ -1112,20 +1071,18 @@ edit_box_key.ctrl_c: pop ecx ; remove unnecessary memory area mcall 68,13 -;-------------------------------------- .exit: jmp edit_box.editbox_exit -;----------------------------------------------------------------------------- + edit_box_key.ctrl_v: mcall 54,0 ; no slots of clipboard ? test eax,eax jz .exit -; main list area not found ? +; main list area not found ? inc eax test eax,eax jz .exit - sub eax,2 mov ecx,eax mcall 54,1 @@ -1137,24 +1094,20 @@ edit_box_key.ctrl_v: sub eax,2 test eax,eax jz .exit - inc eax ; check contents of container mov ebx,[eax+4] ; check for text test ebx,ebx jnz .no_valid_text - mov ebx,[eax+8] ; check for cp866 cmp bl,1 jnz .no_valid_text - mov ecx,[eax] sub ecx,3*4 cmp ecx,ed_max jb @f - mov ecx,ed_max @@: mov esi,eax @@ -1167,106 +1120,84 @@ edit_box_key.ctrl_v: @@: lodsb cmp al,0x0d ; EOS (end of string) - je .replace - + je .replace cmp al,0x0a ; EOS (end of string) jne .continue .replace: mov al,0x20 ; space -.continue: +.continue: stosb dec ecx jnz @b -; rep movsb pop edi eax -;-------------------------------------- .no_valid_text: ; remove unnecessary memory area mov ecx,eax mcall 68,13 -;-------------------------------------- .exit: - jmp edit_box.draw_1 + jmp edit_box.draw_bg_cursor_text } macro use_mouse_func { -;---------------------------------------------------------- -;--- Обработка .mouse_wigwag -;---------------------------------------------------------- edit_box_mouse.mouse_wigwag: push eax call edit_box.draw_bg call edit_box.draw_shift pop eax - shr eax,16 or word ed_flags,ed_shift_bac+ed_shift_on+ed_shift -;;;;;;;;;;;;;;;;;; -;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox -;;;;;;;;;;;;;;;;;; - test ax,0x8000 - jnz edit_box_mouse.mleft - - mov ebx,ed_left - cmp eax,ebx - jb edit_box_mouse.mleft - - add ebx,ed_width - cmp eax,ebx - ja edit_box_mouse.mright - - sub ebx,ed_width - +;Обработка положения выделенного текста, когда происходит выход за пределы editbox + test eax,eax + js edit_box_mouse.mleft + shr eax,16 + sub eax,ed_left + jc edit_box_mouse.mleft + cmp ed_width,eax + jc edit_box_mouse.mright xor edx,edx - sub eax,ebx ; вычтем из координат мышки по оси х координаты до editbox по оси х - mov ebx,6 - div ebx -;;;;;;;;;;;;;;;;;; -;;процедура обработки положения выделенного текста, в пределах области editbox -;;;;;;;;;;;;;;;;;; + div word ed_char_width +;Обработка положения выделенного текста, в пределах области editbox ;Получили координаты в eax мышки, т.е. куда она переместилась ;Рисование закрашенных прямоугольников и их очистка - add eax,ed_offset ;добавим смещение - cmp eax,dword ed_size ;если вышли за пределы, то ничего не делать + add eax,ed_offset + cmp eax,ed_size ja edit_box_mouse.mwigvag edit_box_mouse.mdraw: - mov dword ed_pos,eax ;сохраним новое значение + mov ed_pos,eax ;Рисование закрашенных прямоугольников и их очистка - mov ecx,dword ed_shift_pos - mov ebx,dword ed_shift_pos_old - mov dword ed_shift_pos_old,eax ;внесем новое значение старой позиции курсора + mov ecx,ed_shift_pos + mov ebx,ed_shift_pos_old + mov ed_shift_pos_old,eax ;проверка и рисование закрашенных областей - cmp ecx,ebx ;выясняем куда было движение на один шаг назад - je edit_box_mouse.m1_shem ;движения не было ранее - jb edit_box_mouse.msmaller ;движение было -> - cmp ebx,eax ;движение было до этого <- и тут мы проверяем сейчас куда движение происходит - ja edit_box_mouse.m1_shem ;если было движение <- то нужно закрасить область - je edit_box_mouse.mwigvag ;если изменения не было, то ничего не делать - mov ebp,ed_color ;тут нужно очистить область c ed_pos ed_shift_pos_old -;входные параметры ebp=color ebx=ed_shift_pos - call edit_box_key.sh_cl_ + cmp ecx,ebx + je edit_box_mouse.m1_shem ;движения не было ранее + jb edit_box_mouse.msmaller ;было движение -> + cmp ebx,eax + ja edit_box_mouse.m1_shem ;было движение <- + je edit_box_mouse.mwigvag + mov ebp,ed_color + call edit_box_key.sh_cl_ ;очистить область c ed_pos ed_shift_pos_old jmp edit_box_mouse.mwigvag + edit_box_mouse.msmaller: cmp ebx,eax jb edit_box_mouse.m1_shem mov ebp,ed_color -;входные параметры ebp=color ebx=ed_shift_pos call edit_box_key.sh_cl_ jmp edit_box_mouse.mwigvag -;alike = + edit_box_mouse.m1_shem: mov ebp,shift_color -;входные параметры ebp=color ebx=ed_shift_pos mov ebx,ecx call edit_box_key.sh_cl_ - jmp edit_box_mouse.mwigvag edit_box_mouse.mwigvag: and word ed_flags,ed_shift_mcl jmp edit_box.draw_cursor_text + edit_box_mouse.mleft: mov eax,ed_pos cmp eax,0 - jbe edit_box_mouse.mwigvag + jbe edit_box_mouse.mwigvag dec eax call edit_box.check_offset push eax @@ -1275,6 +1206,7 @@ edit_box_mouse.mleft: call edit_box_key.sh_cl_ pop eax jmp edit_box_mouse.mdraw + edit_box_mouse.mright: mov eax,ed_pos mov ebx,ed_size @@ -1291,35 +1223,25 @@ edit_box_mouse.mright: } macro use_work_mouse -;---------------------------------------------------------- -;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны? -;---------------------------------------------------------- +; Не удерживаем ли мы клавишу мышки, перемещая курсор? { test word ed_flags,ed_mouse_on jne edit_box_mouse.mouse_wigwag -;---------------------------------------------------------- -;--- проверяем, попадает ли курсор в edit box ------------- -;---------------------------------------------------------- +; проверяем, попадает ли курсор в edit box mov ebx,ed_top cmp ax,bx - jl edit_box_mouse._blur;.mouse_end_no_focus - + jl edit_box_mouse._blur add ebx,ed_height cmp ax,bx - jg edit_box_mouse._blur;.mouse_end_no_focus - + jg edit_box_mouse._blur shr eax,16 - mov ebx,ed_left cmp ax,bx - jl edit_box_mouse._blur;.mouse_end_no_focus - + jl edit_box_mouse._blur add ebx,ed_width - cmp ax,bx - jg edit_box_mouse._blur;.mouse_end_no_focus - -;--- изменяем позицию курсора --- + jg edit_box_mouse._blur +; изменяем позицию курсора push eax mov ebp,ed_color call edit_box.clear_cursor @@ -1327,22 +1249,17 @@ macro use_work_mouse edit_box_mouse._mvpos: xor edx,edx sub eax,ed_left - - mov ebx,6 - div bx + div word ed_char_width add eax,ed_offset cmp eax,ed_size jna edit_box_mouse._mshift mov eax,ed_size - edit_box_mouse._mshift: -;;;;;;; -;;Секция обработки shift и выделения по shift -;;;;;;; +; секция обработки shift и выделения по shift test word ed_flags,ed_shift_bac je @f - mov ebp,dword ed_color - mov ebx,dword ed_shift_pos + mov ebp,ed_color + mov ebx,ed_shift_pos push eax call edit_box_key.sh_cl_ and word ed_flags,ed_shift_bac_cl @@ -1350,56 +1267,46 @@ edit_box_mouse._mshift: @@: test word ed_flags,ed_mouse_on jne @f - mov dword ed_shift_pos,eax + mov ed_shift_pos,eax or word ed_flags,ed_mouse_on - mov dword ed_pos,eax - mov ebx,dword ed_mouse_variable + mov ed_pos,eax + mov ebx,ed_mouse_variable push edi pop dword [ebx] - bts word ed_flags,1 ;установка фокуса + bts word ed_flags,1 call edit_box.draw_bg jmp edit_box_mouse.m_sh -@@: - cmp eax,dword ed_shift_pos ;если позиции не изменились + +@@: cmp eax,ed_shift_pos je edit_box.editbox_exit mov ed_pos,eax call edit_box.draw_bg - mov ebp,dword shift_color - mov ebx,dword ed_shift_pos + mov ebp,shift_color + mov ebx,ed_shift_pos call edit_box_key.sh_cl_ - or word ed_flags,ed_mous_adn_b ;установим бит, что мы выделили +shift_on + + or word ed_flags,ed_mous_adn_b edit_box_mouse.m_sh: call edit_box.draw_text call edit_box.draw_cursor -;---------------------------------------------------------- -;--- процедура установки фокуса --------------------------- -;---------------------------------------------------------- +; процедура установки фокуса jmp edit_box_mouse.drc + edit_box_mouse._blur: test word ed_flags,ed_always_focus jne edit_box.editbox_exit btr word ed_flags,1 ; если не в фокусе, выходим jnc edit_box.editbox_exit - mov ebp,ed_color call edit_box.clear_cursor -edit_box_mouse.drc: call edit_box.draw_border +edit_box_mouse.drc: + call edit_box.draw_border jmp edit_box.editbox_exit } - -; Макрос выхода -macro edit_ex -{ -popad -ret -} macro debug { ;----------- отладка pushad -; mov dword [ed_buffer.2],0 -; mov eax,edi mov eax,dword [ed_buffer.2] mov edi,ed_buffer.3 call .str @@ -1441,4 +1348,4 @@ macro debug_func ret ;вернуться очень интересный ход, т.к. пока в стеке хранится кол-во вызовов, то столько раз мы и будем вызываться } -ed_struc_size=76 +ed_struc_size=84