diff --git a/programs/develop/examples/editbox/trunk/EDITBOX.INC b/programs/develop/examples/editbox/trunk/EDITBOX.INC index 150fb57c7b..80a514470b 100644 --- a/programs/develop/examples/editbox/trunk/EDITBOX.INC +++ b/programs/develop/examples/editbox/trunk/EDITBOX.INC @@ -1,3 +1,5 @@ +; 13.02.2007 убрал по возможности мерцание, улучшена обработака перерисовки фона +; добавил фитчу внесения 0х0 по адресу ed_size иначе у Maxxx32 были несостыковки в коде. Пречниа в том, что оптимизация была сведена к тому что я не чистил символы в буфере, когда удалял, я просто их не выводил, и потом когда вносился новый символ, он по просту затирал уже имеющийся. Если бы программа обрабатывала конец строки по ed_size, проблем бы не возникло. Но сейчас этот недостаток исправлен. ; 01.02.2007 доработка edit_box, исправил баги. ; 26.01.2007 нормальная работа компанента исправил фукцию .check_offset ; 24.01.2007 пофиксел баги вызваные не правильным кодом )). @@ -153,6 +155,7 @@ ret ret jmp @f +;вход только цвет edx .draw_bg: mov ebx,ed_left add ebx,1 @@ -347,30 +350,6 @@ popad mov dword [esp+28],0 popad ret - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; mov ebx,eax -; mov eax,ed_pos -; xor edx,edx -; idiv ebx -; xor edx,edx -; imul eax,ebx -; mov ed_offset,eax -; pop ebx -; cmp ax,bx -; je @f -;;;;;;;; данные для закрашивания всей полосы прямоугольника -; mov ebx,ed_left -; inc ebx -; shl ebx,16 -; mov bx,ed_width -; dec ebx -; mov edx,ed_color -; call .draw_bg_eax -; mov dword [esp+28],0 -;@@: popad -; ret ;========================================================== ;=== обработка клавиатуры ================================= ;========================================================== @@ -379,6 +358,7 @@ pusha test word ed_flags,ed_focus ; если не в фокусе, выходим je .no_figure ;@f +;Проверка на нажаты shift xor ecx,ecx push eax inc ecx @@ -387,9 +367,9 @@ pusha int 0x40 test al,0x03 je @f - or word ed_flags,ed_shift + or word ed_flags,ed_shift ;установим флаг -@@: pop eax +@@: pop eax ;восстановим считаный символ с клавиатуры ;---------------------------------------------------------- ;--- проверяем, что нажато -------------------------------- ;---------------------------------------------------------- @@ -433,6 +413,9 @@ pusha mov edx,ed_size mov ecx,ed_pos call .del_char +;clear + mov ebp,ed_size + call .clear_bg ;;;; mov eax,ed_shift_pos mov ebx,ed_size @@ -443,9 +426,11 @@ pusha ; проверяем, находится ли курсор в конце @@: mov ecx,ed_size mov edx, ed_max + test word ed_flags,ed_insert + jne @f cmp ecx,edx jae .no_figure - mov ebx, ed_pos +@@: mov ebx, ed_pos cmp ebx,edx jl @f ; если меньше или равно .no_figure: @@ -463,6 +448,12 @@ pusha 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 @@: ; сдвигаем символы после курсора вправо mov ecx,ed_size @@ -478,6 +469,13 @@ pusha test word [ebp+36],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 ;Сместим наши символы в право @@ -534,7 +532,7 @@ pusha dec dword ed_pos .draw_all: - push .shift;.draw_cursor_text;eax + push .shift;.draw_cursor_text;eax test word ed_flags,ed_shift_on je @f @@ -542,7 +540,12 @@ pusha mov ebx,ed_size sub ebx,eax mov ed_size,ebx - jmp .draw_all2 + + call .clear_cursor + call .check_offset + call .draw_bg + + ret @@: dec dword ed_size @@ -550,55 +553,10 @@ pusha and word ed_flags,ed_shift_cl call .clear_cursor call .check_offset -;;;;;;;;;;;;;;; - test eax,eax - jne @f - call .draw_bg + mov ebp,ed_size + call .clear_bg ret -;;;;;;;;;;;;;;; -@@: call .get_n - push eax - mov ebx,ed_offset - add eax,ebx ;eax = w_off= ed_offset+width - mov ebx,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 -; jmp .shift + ;jmp .shift ;--- нажата клавиша left --- .left: call .sh_enable mov ebx,ed_pos @@ -636,9 +594,13 @@ pusha ;jz .draw_bg_cursor_text call .draw_cursor + + .shift: ;;;;;;;SHIFT - - call .draw_bg ;не оптимально + ;test ed_flags,ed_ + + ;mov ebp,ed_size + ;call .clear_bg test word ed_flags,ed_shift je .f_exit ;;;;;;SHIFT end @@ -702,11 +664,13 @@ pusha mov edx,shift_color call .draw_bg_eax and word ed_flags,1111111111111011b + call .enable_null jmp .draw_cursor_text ;;;;;;;;;;;;;;;;;;;;; -.f_exit: and word ed_flags,ed_shift_cl - jmp .draw_cursor_text +.f_exit: and word ed_flags,ed_shift_cl + call .enable_null + jmp .draw_cursor_text ;проверка состояния shift был ли он нажат раньше? .sh_enable: @@ -720,7 +684,22 @@ pusha ret @@: and word ed_flags,ed_shift_cl -.sh_ext_en: ret + ret +.sh_ext_en: mov ebp,ed_size + call .clear_bg + ret + +;функция внесения 0 по адресу ed_size+1 +.enable_null: + pusha + mov eax,ed_size + mov ebx,ed_text + add eax,ebx + inc eax + xor ebx,ebx + mov [eax],bl + popa + ret ;- удаление символа ;Входные данные edx=ed_size;ecx=ed_pos @@ -771,6 +750,54 @@ pusha 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 + + ;========================================================== ;=== обработка мыши ======================================= ;========================================================== diff --git a/programs/develop/examples/editbox/trunk/editbox.asm b/programs/develop/examples/editbox/trunk/editbox.asm index b80dc73c62..3c3e89f797 100644 --- a/programs/develop/examples/editbox/trunk/editbox.asm +++ b/programs/develop/examples/editbox/trunk/editbox.asm @@ -67,30 +67,24 @@ draw_window: ; xor eax,eax ;обнулить eax mov ebx,50*65536+390 ;[координата по оси x]*65536 + [размер по оси x] mov ecx,30*65536+200 ;[координата по оси y]*65536 + [размер по оси y] - mov edx,0x03AABBCC ;0xXYRRGGBB Y =3 - вывод рамки, используя скрин + mov edx,0xb3AABBCC ;0xXYRRGGBB Y =3 - вывод рамки, используя скрин mov esi,0x805080DD ;0xXYRRGGBB - цвет заголовка - mov edi,0x005080DD ;0x00RRGGBB - цвет рамки + mov edi,hed ;Указатель на строку с заголовком int 0x40 ;нарисовать окно приложения - add eax,4 ;если предполагается использовать скалярный процессор, то можно использовать данню инструкцию - mov ebx,8*65536+8 ; [координата по оси x]*65536 + [координата по оси y] mov ecx,0x10DDEEFF ; 0xX0RRGGBB, где RR, GG, BB задают цвет текста - mov edx,hed ; указатель на начало строки - mov esi,i_end1 - hed ; длина строки, должна быть не больше 255 - int 0x40 ;вывести текст - draw_edit_boxes editboxes,editboxes_end ;рисование edit box'ов - add eax,8 ;Функция 12 - начать/закончить перерисовку окна. + mov eax,12 ;Функция 12 - начать/закончить перерисовку окна. mov ebx,2 ;Подфункция 2 - закончить перерисовку окна. int 0x40 ret ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;DATA данные editboxes: -edit1 edit_box 168,10,50,0xffffff,0,0,0,512,ed_buffer.1,ed_focus -edit2 edit_box 168,10,30,0xffffff,0,0,0,99,ed_buffer.2,ed_figure_only -edit3 edit_box 35,10,70,0xffffff,0,0,0,9,ed_buffer.3,ed_figure_only -edit4 edit_box 16,10,90,0xffffff,0,0,0,1,ed_buffer.4,ed_figure_only +edit1 edit_box 168,5,30,0xffffff,0,0,0,512,ed_buffer.1,ed_focus +edit2 edit_box 168,5,10,0xffffff,0,0,0,99,ed_buffer.2,ed_figure_only +edit3 edit_box 35,5,50,0xffffff,0,0,0,9,ed_buffer.3,ed_figure_only +edit4 edit_box 16,5,70,0xffffff,0,0,0,1,ed_buffer.4,ed_figure_only editboxes_end: ;data_of_code dd 0 ed_buffer: @@ -101,8 +95,8 @@ ed_buffer: ;text_b: db 'Кол-во символов' ;buffer: dd 0 buffer_end: -hed db 'EDITBOX optimization and retype date 01.02.2007' +hed db 'EDITBOX optimization and retype date 26.01.2007',0 i_end1: -rb 2048 +rb 1024 i_end: keymap: \ No newline at end of file