diff --git a/programs/develop/libraries/box_lib/branch/box_lib.asm b/programs/develop/libraries/box_lib/branch/box_lib.asm index ce741070d3..d754a0caba 100644 --- a/programs/develop/libraries/box_lib/branch/box_lib.asm +++ b/programs/develop/libraries/box_lib/branch/box_lib.asm @@ -43,6 +43,8 @@ align 16 ;CheckBox ;---------------------------------------------------- align 16 +_init_checkbox ;macro for init checkbox +align 16 use_checkbox_draw ;macro reveals the function of the display. align 16 use_checkbox_mouse ;macro reveals processing function of the mouse. @@ -131,9 +133,10 @@ dd sz_version, 0x00000001 ;dd sz_edit_box_set_text, edit_box_set_text ;dd szVersion_ed, 0x00000001 +dd sz_init_checkbox, init_checkbox dd sz_check_box_draw, check_box_draw dd sz_check_box_mouse, check_box_mouse -dd szVersion_ch, 0x00000001 +dd szVersion_ch, 0x00000002 ;dd sz_option_box_draw, option_box_draw ;dd sz_option_box_mouse, option_box_mouse @@ -229,6 +232,7 @@ sz_edit_box_mouse db 'edit_box_mouse',0 sz_edit_box_set_text db 'edit_box_set_text',0 szVersion_ed db 'version_ed',0 +sz_init_checkbox db 'init_checkbox',0 sz_check_box_draw db 'check_box_draw',0 sz_check_box_mouse db 'check_box_mouse',0 szVersion_ch db 'version_ch',0 diff --git a/programs/develop/libraries/box_lib/branch/box_lib.mac b/programs/develop/libraries/box_lib/branch/box_lib.mac index a7440fc3b2..c07b648dd7 100644 --- a/programs/develop/libraries/box_lib/branch/box_lib.mac +++ b/programs/develop/libraries/box_lib/branch/box_lib.mac @@ -103,9 +103,9 @@ macro edit_boxes_set_sys_color start,end,color_table } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Basic macros for use CheckBox ; -;Last change 11.10.2010 ; +;Last change 12.10.2010 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -ch_struc_size=32 ;размер структуры +ch_struc_size=36 ;размер структуры ch_flag_en=10b ;флаг установленного чек бокса. ch_left_s equ [ebp] ;кордината начала рисования по х @@ -116,6 +116,7 @@ ch_border_color equ [ebp+16] ; or [edi+4] ; ch_text_color equ [ebp+20] ;[edi+4] ;цвет текста ch_text_ptr equ [ebp+24] ;указатель на начало текстовой строки ch_flags equ [ebp+28] ;флаги +ch_sz_str equ [ebp+32] ;длинна строки, вычисляется при инициализации компонента struc check_box left_s,top_s,ch_text_margin,color,border_color,text_color,text,flags { ;структура параметров для чек бокса @@ -126,7 +127,8 @@ struc check_box left_s,top_s,ch_text_margin,color,border_color,text_color,text,f .border_color: dd border_color ;цвет рамки .text_color: dd text_color ;цвет надписи .text: dd text ;адрес в коде программы где расположен текст -.flags: dd flags+0 ; флаги +.flags: dd flags+0 ;флаги +.size_of_str: dd 0x0 ;длинна строки, вычисляется при инициализации компонента } macro check_boxes_set_sys_color start,end,color_table diff --git a/programs/develop/libraries/box_lib/branch/checkbox.asm b/programs/develop/libraries/box_lib/branch/checkbox.asm index 8c38198688..8dcd009791 100644 --- a/programs/develop/libraries/box_lib/branch/checkbox.asm +++ b/programs/develop/libraries/box_lib/branch/checkbox.asm @@ -52,11 +52,23 @@ include 'box_lib.mac' ;--- Start of program ---------------------------------------------- ;--------------------------------------------------------------------- START: + mcall 40,0x27 + sys_load_library library_name, cur_dir_path, library_path, system_path, \ err_message_found_lib, head_f_l, myimport, err_message_import, head_f_i test eax,eax jnz exit +;init checkboxes + push dword check1 + call [init_checkbox] + push dword check2 + call [init_checkbox] + + push dword check3 + call [init_checkbox] + + window: call draw_window ;первоначально необходимо нарисовать окно align 4 @@ -75,6 +87,10 @@ still: ; push dword check2 call [check_box_mouse] + push dword check3 + call [check_box_mouse] + + jmp still ;если ничего из перечисленного то снова в цикл ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; button: @@ -99,6 +115,10 @@ draw_window: ; push dword check2 call [check_box_draw] + push dword check3 + call [check_box_draw] + + mcall 12,2 ret ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @@ -119,24 +139,28 @@ err_message_import db 'Error on load import library box_lib.obj',0 myimport: +init_checkbox dd aInit_checkbox check_box_draw dd aCheck_box_draw check_box_mouse dd aCheck_box_mouse version_ch dd aVersion_ch dd 0,0 +aInit_checkbox db 'init_checkbox',0 aCheck_box_draw db 'check_box_draw',0 aCheck_box_mouse db 'check_box_mouse',0 aVersion_ch db 'version_ch',0 ;--------------------------------------------------------------------- -check1 check_box (10 shr 16 + 12),(45 shr 16 + 12),6,0x80AABBCC,0,0,check_text,ch_flag_en -check2 check_box (10 shr 16 + 12),(60 shr 16 + 12),6,0x80AABBCC,0,0,check_text2 +check1 check_box (20 shl 16 + 12),(45 shl 16 + 12),6,0xC0AABBCC,0,0x80000000,check_text,ch_flag_en +check2 check_box (20 shl 16 + 22),(60 shl 16 + 12),6,0xC0AABBCC,0,0x80000000,check_text2 +check3 check_box (20 shl 16 + 12),(75 shl 16 + 22),6,0xC0AABBCC,0,0x80000000,check_text3 ;--------------------------------------------------------------------- -hed db 'CheckBox Exemples date 03.10.2010',0 +hed db 'CheckBox Exemples date 12.10.2010',0 hed_end: ;--------------------------------------------------------------------- check_text db 'First checkbox',0 check_text2 db 'Second checkbox',0 +check_text3 db 'Number 3 checkbox',0 ;--------------------------------------------------------------------- MEM_END: cur_dir_path rb 1024 diff --git a/programs/develop/libraries/box_lib/branch/checkbox.mac b/programs/develop/libraries/box_lib/branch/checkbox.mac index b81591b421..5a3c3108f6 100644 --- a/programs/develop/libraries/box_lib/branch/checkbox.mac +++ b/programs/develop/libraries/box_lib/branch/checkbox.mac @@ -3,16 +3,35 @@ ;Макрос для системной библиотеки box_lib.obj ;Checkbox +;Инициализация checkbox +macro _init_checkbox +{ +init_checkbox: +;подсчитаем кол-во символов в длинне выводимой строки. + pushad + mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке + mov ebx,dword ch_text_margin ;eax=0 + mov esi,dword ch_text_ptr ;указатель на строчку + lodsb ;в al первый символ из строки + test al,al + jz .ex_loop +@@: + add ebx,6 ;ширина символа + lodsb + test al,al + jnz @b +.ex_loop: + + mov dword ch_sz_str,ebx ;запишим длинну строки с учетом отступа от квадратика + popad + ret 4 +} + macro use_checkbox_draw { check_box_draw: pushad ;сохраним все регистры mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке -; mov ebx,ch_left_s -; mov ecx,ch_top_s -; mov edx,dword ch_border_color -; mov eax,13 -; mcall ;рисуем рамку mcall 13,ch_left_s,ch_top_s,ch_border_color ;рисуем рамку чек бокса, фактически рисуем прямоугольник и закрашиваем фон внутри цветом рамки бокса mov edx,dword ch_color ;загружаем цвет фона @@ -33,24 +52,24 @@ check_box_draw: ; add ebx,dword ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х ; mov eax,word ch_top_s ;загрузим значение по (y shl 16 + длинна) для чек бокса -; shl eax,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) +; shr eax,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) ; add eax,dword ch_top_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Y ; Оптимизация для ЦП mov ebx,dword ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса - mov eax,dword ch_top_s ;загрузим значение по (y shl 16 + длинна) для чек бокса - add ebx,dword ch_text_margin ;добавим размер стороны и расстояние на котором начнется вывод текста - shl eax,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - add eax,dword ch_top_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Y - add ebx,dword ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х - shr eax,16 ;для y поместим в младшую часть - mov bx,ax ;внесем смещение для y + mov eax,dword ch_top_s ;загрузим значение по (y shl 16 + длинна) для чек бокса + add ebx,dword ch_text_margin ;добавим размер стороны и расстояние на котором начнется вывод текста + shr eax,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + add eax,dword ch_top_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Y + add ebx,dword ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х + sub ax,7 ;внесем смещение для y + mov bx,ax + ;ebx х shl 16 +y координаты вывода строчки mov ecx,dword ch_text_color ;загрузим цвет надписи + flags mov edx,dword ch_text_ptr ;укажем адрес от куда нужно выводить строку - mov eax,4 ;внесем в eax значение вывода надписи на канву - mcall ;Вывод + mcall 4 ;Вывод popad ;восстановить значения регистров из стека ret 4 ;выйдем из процедуры и удалим из стека указатель на структуру (4 байта) @@ -60,33 +79,12 @@ check_box_clear_ch: ; check_box_draw_ch: ;нарисовать включенный чек бокс mov edx,dword ch_border_color ;загрузить цвет @@: -; movzx ebx,word ch_left ;загрузить координату по х -; mov eax,dword ch_size -; mov di,ax -; shr eax,2 -; push ax -; -; push ax -; add ebx,eax -; shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) -; pop ax -; lea eax,[eax*2] -; sub bp,ax ;сохраним регистр bx в регистре указателя базы -; mov bx,bp - -; movzx ecx,word ch_top ;загрузить координату по у -; pop ax -; add cx,ax -; shl ecx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) -; mov cx,bp ;загрузим значения регистра указателя базы в cx -; mov eax,13 ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс -; mcall ;вывод - - mov ebx,dword ch_left_s - mov ecx,dword ch_top_s - add ebx,1 shl 16 - 4 - add ecx,1 shl 16 - 4 - mcall 13 +;Отобразить включеный checkbox + mov ebx,dword ch_left_s ;загружаем х shl 16 + длинна по Х + mov ecx,dword ch_top_s ;загружаем Y shl 16 + длинна по Y + add ebx,2 shl 16 - 4 ;после этих изменений (X+2) shl 16 +длинна по (Х-2) + add ecx,2 shl 16 - 4 ;после этих изменений (Y+2) shl 16 +длинна по (Y-2) + mcall 13 ;отобразить квадрат внутри checkbox ret } @@ -96,16 +94,14 @@ macro use_checkbox_mouse ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Обработчик mouse -; При попадании мышки + нажата клавиша в область checkbox состояние бокса должно менятся активный - не активный. +;При попадании мышки + нажата клавиша в область checkbox состояние бокса должно менятся активный - не активный. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; check_box_mouse: ;обработка мыши pushad mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке mcall 37,2 ;проверяем состояние клавиш мышки. Было ли событие нажатая клавиша на мышке. - test eax,eax ;проверка если у нас в eax=0, то установим флаг и выйдем - jnz @f ;перейти на нижнюю метку @@, если в eax не 0. -; and dword ch_flags,eax ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое. - jmp .check_box_mouse_end ;обработка закончилась + test eax,eax ;проверка если у нас в eax=0, выйдем + jz .check_box_mouse_end ;обработка закончилась ; Да событие: нажатие клавиши мышки произошло. @@: mcall 37,1 ;получить координаты курсора относительно окна @@ -120,6 +116,8 @@ pushad add cx,bx ;сложим длинну по y и координату верхней точки по y поличим координату нижней точки по Y cmp ax,cx ja .check_box_mouse_end ;указатель мышки больше конечной координаты по y чем координата по Y у бокса +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + shr eax,16 ;сместим координату по Х в нижную часть регистра т.е. в ax ;сравнение по начальной точке Х mov ecx,dword ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса mov ebx,ecx @@ -127,74 +125,19 @@ pushad cmp ax,bx jb .check_box_mouse_end ;указатель мышки меньше начальной координаты по X чем координата по X у бокса ;сравнение конечной точки по X - add bx,cx ;сложим длинну по y и координату верхней точки по y поличим координату нижней точки по Y - add ebx,dword ch_text_margin ;добавим размер стороны и расстояние на котором начнется вывод текста - mov ecx,dword ch_text_ptr ;укажем адрес строки с терминируещим 0 - push eax - -;подсчет длинны строки и увеличение прямогольника в котором срабатывает щелчок мышки - lodsb - test al,al - jz .ex_loop -@@: - add bx,6 ;ширина символа - lodsb - test al,al - jnz @b -.ex_loop: - pop eax + add bx,cx ;сложим длинну по x и координату точки по х получим координату конечной точки по Х + add bx,word ch_sz_str ;добавим длинну строки текста с отступом предвартиельно записав их в момент инициализации cmp ax,bx - ja .check_box_mouse_end ;указатель мышки больше конечной координаты по y чем координата по Y у бокса + ja .check_box_mouse_end ;указатель мышки больше конечной координаты по х чем координата по Х у бокса ;если все проверки были успешно пройдены мы обязаны поменять состояние бокса btc dword ch_flags,2 ;перенос 2-го бита в cf и инверсия его jc .enable_box ;если CF=1 то отобразим включенный бокс и выйдем push dword .check_box_mouse_end ;фокус -покус, вернемся после вызова check_box_clear_ch на метку check_box_mouse_end - jmp check_box_clear_ch ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона. + jmp check_box_clear_ch ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона. .enable_box: - call check_box_draw_ch ;отобразить включенный чек бокс - - - -; bts dword ch_flags,2 ;проверка флага т.е. перенос в cf значение бита и установка бита в состояние включено -; jc check_box_mouse_end ;если CF=1 то перейти в конец т.е. это выход -; mov esi,dword ch_text_length ;загрузить кол-во символов в текстовой строке - ;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea -; lea esi,[eax*3] -; shl esi,1 -; imul esi,6 ; или можно и так умножить на 6 -; add esi,dword ch_text_margin ;добавить 3 - расстояние от чек бокса до надписи - -; mov eax,37 ;получим координаты мышки -; mov ebx,1 ;добавить 1 -; mcall ;получить координаты курсора относительно окна - -; movzx ebx,word ch_top ;загрузить в bx значение координаты у -; cmp ax,bx ;сравнить с с координатой курсора -; jl check_box_mouse_end ;SF <> OF если меньше -; add ebx,dword ch_size ;добавить размер -; cmp ax,bx ;сравнить -; jg check_box_mouse_end ;ZF = 0 и SF = OF если больше - -; shr eax,16 ;разделим на 65536 или просто сдвинем биты на 16 значений -; movzx ebx,word ch_left ;произведем аналогичное сравнение -; cmp ax,bx ;сравнить регистры -; jl check_box_mouse_end ;если меньше -; add ebx,dword ch_size ;добавить длину стороны прямоугольника -; add ebx,esi ;Учесть в значении по х еще и длину надписи к чекбоксу -; cmp ax,bx ;стравнить регистры -; jg check_box_mouse_end ;если больше - -; bts dword ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на 1. -; jc @f ;CF=1 то перейти на нижнюю @@ - -; call check_box_draw_ch ;отобразить включенный чек бокс -; mov dword [esp+24],1 ;дальнейшая проверка чек боксов бесмыслена, по этому в стек, где располагается ecx поместитм 0 -; jmp check_box_mouse_end ;выйти -;@@: -; btr word ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое. -; call check_box_clear_ch ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона. + call check_box_draw_ch ;отобразить включенный чек бокс .check_box_mouse_end: -popad ;восстановить регистры из стека -ret 4 ;выйти +popad ;восстановить регистры из стека + ret 4 ;выйти и восстановим стек } \ No newline at end of file