From d39179352334b4c44ac18f5c3ae0668d699e4958 Mon Sep 17 00:00:00 2001 From: theonlymirage Date: Fri, 21 Sep 2018 23:46:18 +0000 Subject: [PATCH] Hot Angles: transition to a components from the library box_lib git-svn-id: svn://kolibrios.org@7402 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/other/ha/HACONFIG | Bin 0 -> 3992 bytes programs/other/ha/HACONFIG.ASM | 120 +++- programs/other/ha/ReadMe.txt | 7 +- programs/other/ha/check.inc | 204 ------ programs/other/ha/editbox.inc | 271 -------- programs/other/ha/editbox.mac | 1145 -------------------------------- 6 files changed, 92 insertions(+), 1655 deletions(-) create mode 100644 programs/other/ha/HACONFIG delete mode 100644 programs/other/ha/check.inc delete mode 100644 programs/other/ha/editbox.inc delete mode 100644 programs/other/ha/editbox.mac diff --git a/programs/other/ha/HACONFIG b/programs/other/ha/HACONFIG new file mode 100644 index 0000000000000000000000000000000000000000..2742aeccaf868fd0abbfad70630507973b4ccdb4 GIT binary patch literal 3992 zcmeHJZ){Ul6u;X#=>BvA-4KG#hG0Mw_Ai*s5#i0T4G4^G-NtaqO2^u@u&qn`9$TZB zE>9w(G1&(`%mfpbsv(F(6HMB^SjuV!L#IOgrXNHxc}xAUNMZ&qJb&lDj^cy?pXH|a z_T1k&_uTX6zI)G}y2jSJmhy@W#@IN9AD?6FmkoLc#9Qmg??K5JT$OWOtZNG%FY?! z3{3voP!Si1!UmS0lz;3mvE;L3adC}BlZ@)C5Qnzxk^1@M%w@xROj-NXgps5Vgd4G& z@*akW3qzE+TC35X(iUtrR>WcMTDh8ut28NJt5o3_gYs;7!kD}ne8V8mX;LOx!Zo(- zBNvb6SH#bqmzKe`xn!1nMYDAhzs%?NmBEuTvSFzP)2vOwJw`n&`4F8J_IIR=vNkmb z_vFJgom<4YZxWkZaNk1HeGAnyM#l6Nc^nRx<4?)L5IF~*q8mBtngv&FzN=|D@xo&Y zFxN2l*NTfUhDk<2R$-2sfu-s-Qku&Fc`ie&mFF_WI(aTj9CEn|XxR!Zb6rT2tnePX zJ5B0aJP+CA7wS>yOr8yAa;+&f`Drzr)YWiOS3~5CSJSlcO1>^IpCK&|W3EjLf%!}+ zTO9*FV*y~TYiZfp*kCQ&vA3nBv0- zOun2OAznBKgF*=RwjKm`4*N<4;b({mg`8Ql#YF7E%;Z&DC-$~jxs6H)I=P{P3Azr@BIdN)@n8gTqx}cL<0&!JS3+Ojd6-bh{r{xDTO4&gR>d7 zk5gPiJVF6X+Y<{P4EHY#r7VJPn;!=$_uf&MO&WMjnFOcA+-&Q!4iHwL2 znMml;jTO#Ff<@t5QB3>bc;Mmz+`!X9s^l@IOCC<@B@ZX{l82Le<+K{IiiNdgM2gsH zM)tGVx5`NW@~>)A#Yac*D7q8~$3Y-^e?C-UWq zt$}JL-O@urx~GK%Z9Y#W3tE?F$cC!6)YEl{tp{F?E}&b`51h6c^L6_s;VJxU*qnxD0wr;O|u#%&T8M4jjxRCqg z(K~RMFlsF>x6h29-Mqsinrr%ddL2G*OFVUZV>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;DATA фрээ√х фы  check_box1 - шёяюы№чєхЄ ёшёЄхьэ√х ЎтхЄр ;╘юЁьрЄ фрээ√ї ўхъ сюъёр: ; ъююЁфшэрЄр ї, ъююЁфшэрЄр є, єърчрЄхы№ эр эрўрыю ёЄЁюъш, фышэр ёЄЁюъш ;ёюёЄю эшх ЁрсюЄ√ єЄшышЄ√: ръЄштэр/эхЄ -check_boxes: - ch1 check_box1 30,160,ch_text.1,ch_text.e1-ch_text.1,ch_flag_en -check_boxes_end: +;check_boxes: +; ch1 check_box1 30,160,ch_text.1,ch_text.e1-ch_text.1,ch_flag_en +;check_boxes_end: + +;ъююЁфшэрЄ√ (x,y) = (30, 160) ЁрчьхЁ ўхъсюъёр 12, ЎтхЄ ЄхъёЄр 0x224466 +ch1 check_box2 30 shl 16 + 12, 160 shl 16 + 12, 6, 0xFFFFFFFF, 0xAABBCC, 0x224466, ch_text, 110b ; ch_flag_en and ch_flag_middle if lang eq ru ;хёыш  ч√ъ ёсюЁъш Ёєёёъшщ @@ -605,9 +651,10 @@ buttonText db " buttonTextSize = 9 buttonTextXoffset = 12 -ch_text: ;ёюяЁютюцфр■∙шщ ЄхъёЄ фы  ўхъ сюъёют -.1 db 'Включить/активировать "Hot Angles"' -.e1: +ch_text db 'Включить/активировать "Hot Angles"', 0 +;ch_text: ;ёюяЁютюцфр■∙шщ ЄхъёЄ фы  ўхъ сюъёют +;.1 db 'Включить/активировать "Hot Angles"' +;.e1: superText: .lu db 'Команда левого верхнего угла: ', 0 @@ -627,9 +674,9 @@ buttonText db "Apply", 0 buttonTextSize = 5 buttonTextXoffset = 0 -ch_text: ;ёюяЁютюцфр■∙шщ ЄхъёЄ фы  ўхъ сюъёют -.1 db 'Activate "Hot Angles"' -.e1: +ch_text db 'Activate "Hot Angles"',0 ;ёюяЁютюцфр■∙шщ ЄхъёЄ фы  ўхъ сюъёр +;.1 db 'Activate "Hot Angles"',0 +;.e1: superText: .lu db 'Left up angle command: ', 0 @@ -669,18 +716,24 @@ draw_super_text: ret -edMaxSize = 510 +edMaxSize = 510 ;ЄхяхЁ№ ё эют√ь ъюьяюэхэЄюь ьюцэю ш 511 єърчрЄ№ edMax = 0 ;max, size, pos -editboxes: -editLU edit_box 180,Otstup,85,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.1,ed_focus,edMax,edMax -editLD edit_box 180,Otstup,120,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.2,0,edMax,edMax -editRU edit_box 180,240,85,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.3,0,edMax,edMax -editRD edit_box 180,240,120,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.4,0,edMax,edMax -editboxes_end: +align 4 +editLU edit_box 180,Otstup,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.1, mouse_dd, 0, edMax, edMax ;ed_focus +editLD edit_box 180,Otstup,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.2, mouse_dd, 0, edMax, edMax +editRU edit_box 180,240,85, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.3, mouse_dd, 0, edMax, edMax +editRD edit_box 180,240,120, 0xffffff, 0x6a9480, 0, 0xAABBCC, 0, edMaxSize, dataBuffer.4, mouse_dd, 0, edMax, edMax -data_of_code dd 0 -mouse_flag dd 0x0 +;editboxes: +;editLU edit_box 180,Otstup,85,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.1,ed_focus,edMax,edMax +;editLD edit_box 180,Otstup,120,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.2,0,edMax,edMax +;editRU edit_box 180,240,85,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.3,0,edMax,edMax +;editRD edit_box 180,240,120,0xffffff,0x6a9480,0,0xAABBCC,0,edMaxSize,dataBuffer.4,0,edMax,edMax +;editboxes_end: + +;data_of_code dd 0 +;mouse_flag dd 0x0 dataBuffer: .1: rb 512 @@ -695,6 +748,7 @@ dataBuffer: ;фтр чрярёэ√ї срщЄр эхюсїюфшь√ фы  Єюую ўЄю с√ эх яхяхЁхяшёрЄ№ ёыхфє■∙шхщ срщЄ√, т ъюэЎх сєЇхЁр 0 dataBufferEnd: +mouse_dd dd ? sc system_colors I_END: diff --git a/programs/other/ha/ReadMe.txt b/programs/other/ha/ReadMe.txt index be708a694d..9e691c534d 100644 --- a/programs/other/ha/ReadMe.txt +++ b/programs/other/ha/ReadMe.txt @@ -37,9 +37,12 @@ Hot Angles [-] чэръ ьшэєё эх тыш хЄ эр яюя√Єъє чряєёър т ъюэъЁхЄэюь єуыє; [-] яєёЄюх яюых т ъюэЇшуєЁрЄюЁх ш яєёЄр  ёЄЁюър т ъюэЇшуєЁрЎшюээюь Їрщых эхтхЁэю юсЁрсрЄ√тр■Єё ; [-] яютЁхцфхэшх Їрщыр ъюэЇшуєЁрЎшш яюёых ьэюуюъЁрЄэюую тъы./т√ъы. юяЎшш Hot Angles; -[-] Ёрчьрч√трэшх ЄхъёЄр шыш хую эрёыюхэшх яЁш ттюфх т яюых EditBox'р; +[-] Ёхцшь  тэющ ъюьрэф√ ъыртш°хщ ръЄштрЎшш: чрцшьрхь уюЁ ўє■ ъыртш°є (эряЁшьхЁ, shift), эртюфшь ъєЁёюЁ т єуюы - яЁюшёїюфшЄ ЁхръЎш ; +[-] Ёхцшь цхёЄр/эряЁртыхэш : чрцшьрхь ръЄштшЁє■∙є■ ъыртш°є, яюёых ¤Єюую яЁшыюцхэшх рэрышчшЁєхЄ ь√°№, т чртшёшьюёЄш юЄ эряЁртыхэш  фтшцхэш  ь√°ш (юЄ эрўры№э√ї ъююЁфшэрЄ т ьюьхэЄ ръЄштрЎшш юяЎшш) т√сшЁрхЄё  ръЄштшЁєхь√щ єуюы - яЁюшёїюфшЄ ЁхръЎш ; +[+] яхЁхїюф эр EditBox шч сшсышюЄхъш box_lib; +[+] Ёрчьрч√трэшх ЄхъёЄр шыш хую эрёыюхэшх яЁш ттюфх т яюых EditBox'р; [+] яюёых чряєёър яЁшыюцхэш , тёх яюы  эрїюф Єё  т Їюъєёх (¤Єю Їшўр шч-чр срур т ъюьяюэхэЄх EditBox); -[-] яЁшёєЄёЄтєхЄ эхшёяЁртыхээ√щ сру т ъюьяюэхэЄх EditBox; +[+] яЁшёєЄёЄтєхЄ эхшёяЁртыхээ√щ сру т ъюьяюэхэЄх EditBox; [+] яЁшыюцхэшх ъюэЇшуєЁрЄюЁр эх фюсртыхэю т ёшёЄхьэє■ ярэхы№. ╬сючэрўхэш : diff --git a/programs/other/ha/check.inc b/programs/other/ha/check.inc deleted file mode 100644 index f15df6bbb0..0000000000 --- a/programs/other/ha/check.inc +++ /dev/null @@ -1,204 +0,0 @@ -;Оптимизированный компонент CheckBox (Исходный вариант от Maxxxx32) -;Оптимизирован вывод строки надписи для CheckBox'a + теперь, при проверке не происходит подсчет кол-ва символов в строке -;Оптимизация команд - отказался от сохранения регистров в стеке. -;21.02.2007 добавил код от Heavyiron, дописал макросы для использования системных цветов -;19.02.2007 общее улучшение кода, уменьшение размера и использование системных цветов для отображения checkbox -;17.07.2006 произведена оптимизация, при установке чек бокса в положение включено последующие чек боксы в тот же промежуток времени не проверяются -;22.08.2006 произведена оптимизация команд, приняты во внимание замечания DIAMOND'а. -; - Теплов Алексей www.lrz.land.ru - -macro version_ch ;для совместимости со старыми версиями checkbox все цвета задаются ручками -{ -ch_struc_size=24 -ch_left equ [edi] ;координата начала рисования по х -ch_top equ [edi+2] ;координата начала рисования по у -ch_color equ [edi+4] -ch_border_color equ [edi+8] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно -ch_text_color equ [edi+12];[edi+4] ;цвет текста -ch_text_ptr equ [edi+16] ;указатель на начало текстовой строки -ch_text_length equ [edi+20] ;длина надписи (2^64 такой длины может быть текст) -ch_flags equ [edi+22] ;флаги -} - -macro version_ch1 ;продвинутая версия, использует цвета скина. -{ -ch_struc_size=12 -ch_left equ [edi] ;координата начала рисования по х -ch_top equ [edi+2] ;координата начала рисования по у -ch_color equ [sc.work] ; -ch_border_color equ [sc.work_graph] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно -ch_text_color equ [sc.work_text];[edi+4] ;цвет текста -ch_text_ptr equ [edi+4] ;указатель на начало текстовой строки -ch_text_length equ [edi+8] ;длина надписи (2^64 такой длины может быть текст) -ch_flags equ [edi+10] ;флаги -} - -macro use_check_box -{ -ch_text_margin=4 ;расстояние от прямоугольника чек бокса до надписи -ch_size=11 ;размер квадрата чек бокса -check_box: -.draw: - pusha ;сохраним все регистры - mov eax,13 - mov ebx,ch_left - shl ebx,16 - add ebx,ch_size - mov ecx,ch_top - shl ecx,16 - add ecx,ch_size - mov edx,ch_border_color - mcall ;рисуем рамку - - mov edx,ch_color - add ebx,1 shl 16 - 2 - add ecx,1 shl 16 - 2 - mcall ;закрашиваем внутренности чекбокса - - test word ch_flags,2 ;достать значение бита из переменной и поместить в флаг CF - jz @f ;в если CF=1, то выполним следующую процедуру иначе перейти на нижнюю @@ - call .draw_ch ;нарисовать включенный чек бокс -@@: -;---------------------------- -;расчет куда будет произведен вывод текста -;---------------------------- - movzx ebx,word ch_left ;загрузить значение х для чек бокса - add ebx,(ch_size+ch_text_margin) ;добавить размер стороны и расстояние на котором начнется вывод текста - shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - mov bx,ch_top ;загрузим значение по y - add ebx,(ch_size-9+1) ;добавим значение длины стороны -9+1 - mov ecx,ch_text_color ;загрузим цвет надписи - - mov edx,ch_text_ptr ;укажем адрес от куда нужно выводить строку - movzx esi,word ch_text_length ;Загрузим длину надписи в esi - ;внесем в eax значение вывода надписи на канву - mov eax,4 - mcall ;Вывод -popa ;восстановить значения регистров из стека -ret ;выйдем из процедуры - -.clear_ch: ;очистка чек бокса - mov edx,ch_color ;цвет внутри чек бокса - jmp @f ;безусловный прыжок на нижнюю метку @@ - -.draw_ch: ;нарисовать включенный чек бокс - mov edx,ch_border_color ;загрузить цвет -@@: - movzx ebx,word ch_left ;загрузить координату по х - add ebx,(ch_size/3) ;добавить (сторона прямоугольника/3) - shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - mov bx,(ch_size/2) ;загрузить (сторона прямоугольника/2) - mov bp,bx ;сохраним регистр bx в регистре указателя базы - ;push bx - movzx ecx,word ch_top ;загрузить координату по у - mov eax,13 ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс - add ecx,(ch_size/3) ;добавить (сторона прямоугольника/3) - shl ecx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - mov cx,bp ;загрузим значения регистра указателя базы в cx - ;pop cx - mcall ;вывод -ret ;выйти из процедуры -.mouse: ;обработка мыши -pusha - mov eax,37 ;будем что то делать если у нас что - нить нажато - mov ebx,2 ;внести в регистр значение 2 - mcall ;проверка не нажал ли пользователь кнопку мышки - test eax,eax ;проверка если у нас в eax=0, то установим флаг и выйдем - jnz @f ;перейти на нижнюю метку @@ - btr word ch_flags,2 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое. - popa ;если ничего не произошло, то восстановим значения регистров из стека - ret ;выход -@@: - bts word ch_flags,2 ;проверка флага т.е. перенос в cf значение бита и установка бита в состояние включено - jc .mouse_end ;если CF=1 то перейти в конец т.е. это выход - movzx esi,word ch_text_length ;загрузить кол-во символов в текстовой строке - ;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea - ;lea esi,[eax*2+eax] - ;shl eax,1 - imul esi,6 ; или можно и так умножить на 6 - add esi,ch_text_margin ;добавить 3 - расстояние от чек бокса до надписи - - mov eax,37 ;получим координаты мышки - mov ebx,1 ;добавить 1 - mcall ;получить координаты курсора относительно окна - - movzx ebx,word ch_top ;загрузить в bx значение координаты у - cmp ax,bx ;сравнить с с координатой курсора - jl .mouse_end ;SF <> OF если меньше - add ebx,ch_size ;добавить размер - cmp ax,bx ;сравнить - jg .mouse_end ;ZF = 0 и SF = OF если больше - - shr eax,16 ;разделим на 65536 или просто сдвинем биты на 16 значений - movzx ebx,word ch_left ;произведем аналогичное сравнение - cmp ax,bx ;сравнить регистры - jl .mouse_end ;если меньше - add ebx,ch_size ;добавить длину стороны прямоугольника - add ebx,esi ;Учесть в значении по х еще и длину надписи к чекбоксу - cmp ax,bx ;стравнить регистры - jg .mouse_end ;если больше - - bts word ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на 1. - jc @f ;CF=1 то перейти на нижнюю @@ - - call .draw_ch ;отобразить включенный чек бокс - mov dword [esp+24],1 ;дальнейшая проверка чек боксов бесмыслена, по этому в стек, где располагается ecx поместитм 0 - jmp .mouse_end ;выйти -@@: - btr word ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое. - call .clear_ch ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона. -.mouse_end: -popa ;восстановить регистры из стека -ret ;выйти -} - -struc check_box1 left,top,text,text_length,flags -{ ;структура параметров для чек бокса -.left: dw left ;+0 положение по х -.top: dw top ;+2 положение по у -.text: dd text ;+16 адрес в коде программы где расположен текстр -.text_length: dw text_length ;+20 длина текста -.flags: dw flags+0 ;+22 флаги -} -struc check_box left,top,color,border_color,text_color,text,text_length,flags -{ ;структура параметров для чек бокса -.left: dw left ;+0 ;положение по х -.top: dw top ;положение по у -.color: dd color ;цвет внутри чекбокса -.border_color: dd border_color ;цвет рамки -.text_color: dd text_color ;цвет надписи -.text: dd text ;адрес в коде программы где расположен текст -.text_length: dw text_length ;длина текста -.flags: dw flags+0 ;+22 -} -ch_flag_en=10b - -macro draw_check_boxes start,end ;рисовать чек боксы -{ - mov edi,start ;Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса - mov ecx,((end-start)/ch_struc_size) ;Количество чек боксов -@@: - call check_box.draw ;Отобразить чек бокс - add edi,ch_struc_size ;Указатель на последующие чек боксы т.е. +28 - loop @b ;прыгнуть если в ecx/cx значение не 0 на верхнюю @@ -} -macro mouse_check_boxes start,end ;установка чек боксов, в зависимости от события -{ - mov edi,start ; Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса - mov ecx,((end-start)/ch_struc_size) ;Количество чек боксов -@@: - call check_box.mouse ;проверка мышки и обработка событий - add edi,ch_struc_size ;Указатель на последующие чек боксы - loop @b ;прыгнуть если в ecx/cx значение не 0 на верхнюю @@ -} -;Если нужно отобразить один чекер -macro draw_check_box start ;рисовать чек боксы -{ - mov edi,start ;Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса - call check_box.draw ;Отобразить чек бокс -} -macro mouse_check_box start ;установка чек боксов, в зависимости от события -{ - mov edi,start ; Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса - call check_box.mouse ;проверка мышки и обработка событий -} \ No newline at end of file diff --git a/programs/other/ha/editbox.inc b/programs/other/ha/editbox.inc deleted file mode 100644 index ab9b98d8d6..0000000000 --- a/programs/other/ha/editbox.inc +++ /dev/null @@ -1,271 +0,0 @@ -; SEE YOU File FAQ.txt and HISTORY. Good Like! -;;;;;;;;;;;;;;;;;; -include 'editbox.mac' ;макрос который должен облегчить жизнь :) специально для editbox -;;;;;;;;;;;;;;;;;; -macro use_edit_box -{ -edit_box: -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_flags equ [edi+40] ;флаги -ed_size equ [edi+44] ;кол-во символов -ed_pos equ [edi+48] ;позиция курсора -ed_offset equ [edi+52] ;смещение -cl_curs_x equ [edi+56] ;предыдущее координата курсора по х -cl_curs_y equ [edi+60] ;предыдущее координата курсора по у -ed_shift_pos equ [edi+64] ;положение курсора -ed_shift_pos_old equ [edi+68] ;старое положение курсора -;========================================================== -;=== процедура прорисовки ================================= -;========================================================== -.draw: -pushad -;--- рисуем рамку --- - call .draw_border ; Функция стабильна -.draw_bg_cursor_text: -;--- изменяем смещение, если надо --- - call .check_offset ;вычисление позиции курсора стабильна -;--- рисуем внутреннюю область --- - call .draw_bg ;нарисовать прямоугольник рабочей области -;---- рисуем выделение, по shift если есть - call .draw_shift -.draw_cursor_text: -;--- рисуем курсор --- - ;--- может его не надо рисовать ---- - test word ed_flags,ed_focus - je @f - call .draw_cursor -@@: - call .draw_text -;;;;;;;;;;;;;;;;;;;;;;;;;; -;Общий выход из editbox для всех функций и пост обработчиков -;;;;;;;;;;;;;;;;;;;;;;;;;; -.editbox_exit: -edit_ex -;========================================================== -;=== обработка клавиатуры ================================= -;========================================================== -.key: -pushad - test word ed_flags,ed_focus ; если не в фокусе, выходим - je .editbox_exit - test word ed_flags,ed_mouse_on - jne .editbox_exit - -;Проверка нажат shift ? - call .check_shift -;---------------------------------------------------------- -;--- проверяем, что нажато -------------------------------- -;---------------------------------------------------------- -use_key_process backspase,delete,left,right,home,end,insert -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Заглушка на обработку клавиш вверх и вниз т.е. при обнаружении этих кодов происходит выход из обработчика -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -use_key_no_process up,down,esc,enter,tab,numl,capsl,scrolll -;--- нажата другая клавиша --- -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Проверка установлен ли флаг при котором нужно выводить только цифры в нужном боксе если такойнеобходимости нет нужно закоментировать макрос -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -use_key_figures_only -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;проверка на shift был ли нажат -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -are_key_shift_press -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; проверяем, находится ли курсор в конце + дальнейшая обработка -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -are_key_cur_end -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Обработка клавиш insert,delete.backspase,home,end,left,right -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -use_work_key -;========================================================== -;=== обработка мыши ======================================= -;========================================================== -.mouse: -pushad -;debug -;---------------------------------------------------------- -;--- получаем состояние кнопок мыши ----------------------- -;---------------------------------------------------------- - mcall 37,2 -;---------------------------------------------------------- -;--- проверяем состояние ---------------------------------- -;---------------------------------------------------------- - test eax,1 - jnz .mouse_left_button - and word ed_flags,ed_mouse_on_off - xor ebx,ebx - mov dword [mouse_flag],ebx - jmp .editbox_exit -.mouse_left_button: -;---------------------------------------------------------- -;--- блокировка от фокусировки в других боксах при попадании на них курсора -;---------------------------------------------------------- - mov eax,dword [mouse_flag] - test eax,eax - jz @f - cmp eax,edi - je @f - jmp ._blur -;---------------------------------------------------------- -;--- получаем координаты мыши относительно окна -;---------------------------------------------------------- -@@: mcall 37,1 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Функция обработки мышки получение координат и проверка их + выделения -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -use_work_mouse -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Общие функции обработки -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -use_general_func -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Функции для работы с key -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -use_key_func -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Функции для работы с mouse -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -use_mouse_func -} -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Bit mask from editbox -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -ed_figure_only= 1000000000000000b ;одни символы -ed_always_focus= 100000000000000b -ed_focus= 10b ;фокус приложения -ed_shift_on= 1000b ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift -ed_shift_on_off=1111111111110111b -ed_shift= 100b ;включается при нажатии на shift т.е. если нажимаю -ed_shift_off= 1111111111111011b -ed_shift_bac= 10000b ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение -ed_shift_bac_cl=1111111111101111b ;очистка при удалении выделения -ed_shift_cl= 1111111111100011b -ed_shift_mcl= 1111111111111011b -ed_left_fl= 100000b -ed_right_fl= 1111111111011111b -ed_offset_fl= 1000000b -ed_offset_cl= 1111111110111111b -ed_insert= 10000000b -ed_insert_cl= 1111111101111111b -ed_mouse_on = 100000000b -ed_mous_adn_b= 100011000b -ed_mouse_on_off=1111111011111111b -ed_height=14 ; высота -macro draw_edit_boxes start,_end -{ - mov edi,start - mov ecx,((_end-start)/ed_struc_size) -@@: - call edit_box.draw - add edi,ed_struc_size - loop @b -} - -macro mouse_edit_boxes start,_end -{ - mov edi,start - mov ecx,((_end-start)/ed_struc_size) -@@: - call edit_box.mouse - add edi,ed_struc_size - loop @b -} - -macro key_edit_boxes start,end -{ - mov edi,start - mov ecx,((end-start)/ed_struc_size) -@@: - call edit_box.key - add edi,ed_struc_size - loop @b -} -ed_struc_size=72 -struc edit_box width,left,top,color,shift_color,focus_border_color,\ - blur_border_color,text_color,max,text,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 -.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 -} - - -macro edit_boxes_set_sys_color start,end,color_table -{ - mov edi,start - mov ecx,((end-start)/ed_struc_size) - mov esi,color_table -@@: - mov eax,[esi+36] - mov ebx,[esi+20] - mov ed_focus_border_color,eax - shr bh,1 - shr bl,1 - shr ah,1 - shr al,1 - add ah,bh - add al,bl - ror eax,16 - ror ebx,16 - shr bl,1 - shr al,1 - add al,bl - ror eax,16 - mov ed_blur_border_color,eax - add edi,ed_struc_size - loop @b -} - -macro draw_edit_box ed_ptr -{ - mov edi,ed_ptr - call edit_box.draw -} - -macro mouse_edit_box ed_ptr -{ - mov edi,ed_ptr - call edit_box.mouse -} - -macro key_edit_box ed_ptr -{ - mov edi,ed_ptr - call edit_box.key -} -macro default_box ed_ptr -{ -pusha -; xor eax,eax -; mov ed_shift_pos,eax -; mov ed_shift_pos_old,eax - and word ed_flags,ed_shift_cl -; mov ed_offset,eax -popa -} \ No newline at end of file diff --git a/programs/other/ha/editbox.mac b/programs/other/ha/editbox.mac deleted file mode 100644 index 8a672b7e45..0000000000 --- a/programs/other/ha/editbox.mac +++ /dev/null @@ -1,1145 +0,0 @@ -;Макрос для вывода основных функций которые испльзуются боксом -macro use_general_func -{ -;debug_func -;---------------------------------------------------------- -;--- процедура прорисовки выделеной части ----------------- -;---------------------------------------------------------- -.draw_shift: - test word ed_flags,ed_shift_bac ;установка флага, выделенной области - jz @f - mov ebp,shift_color - mov ebx,dword ed_shift_pos - call .sh_cl_ -@@: ret -;---------------------------------------------------------- -;--- процедура прорисовки текста -------------------------- -;---------------------------------------------------------- -.draw_text: -;--- вычисляем, сколько помещается символов --- -;--- чтобы мусор не рисовать --- - call .get_n - mov esi,ed_size - mov ebx,ed_offset - sub esi,ebx - cmp eax,esi - jae @F - mov esi,eax ;чтобы не выходить за пределы экрана -;--- рисуем текст --- -@@: mov eax,4 - mov ebx,ed_left - mov edx,ed_offset - add ebx,2 - shl ebx,16 - add ebx,ed_top - mov ecx,ed_text_color - add ebx,4 - add edx,ed_text - mcall -ret -;---------------------------------------------------------- -;--- процедура прорисовки фона ---------------------------- -;входные данные -;eax -;edx - color -;---------------------------------------------------------- -;вход только цвет edx -.draw_bg: - mov ebx,ed_left - add ebx,1 - mov edx,ed_color - shl ebx,16 - add ebx,ed_width - sub ebx,1 -.draw_bg_eax: - mov ecx,ed_top - mov eax,13 - add ecx,1 - shl ecx,16 - add ecx,ed_height - dec ecx - mcall -ret -;---------------------------------------------------------- -;--- процедура получения количества символов в текущей щирине компонента -;---------------------------------------------------------- -.get_n: - mov eax,ed_width ;получем ширину компонента - xor edx,edx ;результат распологается в паре edx:eax в eax - остаток - sub eax,4 ;вычтим 4 - mov ebx,6 ;загрузми делитель - div ebx ;размделим на 6 -ret -;---------------------------------------------------------- -;--- процедура рисования курсора -------------------------- -;---------------------------------------------------------- -;входные ebp- цвет -.clear_cursor: - mov edx,ebp - mov ebx,cl_curs_x - mov ecx,cl_curs_y - jmp .draw_curs -.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 - add ebx,ed_left - mov ecx,ed_top - inc ebx - add ecx,2 - mov ebp,ebx - shl ebx,16 - mov bx,bp - mov ebp,ecx - - shl ecx,16 - mov cx,bp - add ecx,ed_height-4 - - mov cl_curs_x,ebx - mov cl_curs_y,ecx -.draw_curs: - mcall 38 -ret -;---------------------------------------------------------- -;--- процедура рисования рамки ---------------------------- -;---------------------------------------------------------- -.draw_border: -;--- цвет рамки --- - test word ed_flags,ed_focus - mov edx,ed_focus_border_color - jne @f - mov edx,ed_blur_border_color -@@: -;--- сверху --- - mov eax,38 - mov ebx,ed_left - mov ecx,ebx - shl ebx,16 - mov bx,cx - add ebx,ed_width - mov ecx,ed_top - mov esi,ecx - shl ecx,16 - mov cx,si - mcall -;--- снизу --- - mov esi,ecx - add ecx,ed_height - mov ebp,ecx - shl ecx,16 - mov cx,bp - mcall -;--- слева --- - mov cx,si - mov ebp,ebx - sub ebx,ed_width - mcall -;--- справа --- - mov ebx,ebp - shl ebx,16 - mov bx,bp - mcall -ret -;---------------------------------------------------------- -;--- проверка, зашел ли курсор за границы и, если надо, --- -;--- изменяем смещение ------------------------------------ -;--- если смещение было установка флага ed_offset_cl иначе -; если ничего не изменилось то выставление ed_offset_fl -; в общей битовой маррице состояния компонентов word ed_flags -;---------------------------------------------------------- -.check_offset: -pusha - mov ecx,ed_pos - mov ebx,ed_offset - cmp ebx,ecx - ja .sub_8 - - push ebx - call .get_n ;получим кол-во символов в паре регистров edx:eax - pop ebx - mov edx,ebx - add edx,eax ;ed_offset+width editbox - inc edx ;необходимо для номального положения курсора в крайней левой позиции - cmp edx,ecx - ja @f - - mov edx,ed_size - cmp edx,ecx - je .add_end - - sub edx,ecx - cmp edx,8 - jbe .add_8 - add ebx,8 - jmp .chk_d - -.sub_8: cmp ecx,0 - je .sub_min - cmp ebx,8 - jbe .sub_min - sub ebx,8 ;ebx=ed_offset - jmp .chk_d -.sub_min: - xor ebx,ebx - jmp .chk_d - -.add_end:sub edx,eax - mov ebx,edx - jmp .chk_d -.add_8: add ebx,edx -.chk_d: mov ed_offset,ebx - call .draw_bg - and word ed_flags,ed_offset_cl -edit_ex -@@: - or word ed_flags,ed_offset_fl -edit_ex -} - -macro use_key_func -{ -;Обработка Shift для снятия выделения неизвестной области -.shift: ;;;;;;;SHIFT - test word ed_flags,ed_shift - je .f_exit - -@@: mov ebp,shift_color - or word ed_flags,ed_shift_bac ;установка флага, выделенной области - mov ebx,dword ed_shift_pos - call .sh_cl_ - jmp .draw_cursor_text -;;;;;;;;;;;;;;;;;;;;; -.f_exit:call .check_offset - and word ed_flags,ed_shift_cl - call .enable_null - jmp .draw_cursor_text -.sh_cl_: -;;;;;;SHIFT end -;обработка очистки, при левом - правом движении выделения -;для обработки снятия выделения -;входные параметры ebp=color ebx=ed_shift_pos - mov eax,dword ed_pos - cmp eax,ebx - - jae .sh_n - push eax ;меньшее в eax - push ebx ;большее - jmp .sh_n1 - ;если иначе -.sh_n: push ebx - push eax -.sh_n1: - call .check_offset - call .get_n - mov edx,eax ;size of ed_box - mov ecx,ed_offset - add eax,ecx ;eax = w_off= ed_offset+width - mov edx,eax ;save - pop ebx ;большее - pop eax ;меньшее - - cmp eax,ecx ;сравнение с меньшего с offset. - jae .f_f ;если больше - xor eax,eax - cmp edx,ebx ;cравним размер w_off с большим - jb @f - sub ebx,ecx - jmp .nxt_f -@@: mov ebx,edx - sub ebx,ecx - jmp .nxt_f -.f_f: - sub eax,ecx - cmp edx,ebx ;cравним размер w_off с большим - jle @f - sub ebx,ecx - sub ebx,eax - jmp .nxt_f -@@: - mov ebx,edx - sub ebx,ecx - sub ebx,eax -.nxt_f: - mov edx,ebx - lea ebx,[eax*2+eax] - shl ebx,1 - 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 - - call .draw_bg_eax -@@: call .enable_null - ret -;;;;;;;;;;;;;;;;;;;;; -;Установка- снятие выделения в один символ -;;;;;;;;;;;;;;;;;;;;; -.drw_sim: - mov eax,dword ed_pos - call .draw_rectangle ;нарисовать прямоугольник с заданным цветом - jmp @b -;;;;;;;;;;;;;;;;;;;;; -;Фукция установки выделения при движения влево и вправо и нажатии shift -;Логика: -;;;;;;;;;; -.draw_wigwag: -;функция установки переменных - mov ebp,shift_color - call .clear_cursor - - or word ed_flags,ed_shift_bac ;установка флага, выделенной области - mov ebp,shift_color - mov eax,dword ed_pos - test word ed_flags,ed_left_fl - jz .low - jmp @f -;;;;;;;;;; -;Фукция удаления выделения при движения влево и вправо и нажатии shift -;Логика: -;;;;;;;;;; -.draw_wigwag_cl: -;функция установки переменных - mov ebp,ed_color - call .clear_cursor - - mov ebp,ed_color - mov eax,dword ed_pos - test word ed_flags,ed_left_fl - jz .low -@@: call .draw_rectangle ;нарисовать прямоугольник закрашиваемой области - ret -.low: dec eax - jmp @b -;входной параметр ebx - ed_pos -.sh_first_sh: - test word ed_flags,ed_shift - je @f - mov dword ed_shift_pos_old,ebx - test word ed_flags,ed_shift_on - jne @f - mov dword ed_shift_pos,ebx - or word ed_flags,ed_shift_on -@@: ret -;Обработка крайних положений в editbox при нажатом shift -;производит снятие выделение, если нет shift -;иначе вообще выходит -.sh_st_of: - test word ed_flags,ed_shift - jne @f - test word ed_flags,ed_shift_bac - je @f - mov ebp,ed_color - mov ebx,dword ed_shift_pos - call .sh_cl_ ;очистка выделеного фрагмента - and word ed_flags,ed_shift_cl ; очистка от того что убрали выделение - jmp .draw_cursor_text -@@: - and word ed_flags,ed_shift_off -edit_ex -;проверка состояния shift был ли он нажат раньше? -.sh_enable: - test word ed_flags,ed_shift - jne .sh_ext_en ;нарисовать закрашеный прямоугольник - - test word ed_flags,ed_shift_bac - je @f - call .check_offset - - mov ebp,ed_color - mov ebx,dword ed_shift_pos - call .sh_cl_ ;очистка выделеного фрагмента - call .draw_wigwag_cl - and word ed_flags,ed_shift_cl ; 1вар не нужно - ret - -@@: mov ebp,ed_color - call .clear_cursor - call .check_offset - ret -.sh_ext_en: - call .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 -;проверка и рисование закрашеных областей - cmp eax,ecx - je .1_shem - jb .smaller - cmp ecx,ebx - ja .1_shem - call .draw_wigwag_cl ;clear - jmp .sh_e_end -.smaller: - cmp ecx,ebx - jb .1_shem - call .draw_wigwag_cl ;clear - jmp .sh_e_end -;alike = -.1_shem: call .draw_wigwag -.sh_e_end: and word ed_flags,ed_shift_off - ret -@@: mov ebp,shift_color - mov ebx,dword ed_shift_pos - call .sh_cl_ - jmp .sh_e_end -;функция для обработки shift при нажатии home and end -.sh_home_end: - mov ebp,ed_color - call .clear_cursor - test word ed_flags,ed_shift_bac - je @f - mov ebp,ed_color - mov ebx,dword ed_shift_pos_old - call .sh_cl_ - -@@: test word ed_flags,ed_shift - je .sh_exit_ ;выйти - mov ebp,shift_color - mov ebx,dword ed_shift_pos - call .sh_cl_ - or word ed_flags,ed_shift_bac ;установка флага, выделенной области - jmp .sh_e_end -.sh_exit_: call .check_offset - ret -;функция внесения 0 по адресу ed_size+1 -.enable_null: - pusha - mov eax,ed_size - mov ebx,ed_text - test eax,eax - add eax,ebx - jne @f - inc eax -@@: xor ebx,ebx - mov [eax],bl -edit_ex -;- удаление символа -;Входные данные edx=ed_size;ecx=ed_pos -.del_char: - mov esi,ed_text - test word ed_flags,ed_shift_on - je @f - mov eax,dword ed_shift_pos - mov ebx,esi - cmp eax,ecx - jae .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 - jmp .del_ch_sh - ;если иначе -.dh_n: - mov ebp,eax - sub ebp,ecx - add ebx,ecx - sub edx,eax - add esi,eax - mov dword ed_shift_pos,ebp - jmp .del_ch_sh - -@@: add esi,ecx ;указатель + смещение к реальному буфферу - mov ebx,esi - inc esi - cld - - sub edx,ecx -.del_ch_sh: - - push edi - mov edi,ebx -@@: - lodsb - stosb - dec edx - jns @b - - pop edi - ret -;вычислить закрашиваемую область -;соглашение в ebp - передается ed_size -.clear_bg: - call .get_n ;получить размер в символах ширины компонента - push eax - 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 - sub ebx,eax - mov ecx,ed_offset - sub eax,ecx - jmp .nxt -@@: mov ebx,ed_pos - push ebx - sub eax,ebx - mov ebx,eax ;It is don't optimal - - pop eax ;ed_pos - mov ecx,ed_offset - sub eax,ecx -.nxt: - mov ebp,eax ;проверка на выход закрашиваемой области за пределы длины - add ebp,ebx - pop edx - cmp ebp,edx - je @f - inc ebx - -@@: mov edx,ebx - lea ebx,[eax*2+eax] - shl ebx,1 - add ebx,ed_left - inc ebx - shl ebx,16 - lea ecx,[edx*2+edx] - shl ecx,1 - mov bx,cx - mov edx,ed_color - call .draw_bg_eax - ret -;;;;;;;;;;;;;;;;;;; -;;; Обработка примитивов -;;;;;;;;;;;;;;;;;;;; -;Нарисовать прямоугольник, цвет передается в ebp -;входные параметры: -;eax=dword ed_pos -;ebp=-цвет ed_color or shift_color -.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 - mov edx,ebp - call .draw_bg_eax - ret -;;;;;;;;;;;;;;;;;; -;;Проверка нажат ли shift -;;;;;;;;;;;;;;;;;; -.check_shift: -pusha ;сохраним все регистры - mcall 66,3 - test al,0x03 - je @f - or word ed_flags,ed_shift ;установим флаг -@@:edit_ex -} -;макрос клавиш на которые происходит реакция -macro use_key_process backspase,delete,left,right,home,end,insert -{ -if backspase eq -else - cmp ah,8 - jz .backspace -end if -if delete eq -else - cmp ah,0xb6 - jz .delete -end if -if left eq -else - cmp ah,176 - jz .left -end if -if right eq -else - cmp ah,179 - jz .right -end if -if home eq -else - cmp ah,180 - jz .home -end if -if home eq -else - cmp ah,181 - jz .end -end if -if insert eq -else - cmp ah,185 ;insert - jz .insert -end if -} -macro use_key_no_process up,down,esc,enter,tab,numl,capsl,scrolll -{ -if up eq -else - cmp ah,177 - jz edit_box.editbox_exit -end if -if down eq -else - cmp ah,178 - jz edit_box.editbox_exit -end if -if esc eq -else - cmp ah,27 ;ESC - клавиша )) - jz edit_box.editbox_exit -end if -if enter eq -else - cmp ah,13 ;ENTER - клавиша )) - jz edit_box.editbox_exit -end if -if tab eq -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 -{ - test word ed_flags,ed_figure_only ; только цифры ? - jz @f - cmp ah,'0' - jb .editbox_exit - cmp ah,'9' - ja .editbox_exit -@@: -} -macro are_key_shift_press -{ - test word ed_flags,ed_shift_on - je @f - ;Входные данные edx=ed_size;ecx=ed_pos - push eax - mov edx,ed_size - mov ecx, ed_pos - pusha -;;;;;;;;;;;;;;;;;;;;; -;clear input arrea - mov ebp,ed_color - mov ebx,dword ed_shift_pos - call .sh_cl_ - mov ebp,ed_size - call .clear_bg -;;;;;;;;;;;;;;;;;;;;; - popa - call .del_char -;;;; - mov eax,dword ed_shift_pos - mov ebx,ed_size - sub ebx,eax - mov ed_size,ebx - pop eax -@@: -} -macro are_key_cur_end -{ - mov ecx,ed_size - mov edx, ed_max - test word ed_flags,ed_insert - jne @f - cmp ecx,edx - jae .editbox_exit -@@: mov ebx, ed_pos - cmp ebx,edx - jl @f ; если меньше или равно - jmp .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 edi,esi - - cmp ecx,ebx ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце - je .In_k - - test word [ebp+40],ed_insert ;IF insert is enable т.к. edi изменен адресуем через ebp - jne .ins_v -;clear -pusha - mov edi,ebp - mov ebp,ed_size - call .clear_bg -popa - sub ecx,ebx ;Найдем кол-во символов для передвижения. - inc edi ;Сместим наши символы в право - std - inc ecx - @@: - ;-------- - lodsb - stosb - ;-------- - loop @b -.In_k: cld - pop eax - mov al,ah - stosb - pop edi -; вставляем код клавиши туда, где курсор - ; увеличиваем значение размера и позиции - inc dword ed_size - inc dword ed_pos - call .draw_all2 - jmp .shift -} -macro use_work_key -{ -.insert: test word ed_flags,ed_insert ;not word ed_insert - je @f - and word ed_flags,ed_insert_cl - jmp .editbox_exit -@@: - or word ed_flags,ed_insert - jmp .editbox_exit -.ins_v: - dec dword [ebp+42];ed_size ;processing is insert - sub esi,ecx - add esi,ebx - mov edi,esi -;clear -pusha - mov edi,ebp - mov ebp,ed_pos - call .clear_bg -popa - jmp .In_k -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -.delete: - mov edx,ed_size - mov ecx,ed_pos - cmp edx,ecx - jg .bac_del - test word ed_flags,ed_shift_on - jne .del_bac -edit_ex -.bac_del: - call .del_char - jmp .draw_all -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;--- нажата клавиша backspace --- -.backspace: - ; проверяем, курсор у левого края ? - mov ecx,ed_pos - test ecx,ecx - jnz .del_bac - test word ed_flags,ed_shift_on - jne .bac_del - -edit_ex -.del_bac: - mov edx,ed_size - cmp edx,ecx ;if ed_pos=ed_size - je @f - dec ecx - call .del_char -@@: test word ed_flags,ed_shift_on - jne .bac_del - dec dword ed_pos -.draw_all: - push .shift;.draw_cursor_text;eax - - test word ed_flags,ed_shift_on - je @f - mov eax,dword ed_shift_pos - mov ebx,ed_size - sub ebx,eax - mov ed_size,ebx - - mov ebp,ed_color - call .clear_cursor - call .check_offset - call .draw_bg - ret -@@: dec dword ed_size - -.draw_all2: - and word ed_flags,ed_shift_cl - mov ebp,ed_color - call .clear_cursor - call .check_offset - mov ebp,ed_size - call .clear_bg - ret -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;--- нажата клавиша left --- -.left: mov ebx,ed_pos - test ebx,ebx - jz .sh_st_of - or word ed_flags,ed_left_fl - call .sh_first_sh - dec dword ed_pos - call .sh_enable - jmp .draw_cursor_text -;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;--- нажата клавиша right --- -.right: mov ebx,ed_pos - cmp ebx,ed_size - je .sh_st_of - and word ed_flags,ed_right_fl - call .sh_first_sh - inc dword ed_pos - call .sh_enable - jmp .draw_cursor_text -;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -.home: - mov ebx,ed_pos - test ebx,ebx - jz .sh_st_of - call .sh_first_sh - xor eax,eax - mov ed_pos,eax - call .sh_home_end - jmp .draw_cursor_text -;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -.end: - mov ebx,ed_pos - cmp ebx,dword ed_size - je .sh_st_of - call .sh_first_sh - mov eax,ed_size - mov ed_pos,eax - call .sh_home_end - jmp .draw_cursor_text -} - -macro use_mouse_func -{ -;---------------------------------------------------------- -;--- Обработка .mouse_wigwag -;---------------------------------------------------------- -.mouse_wigwag: - shr eax,16 - or word ed_flags,ed_shift_bac+ed_shift_on+ed_shift -;;;;;;;;;;;;;;;;;; -;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox -;;;;;;;;;;;;;;;;;; - test ax,0x8000 - jnz .mleft - - mov ebx,ed_left - cmp eax,ebx - jb .mleft - - add ebx,ed_width - cmp eax,ebx - ja .mright - - sub ebx,ed_width - - xor edx,edx - sub eax,ebx ; вычтим из координат мышки по оси х координаты до editbox по оси х - mov ebx,6 - div ebx -;;;;;;;;;;;;;;;;;; -;;процедура обработки положения выделенного текста, в пределах области editbox -;;;;;;;;;;;;;;;;;; -;Получили координаты в eax мышки, т.е. куда она переместилась -;Рисование закрашеных прямоугольников и очистка их - add eax,ed_offset ;добавим смещение - cmp eax,dword ed_size ;если вышли за пределы, то ничего не делать - ja .mwigvag -.mdraw: - mov dword ed_pos,eax ;сохраним новое значение -;Рисование закрашеных прямоугольников и очистка их - mov ecx,dword ed_shift_pos - mov ebx,dword ed_shift_pos_old - mov dword ed_shift_pos_old,eax ;внесем новое значение старой позиции курсора -;проверка и рисование закрашеных областей - cmp ecx,ebx ;выясняем куда было движение на один шаг назад - je .m1_shem ;движения не было ранее - jb .msmaller ;движение было -> - cmp ebx,eax ;движение было до этого <- и тут мы проверяем сейчас куда движение происходит - ja .m1_shem ;если было движение <- то нужно закрасить область - je .mwigvag ;если изменения не было, то ничего не делать - mov ebp,ed_color ;тут нужно очистить область c ed_pos ed_shift_pos_old -;входные параметры ebp=color ebx=ed_shift_pos - call .sh_cl_ - jmp .mwigvag -.msmaller: - cmp ebx,eax - jb .m1_shem - mov ebp,ed_color -;входные параметры ebp=color ebx=ed_shift_pos - call .sh_cl_ - jmp .mwigvag -;alike = -.m1_shem: - mov ebp,shift_color -;входные параметры ebp=color ebx=ed_shift_pos - mov ebx,ecx - call .sh_cl_ - jmp .mwigvag -.mwigvag: - and word ed_flags,ed_shift_mcl - jmp .draw_cursor_text -; popa -; ret -.mleft: - - mov eax,ed_pos - cmp eax,0 - jbe .mwigvag - dec eax - call .check_offset - push eax - mov ebx,ed_shift_pos - mov ebp,shift_color - call .sh_cl_ - pop eax - jmp .mdraw -.mright: - mov eax,ed_pos - mov ebx,ed_size - cmp eax,ebx - jae .mwigvag - inc eax - call .check_offset - mov ebx,ed_shift_pos - mov ebp,shift_color - push eax - call .sh_cl_ - pop eax - jmp .mdraw -} - -macro use_work_mouse -;---------------------------------------------------------- -;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны? -;---------------------------------------------------------- -{ - test word ed_flags,ed_mouse_on - jne .mouse_wigwag -;---------------------------------------------------------- -;--- проверяем, попадает ли курсор в edit box ------------- -;---------------------------------------------------------- - - mov ebx,ed_top - cmp ax,bx - jl ._blur;.mouse_end_no_focus - - add ebx,ed_height - cmp ax,bx - jg ._blur;.mouse_end_no_focus - - shr eax,16 - - mov ebx,ed_left - cmp ax,bx - jl ._blur;.mouse_end_no_focus - - add ebx,ed_width - - cmp ax,bx - jg ._blur;.mouse_end_no_focus - -;--- изменяем позицию курсора --- - push eax - mov ebp,ed_color - call .clear_cursor - pop eax -._mvpos: - - xor edx,edx - sub eax,ed_left - - mov ebx,6 - div bx - add eax,ed_offset - cmp eax,ed_size - jna ._mshift - mov eax,ed_size -._mshift: -;;;;;;; -;;Секция обработки shift и выделения по shift -;;;;;;; - test word ed_flags,ed_shift_bac - je @f - mov ebp,dword ed_color - mov ebx,dword ed_shift_pos - push eax - call .sh_cl_ - and word ed_flags,ed_shift_bac_cl - pop eax -@@: - test word ed_flags,ed_mouse_on - jne @f - - mov dword ed_shift_pos,eax - or word ed_flags,ed_mouse_on - mov dword ed_pos,eax - mov dword [mouse_flag],edi ;установим идентификатор - bts word ed_flags,1 ;установка фокуса - jmp .m_sh -@@: - cmp eax,dword ed_shift_pos ;если позиции не изменились - je .editbox_exit - mov ed_pos,eax - mov ebp,dword shift_color - mov ebx,dword ed_shift_pos - call .sh_cl_ - or word ed_flags,ed_mous_adn_b ;установим бит что мы выделили +shift_on + -.m_sh: call .draw_text - call .draw_cursor -;---------------------------------------------------------- -;--- процедура установки фокуса --------------------------- -;---------------------------------------------------------- - jmp .drc -._blur: - test word ed_flags,ed_always_focus - jne .editbox_exit - btr word ed_flags,1 ; если не в фокусе, выходим - jnc .editbox_exit - - mov ebp,ed_color - call .clear_cursor -.drc: call .draw_border - jmp .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 - ;рисование фона - mov eax,13 - mov ebx,178*65536+70 - mov ecx,28*65536+10 - xor edx,edx - int 0x40 - ;вывод значения на экран - mov eax,4 - mov ebx,180*65536+30 - mov ecx,0x10DDBBCC - mov edx,ed_buffer.3 - mov esi,8 - int 0x40 - popad - ;----------- отладка -} -macro debug_func -{ -.str: - mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число - ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной - cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax - jb @f - xor edx,edx ;очистить edx - div ecx ;разделить - остаток в edx - push edx ;положить в стек - ;dec edi ;смещение необходимое для записи с конца строки - call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx - pop eax - @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) - ;sbb al,$69 ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает - ;das ;после данной команды как бы происходит уменьшение al на 66h (в книге написано другое) - or al,0x30 ;данная команда короче чем две выше - stosb ;записать элемент из регистра al в ячеку памяти es:edi - - ret ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться -} - -;;;;;;;;;;;;;;; -;For LibGui -;;;;;;;;;;;;;;; -macro srt_ed_libgui -{ -ed_width equ [EditBox.ed_width] ;ширина компонента -ed_left equ [EditBox.ed_left] ;положение по оси х -ed_top equ [EditBox.ed_top] ;положение по оси у -ed_color equ [EditBox.ed_color] ;цвет фона компонента -shift_color equ [EditBox.shift_color] ;=0x6a9480 -ed_focus_border_color equ [EditBox.ed_focus_border_color] ;цвет рамки компонента -ed_blur_border_color equ [EditBox.ed_blur_border_color] ;цвет не активного компонента -ed_text_color equ [EditBox.ed_text_color] ;цвет текста -ed_max equ [EditBox.ed_max] ;кол-во символов которые можно максимально ввести -ed_text equ [EditBox.ed_text] ;указатель на буфер -ed_flags equ [EditBox.ed_flags] ;флаги -ed_size equ [EditBox.ed_size] ;кол-во символов -ed_pos equ [EditBox.ed_poz] ;позиция курсора -ed_offset equ [EditBox.ed_offset] ;смещение -cl_curs_x equ [EditBox.cl_curs_x] ;предыдущее координата курсора по х -cl_curs_y equ [EditBox.cl_curs_y] ;предыдущее координата курсора по у -ed_shift_pos equ [EditBox.ed_shift_pos] ;положение курсора -ed_shift_pos_old equ [EditBox.ed_shift_pos_old] ;старое положение курсора -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Bit mask from editbox -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -ed_figure_only= 1000000000000000b ;одни символы -ed_always_focus= 100000000000000b -ed_focus= 10b ;фокус приложения -ed_shift_on= 1000b ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift -ed_shift_on_off=1111111111110111b -ed_shift= 100b ;включается при нажатии на shift т.е. если нажимаю -ed_shift_off= 1111111111111011b -ed_shift_bac= 10000b ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение -ed_shift_bac_cl=1111111111101111b ;очистка при удалении выделения -ed_shift_cl= 1111111111100011b -ed_shift_mcl= 1111111111111011b -ed_left_fl= 100000b -ed_right_fl= 1111111111011111b -ed_offset_fl= 1000000b -ed_offset_cl= 1111111110111111b -ed_insert= 10000000b -ed_insert_cl= 1111111101111111b -ed_mouse_on = 100000000b -ed_mous_adn_b= 100011000b -ed_mouse_on_off=1111111011111111b -ed_height=14 ; высота -} \ No newline at end of file