diff --git a/programs/develop/libraries/box_lib/branch/box_lib.mac b/programs/develop/libraries/box_lib/branch/box_lib.mac index c07b648dd7..80d6d3296c 100644 --- a/programs/develop/libraries/box_lib/branch/box_lib.mac +++ b/programs/develop/libraries/box_lib/branch/box_lib.mac @@ -107,6 +107,9 @@ macro edit_boxes_set_sys_color start,end,color_table ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ch_struc_size=36 ;размер структуры ch_flag_en=10b ;флаг установленного чек бокса. +ch_flag_top=0x0 ;флаг расположения текста вверху т.е. 3-й бит +ch_flag_middle=100b ;флаг расположения текста в центре т.е. 4-й бит. +ch_flag_bottom=1000b ;флаг расположения текста в низу т.е. по умолчанию принимается значение внизу т.е. отсуствие 3-го и 4-го бита ch_left_s equ [ebp] ;кордината начала рисования по х ch_top_s equ [ebp+4] ;координата начала рисования по у @@ -131,6 +134,42 @@ struc check_box left_s,top_s,ch_text_margin,color,border_color,text_color,text,f .size_of_str: dd 0x0 ;длинна строки, вычисляется при инициализации компонента } +;Макрос проверки щелчка мышки над группой checkboxes. +macro init_checkboxes start,end +{ + mov ebp,start + mov ecx,((end-start)/ch_struc_size) +@@: + push ebp ;указатель на первый checkbox + call [check_box_mouse] ;макрос проверки мышки над checkbox'ом + add ebp,ch_struc_size + loop @b +} + +;Макрос отрисовки группы checkboxes. +macro checkboxes_draw start,end +{ + mov ebp,start + mov ecx,((end-start)/ch_struc_size) +@@: + push ebp ;указатель на первый checkbox + call [check_box_draw] ;нарисовать checkbox + add ebp,ch_struc_size + loop @b +} + +;Макрос отрисовки группы checkboxes. +macro checkboxes_draw start,end +{ + mov ebp,start + mov ecx,((end-start)/ch_struc_size) +@@: + push ebp ;указатель на первый checkbox + call [check_box_draw] ;нарисовать checkbox + add ebp,ch_struc_size + loop @b +} + macro check_boxes_set_sys_color start,end,color_table { mov ebp,start diff --git a/programs/develop/libraries/box_lib/branch/checkbox.asm b/programs/develop/libraries/box_lib/branch/checkbox.asm index 8dcd009791..e7ce9adba2 100644 --- a/programs/develop/libraries/box_lib/branch/checkbox.asm +++ b/programs/develop/libraries/box_lib/branch/checkbox.asm @@ -68,6 +68,15 @@ err_message_found_lib, head_f_l, myimport, err_message_import, head_f_i push dword check3 call [init_checkbox] + push dword check4 + call [init_checkbox] + + push dword check5 + call [init_checkbox] + + push dword check6 + call [init_checkbox] + window: call draw_window ;первоначально необходимо нарисовать окно @@ -91,6 +100,16 @@ still: ; call [check_box_mouse] + push dword check4 + call [check_box_mouse] + + push dword check5 + call [check_box_mouse] + + push dword check6 + call [check_box_mouse] + + jmp still ;если ничего из перечисленного то снова в цикл ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; button: @@ -118,6 +137,15 @@ draw_window: ; push dword check3 call [check_box_draw] + push dword check4 + call [check_box_draw] + + push dword check5 + call [check_box_draw] + + push dword check6 + call [check_box_draw] + mcall 12,2 ret @@ -151,16 +179,22 @@ 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 (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 +check1 check_box (10 shl 16 + 12),(10 shl 16 + 12),6,0xC0AABBCC,0,0x80000000,check_text,ch_flag_en +check2 check_box (10 shl 16 + 22),(25 shl 16 + 12),6,0xC0AABBCC,0,0x80000000,check_text2 +check3 check_box (10 shl 16 + 12),(40 shl 16 + 22),6,0xC0AABBCC,0,0x80000000,check_text3 +check4 check_box (10 shl 16 + 12),(70 shl 16 + 22),6,0xC0AABBCC,0,0x80000000,check_text4,ch_flag_top +check5 check_box (10 shl 16 + 12),(100 shl 16 + 22),6,0xC0AABBCC,0,0x80000000,check_text5,ch_flag_middle +check6 check_box (10 shl 16 + 12),(130 shl 16 + 22),6,0xC0AABBCC,0,0x80000000,check_text6,ch_flag_bottom ;--------------------------------------------------------------------- -hed db 'CheckBox Exemples date 12.10.2010',0 +hed db 'CheckBox Exemples date 15.10.2010',0 hed_end: ;--------------------------------------------------------------------- -check_text db 'First checkbox',0 -check_text2 db 'Second checkbox',0 -check_text3 db 'Number 3 checkbox',0 +check_text db 'First checkbox, set flag ch_flag_en',0 +check_text2 db 'Second checkbox,not set any flag',0 +check_text3 db 'Number 3 checkbox, not set any flag',0 +check_text4 db 'Set flag is ch_flag_top',0 +check_text5 db 'Set flag is ch_flag_middle',0 +check_text6 db 'Set flag is ch_flag_bottom',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 5a3c3108f6..acb618c9d0 100644 --- a/programs/develop/libraries/box_lib/branch/checkbox.mac +++ b/programs/develop/libraries/box_lib/branch/checkbox.mac @@ -58,12 +58,24 @@ check_box_draw: ; Оптимизация для ЦП mov ebx,dword ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса mov eax,dword ch_top_s ;загрузим значение по (y shl 16 + длинна) для чек бокса + mov ecx,eax add ebx,dword ch_text_margin ;добавим размер стороны и расстояние на котором начнется вывод текста - shr eax,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + shr eax,16 ;сдвинем на 16 разрядов в право (разделим на 65536) в ax верхная точка shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - add eax,dword ch_top_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Y + + sub ecx,8 ;корретировка учитываем высоту шрифта + + test dword ch_flags,ch_flag_bottom ;проверим, нужно ли выводить вверху надпись + jnz .bottom + + test dword ch_flags,ch_flag_middle ;проверим, нужно ли выводить в центр надпись + jz .top ;остался только top + + shr cx,1 ;разделим на 2 +.bottom: + add ax,cx +.top: add ebx,dword ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х - sub ax,7 ;внесем смещение для y mov bx,ax ;ebx х shl 16 +y координаты вывода строчки