From 3c2f9c9b900bb00023dd199df807f4b3ece7a8fc Mon Sep 17 00:00:00 2001 From: "Alexey Teplov (" Date: Mon, 1 Nov 2010 08:17:46 +0000 Subject: [PATCH] Copy new version checkbox to trunk. git-svn-id: svn://kolibrios.org@1682 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../libraries/box_lib/branch/bl_sys.mac | 2 +- .../libraries/box_lib/branch/box_lib.asm | 22 +-- .../libraries/box_lib/branch/box_lib.mac | 32 ++-- .../libraries/box_lib/branch/checkbox.asm | 20 +-- .../branch/{checkbox.mac => checkbox2.mac} | 66 ++++---- .../libraries/box_lib/trunk/bl_sys.mac | 3 +- .../libraries/box_lib/trunk/box_lib.asm | 22 ++- .../libraries/box_lib/trunk/box_lib.mac | 88 ++++++++++ .../libraries/box_lib/trunk/checkbox2.mac | 155 ++++++++++++++++++ 9 files changed, 337 insertions(+), 73 deletions(-) rename programs/develop/libraries/box_lib/branch/{checkbox.mac => checkbox2.mac} (67%) create mode 100644 programs/develop/libraries/box_lib/trunk/checkbox2.mac diff --git a/programs/develop/libraries/box_lib/branch/bl_sys.mac b/programs/develop/libraries/box_lib/branch/bl_sys.mac index 5f6093afc1..fcbcffa942 100644 --- a/programs/develop/libraries/box_lib/branch/bl_sys.mac +++ b/programs/develop/libraries/box_lib/branch/bl_sys.mac @@ -1,5 +1,5 @@ ;include 'editbox.mac' ;macro which should make life easier :) specially for editbox -include 'checkbox.mac' ;macro implements checkbox +include 'checkbox2.mac' ;macro implements checkbox ;include 'optionbox.mac' ;macro implements optionbox ;include 'scrollbar.mac' ;macro implements scrollbar ;include 'd_button.mac' ;macro implements dinamic_button diff --git a/programs/develop/libraries/box_lib/branch/box_lib.asm b/programs/develop/libraries/box_lib/branch/box_lib.asm index d754a0caba..ea6155b5ee 100644 --- a/programs/develop/libraries/box_lib/branch/box_lib.asm +++ b/programs/develop/libraries/box_lib/branch/box_lib.asm @@ -43,11 +43,11 @@ align 16 ;CheckBox ;---------------------------------------------------- align 16 -_init_checkbox ;macro for init checkbox +_init_checkbox2 ;macro for init checkbox align 16 -use_checkbox_draw ;macro reveals the function of the display. +use_checkbox_draw2 ;macro reveals the function of the display. align 16 -use_checkbox_mouse ;macro reveals processing function of the mouse. +use_checkbox_mouse2 ;macro reveals processing function of the mouse. ;-------------------------------------------------- @@ -133,10 +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, 0x00000002 +dd sz_init_checkbox2, init_checkbox2 +dd sz_check_box_draw2, check_box_draw2 +dd sz_check_box_mouse2, check_box_mouse2 +dd szVersion_ch2, 0x00000002 ;dd sz_option_box_draw, option_box_draw ;dd sz_option_box_mouse, option_box_mouse @@ -232,10 +232,10 @@ 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 +sz_init_checkbox2 db 'init_checkbox2',0 +sz_check_box_draw2 db 'check_box_draw2',0 +sz_check_box_mouse2 db 'check_box_mouse2',0 +szVersion_ch2 db 'version_ch2',0 sz_option_box_draw db 'option_box_draw',0 sz_option_box_mouse db 'option_box_mouse',0 diff --git a/programs/develop/libraries/box_lib/branch/box_lib.mac b/programs/develop/libraries/box_lib/branch/box_lib.mac index e6f6002ab9..e982cf8c64 100644 --- a/programs/develop/libraries/box_lib/branch/box_lib.mac +++ b/programs/develop/libraries/box_lib/branch/box_lib.mac @@ -111,17 +111,17 @@ ch_flag_top=0x0 ; ch_flag_middle=100b ;флаг расположения текста в центре т.е. 4-й бит. ch_flag_bottom=1000b ;флаг расположения текста в низу т.е. по умолчанию принимается значение внизу т.е. отсуствие 3-го и 4-го бита -ch_left_s equ [ebp] ;кордината начала рисования по х -ch_top_s equ [ebp+4] ;координата начала рисования по у -ch_text_margin equ [ebp+8] ;=4 расстояние от прямоугольника чек бокса до надписи -ch_color equ [ebp+12] ;цвет внутри checkbox -ch_border_color equ [ebp+16] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно -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] ;длинна строки, вычисляется при инициализации компонента +2ch_left_s equ [ebp] ;кордината начала рисования по х +2ch_top_s equ [ebp+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_flags equ [ebp+28] ;флаги +2ch_sz_str equ [ebp+32] ;длинна строки, вычисляется при инициализации компонента -struc check_box left_s,top_s,ch_text_margin,color,border_color,text_color,text,flags +struc check_box2 left_s,top_s,ch_text_margin,color,border_color,text_color,text,flags { ;структура параметров для чек бокса .left_s: dd left_s ;+0 положение по х dw + размер dw .top_s: dd top_s ;+4 положение по у dw + размер dw @@ -135,37 +135,37 @@ struc check_box left_s,top_s,ch_text_margin,color,border_color,text_color,text,f } ;Макрос проверки щелчка мышки над группой checkboxes. -macro init_checkboxes start,end +macro init_checkboxes2 start,end { mov ebp,start mov ecx,((end-start)/ch_struc_size) @@: push ebp ;указатель на первый checkbox - call [init_checkbox] ;макрос проверки мышки над checkbox'ом + call [init_checkbox2] ;макрос проверки мышки над checkbox'ом add ebp,ch_struc_size loop @b } ;Макрос проверки мышки группы checkboxes. -macro checkboxes_mouse start,end +macro checkboxes_mouse2 start,end { mov ebp,start mov ecx,((end-start)/ch_struc_size) @@: push ebp ;указатель на первый checkbox - call [check_box_mouse] ;нарисовать checkbox + call [check_box_mouse2] ;нарисовать checkbox add ebp,ch_struc_size loop @b } ;Макрос отрисовки группы checkboxes. -macro checkboxes_draw start,end +macro checkboxes_draw2 start,end { mov ebp,start mov ecx,((end-start)/ch_struc_size) @@: push ebp ;указатель на первый checkbox - call [check_box_draw] ;нарисовать checkbox + call [check_box_draw2] ;нарисовать checkbox add ebp,ch_struc_size loop @b } diff --git a/programs/develop/libraries/box_lib/branch/checkbox.asm b/programs/develop/libraries/box_lib/branch/checkbox.asm index e7ce9adba2..72dcc3bfda 100644 --- a/programs/develop/libraries/box_lib/branch/checkbox.asm +++ b/programs/develop/libraries/box_lib/branch/checkbox.asm @@ -174,17 +174,17 @@ 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 +aInit_checkbox db 'init_checkbox2',0 +aCheck_box_draw db 'check_box_draw2',0 +aCheck_box_mouse db 'check_box_mouse2',0 +aVersion_ch db 'version_ch2',0 ;--------------------------------------------------------------------- -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 +check1 check_box2 (10 shl 16 + 12),(10 shl 16 + 12),6,0xC0AABBCC,0,0x80000000,check_text,ch_flag_en +check2 check_box2 (10 shl 16 + 22),(25 shl 16 + 12),6,0xC0AABBCC,0,0x80000000,check_text2 +check3 check_box2 (10 shl 16 + 12),(40 shl 16 + 22),6,0xC0AABBCC,0,0x80000000,check_text3 +check4 check_box2 (10 shl 16 + 12),(70 shl 16 + 22),6,0xC0AABBCC,0,0x80000000,check_text4,ch_flag_top +check5 check_box2 (10 shl 16 + 12),(100 shl 16 + 22),6,0xC0AABBCC,0,0x80000000,check_text5,ch_flag_middle +check6 check_box2 (10 shl 16 + 12),(130 shl 16 + 22),6,0xC0AABBCC,0,0x80000000,check_text6,ch_flag_bottom ;--------------------------------------------------------------------- hed db 'CheckBox Exemples date 15.10.2010',0 hed_end: diff --git a/programs/develop/libraries/box_lib/branch/checkbox.mac b/programs/develop/libraries/box_lib/branch/checkbox2.mac similarity index 67% rename from programs/develop/libraries/box_lib/branch/checkbox.mac rename to programs/develop/libraries/box_lib/branch/checkbox2.mac index acb618c9d0..74c9afa464 100644 --- a/programs/develop/libraries/box_lib/branch/checkbox.mac +++ b/programs/develop/libraries/box_lib/branch/checkbox2.mac @@ -4,14 +4,14 @@ ;Checkbox ;Инициализация checkbox -macro _init_checkbox +macro _init_checkbox2 { -init_checkbox: +init_checkbox2: ;подсчитаем кол-во символов в длинне выводимой строки. pushad mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке - mov ebx,dword ch_text_margin ;eax=0 - mov esi,dword ch_text_ptr ;указатель на строчку + mov ebx,dword 2ch_text_margin ;eax=0 + mov esi,dword 2ch_text_ptr ;указатель на строчку lodsb ;в al первый символ из строки test al,al jz .ex_loop @@ -22,26 +22,26 @@ init_checkbox: jnz @b .ex_loop: - mov dword ch_sz_str,ebx ;запишим длинну строки с учетом отступа от квадратика + mov dword 2ch_sz_str,ebx ;запишим длинну строки с учетом отступа от квадратика popad ret 4 } -macro use_checkbox_draw +macro use_checkbox_draw2 { -check_box_draw: +check_box_draw2: pushad ;сохраним все регистры mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке - mcall 13,ch_left_s,ch_top_s,ch_border_color ;рисуем рамку чек бокса, фактически рисуем прямоугольник и закрашиваем фон внутри цветом рамки бокса + mcall 13,2ch_left_s,2ch_top_s,2ch_border_color ;рисуем рамку чек бокса, фактически рисуем прямоугольник и закрашиваем фон внутри цветом рамки бокса - mov edx,dword ch_color ;загружаем цвет фона + mov edx,dword 2ch_color ;загружаем цвет фона add ebx,1 shl 16 - 2 add ecx,1 shl 16 - 2 mcall ;закрашиваем внутренности чекбокса фоном - test dword ch_flags,2 ;достать значение бита из переменной и поместить в флаг CF + test dword 2ch_flags,2 ;достать значение бита из переменной и поместить в флаг CF jz @f ;в если CF=1, то выполним следующую процедуру иначе перейти на нижнюю @@ - call check_box_draw_ch ;нарисовать включенный чек бокс + call check_box_draw_ch2 ;нарисовать включенный чек бокс @@: ;---------------------------- ;расчет куда будет произведен вывод текста @@ -56,44 +56,44 @@ check_box_draw: ; 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 + длинна) для чек бокса + mov ebx,dword 2ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса + mov eax,dword 2ch_top_s ;загрузим значение по (y shl 16 + длинна) для чек бокса mov ecx,eax - add ebx,dword ch_text_margin ;добавим размер стороны и расстояние на котором начнется вывод текста + add ebx,dword 2ch_text_margin ;добавим размер стороны и расстояние на котором начнется вывод текста shr eax,16 ;сдвинем на 16 разрядов в право (разделим на 65536) в ax верхная точка shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) sub ecx,8 ;корретировка учитываем высоту шрифта - test dword ch_flags,ch_flag_bottom ;проверим, нужно ли выводить вверху надпись + test dword 2ch_flags,ch_flag_bottom ;проверим, нужно ли выводить вверху надпись jnz .bottom - test dword ch_flags,ch_flag_middle ;проверим, нужно ли выводить в центр надпись + test dword 2ch_flags,ch_flag_middle ;проверим, нужно ли выводить в центр надпись jz .top ;остался только top shr cx,1 ;разделим на 2 .bottom: add ax,cx .top: - add ebx,dword ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х + add ebx,dword 2ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х mov bx,ax ;ebx х shl 16 +y координаты вывода строчки - mov ecx,dword ch_text_color ;загрузим цвет надписи + flags - mov edx,dword ch_text_ptr ;укажем адрес от куда нужно выводить строку + mov ecx,dword 2ch_text_color ;загрузим цвет надписи + flags + mov edx,dword 2ch_text_ptr ;укажем адрес от куда нужно выводить строку mcall 4 ;Вывод popad ;восстановить значения регистров из стека ret 4 ;выйдем из процедуры и удалим из стека указатель на структуру (4 байта) -check_box_clear_ch: ;очистка чек бокса - mov edx,dword ch_color ;цвет внутри чек бокса +check_box_clear_ch2: ;очистка чек бокса + mov edx,dword 2ch_color ;цвет внутри чек бокса jmp @f ;безусловный прыжок на нижнюю метку @@ -check_box_draw_ch: ;нарисовать включенный чек бокс - mov edx,dword ch_border_color ;загрузить цвет +check_box_draw_ch2: ;нарисовать включенный чек бокс + mov edx,dword 2ch_border_color ;загрузить цвет @@: ;Отобразить включеный checkbox - mov ebx,dword ch_left_s ;загружаем х shl 16 + длинна по Х - mov ecx,dword ch_top_s ;загружаем Y shl 16 + длинна по Y + mov ebx,dword 2ch_left_s ;загружаем х shl 16 + длинна по Х + mov ecx,dword 2ch_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 @@ -101,14 +101,14 @@ check_box_draw_ch: ; } -macro use_checkbox_mouse +macro use_checkbox_mouse2 { ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Обработчик mouse ;При попадании мышки + нажата клавиша в область checkbox состояние бокса должно менятся активный - не активный. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -check_box_mouse: ;обработка мыши +check_box_mouse2: ;обработка мыши pushad mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке mcall 37,2 ;проверяем состояние клавиш мышки. Было ли событие нажатая клавиша на мышке. @@ -119,7 +119,7 @@ pushad mcall 37,1 ;получить координаты курсора относительно окна ;на выходе в eax x shl 16 + y ;сравнение верхней точки по Y - mov ecx,dword ch_top_s ;y shl 16 +длинна по y + mov ecx,dword 2ch_top_s ;y shl 16 +длинна по y mov ebx,ecx shr ebx,16 ;bx = координата по y cmp ax,bx @@ -131,24 +131,24 @@ pushad ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; shr eax,16 ;сместим координату по Х в нижную часть регистра т.е. в ax ;сравнение по начальной точке Х - mov ecx,dword ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса + mov ecx,dword 2ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса mov ebx,ecx shr ebx,16 ;bx = координата по X cmp ax,bx jb .check_box_mouse_end ;указатель мышки меньше начальной координаты по X чем координата по X у бокса ;сравнение конечной точки по X add bx,cx ;сложим длинну по x и координату точки по х получим координату конечной точки по Х - add bx,word ch_sz_str ;добавим длинну строки текста с отступом предвартиельно записав их в момент инициализации + add bx,word 2ch_sz_str ;добавим длинну строки текста с отступом предвартиельно записав их в момент инициализации cmp ax,bx ja .check_box_mouse_end ;указатель мышки больше конечной координаты по х чем координата по Х у бокса ;если все проверки были успешно пройдены мы обязаны поменять состояние бокса - btc dword ch_flags,2 ;перенос 2-го бита в cf и инверсия его + btc dword 2ch_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_ch2 ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона. .enable_box: - call check_box_draw_ch ;отобразить включенный чек бокс + call check_box_draw_ch2 ;отобразить включенный чек бокс .check_box_mouse_end: popad ;восстановить регистры из стека ret 4 ;выйти и восстановим стек diff --git a/programs/develop/libraries/box_lib/trunk/bl_sys.mac b/programs/develop/libraries/box_lib/trunk/bl_sys.mac index fead243904..fe2eb2a730 100644 --- a/programs/develop/libraries/box_lib/trunk/bl_sys.mac +++ b/programs/develop/libraries/box_lib/trunk/bl_sys.mac @@ -1,5 +1,6 @@ include 'editbox.mac' ;macro which should make life easier :) specially for editbox -include 'checkbox.mac' ;macro implements checkbox +include 'checkbox.mac' ;macro implements checkbox old version +include 'checkbox2.mac' ;macro implements checkbox version 2 include 'optionbox.mac' ;macro implements optionbox include 'scrollbar.mac' ;macro implements scrollbar include 'd_button.mac' ;macro implements dinamic_button diff --git a/programs/develop/libraries/box_lib/trunk/box_lib.asm b/programs/develop/libraries/box_lib/trunk/box_lib.asm index bcc18d5cff..cb3883bb55 100644 --- a/programs/develop/libraries/box_lib/trunk/box_lib.asm +++ b/programs/develop/libraries/box_lib/trunk/box_lib.asm @@ -37,13 +37,22 @@ align 16 use_editbox_mouse ;macro reveals processing function of the mouse. ;---------------------------------------------------- -;CheckBox +;CheckBox old version ;---------------------------------------------------- align 16 use_checkbox_draw ;macro reveals the function of the display. align 16 use_checkbox_mouse ;macro reveals processing function of the mouse. +;---------------------------------------------------- +;CheckBox2 +;---------------------------------------------------- +align 16 +_init_checkbox2 ;macro for init checkbox +align 16 +use_checkbox_draw2 ;macro reveals the function of the display. +align 16 +use_checkbox_mouse2 ;macro reveals processing function of the mouse. ;-------------------------------------------------- ;radiobutton Group @@ -132,6 +141,12 @@ dd sz_check_box_draw, check_box_draw dd sz_check_box_mouse, check_box_mouse dd szVersion_ch, 0x00000001 +dd sz_init_checkbox2, init_checkbox2 +dd sz_check_box_draw2, check_box_draw2 +dd sz_check_box_mouse2, check_box_mouse2 +dd szVersion_ch2, 0x00000002 + + dd sz_option_box_draw, option_box_draw dd sz_option_box_mouse, option_box_mouse dd szVersion_op, 0x00000001 @@ -230,6 +245,11 @@ sz_check_box_draw db 'check_box_draw',0 sz_check_box_mouse db 'check_box_mouse',0 szVersion_ch db 'version_ch',0 +sz_init_checkbox2 db 'init_checkbox2',0 +sz_check_box_draw2 db 'check_box_draw2',0 +sz_check_box_mouse2 db 'check_box_mouse2',0 +szVersion_ch2 db 'version_ch2',0 + sz_option_box_draw db 'option_box_draw',0 sz_option_box_mouse db 'option_box_mouse',0 szVersion_op db 'version_op',0 diff --git a/programs/develop/libraries/box_lib/trunk/box_lib.mac b/programs/develop/libraries/box_lib/trunk/box_lib.mac index e56ef4a711..88f30abbb3 100644 --- a/programs/develop/libraries/box_lib/trunk/box_lib.mac +++ b/programs/develop/libraries/box_lib/trunk/box_lib.mac @@ -148,6 +148,94 @@ macro check_boxes_set_sys_color start,end,color_table loop @b } + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Basic macros for use CheckBox ; +;Last change 12.10.2010 ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +ch_struc_size=36 ;а §¬Ґа бвагЄвгал +ch_flag_en=10b ;д« Ј гбв ­®ў«Ґ­­®Ј® 祪 Ў®Єб . +ch_flag_top=0x0 ;д« Ј а бЇ®«®¦Ґ­Ёп ⥪бв  ўўҐаег в.Ґ. 3-© ЎЁв +ch_flag_middle=100b ;д« Ј а бЇ®«®¦Ґ­Ёп ⥪бв  ў 業вॠв.Ґ. 4-© ЎЁв. +ch_flag_bottom=1000b ;д« Ј а бЇ®«®¦Ґ­Ёп ⥪бв  ў ­Ё§г в.Ґ. Ї® 㬮«з ­Ёо ЇаЁ­Ё¬ Ґвбп §­ зҐ­ЁҐ ў­Ё§г в.Ґ. ®вбгбвўЁҐ 3-Ј® Ё 4-Ј® ЎЁв  + +2ch_left_s equ [ebp] ;Є®а¤Ё­ в  ­ з «  аЁб®ў ­Ёп Ї® е +2ch_top_s equ [ebp+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_flags equ [ebp+28] ;д« ЈЁ +2ch_sz_str equ [ebp+32] ;¤«Ё­­  бва®ЄЁ, ўлзЁб«пҐвбп ЇаЁ Ё­ЁжЁ «Ё§ жЁЁ Є®¬Ї®­Ґ­в  + +struc check_box2 left_s,top_s,ch_text_margin,color,border_color,text_color,text,flags +{ ;бвагЄвга  Ї а ¬Ґва®ў ¤«п 祪 Ў®Єб  +.left_s: dd left_s ;+0 Ї®«®¦Ґ­ЁҐ Ї® е dw + а §¬Ґа dw +.top_s: dd top_s ;+4 Ї®«®¦Ґ­ЁҐ Ї® г dw + а §¬Ґа dw +.ch_text_margin: dd ch_text_margin ;а ббв®п­ЁҐ ®в Їаאַ㣮«м­ЁЄ  祪 Ў®Єб  ¤® ­ ¤ЇЁбЁ +.color: dd color ;梥⠢­гвਠ祪Ў®Єб  +.border_color: dd border_color ;梥в а ¬ЄЁ +.text_color: dd text_color ;梥⠭ ¤ЇЁбЁ +.text: dd text ; ¤аҐб ў Є®¤Ґ Їа®Ја ¬¬л Ј¤Ґ а бЇ®«®¦Ґ­ ⥪бв +.flags: dd flags+0 ;д« ЈЁ +.size_of_str: dd 0x0 ;¤«Ё­­  бва®ЄЁ, ўлзЁб«пҐвбп ЇаЁ Ё­ЁжЁ «Ё§ жЁЁ Є®¬Ї®­Ґ­в  +} + +;Њ Єа®б Їа®ўҐаЄЁ 饫窠 ¬лиЄЁ ­ ¤ ЈагЇЇ®© checkboxes. +macro init_checkboxes2 start,end +{ + mov ebp,start + mov ecx,((end-start)/ch_struc_size) +@@: + push ebp ;гЄ § вҐ«м ­  ЇҐаўл© checkbox + call [init_checkbox2] ;¬ Єа®б Їа®ўҐаЄЁ ¬лиЄЁ ­ ¤ checkbox'®¬ + add ebp,ch_struc_size + loop @b +} + +;Њ Єа®б Їа®ўҐаЄЁ ¬лиЄЁ ЈагЇЇл checkboxes. +macro checkboxes_mouse2 start,end +{ + mov ebp,start + mov ecx,((end-start)/ch_struc_size) +@@: + push ebp ;гЄ § вҐ«м ­  ЇҐаўл© checkbox + call [check_box_mouse2] ;­ аЁб®ў вм checkbox + add ebp,ch_struc_size + loop @b +} + +;Њ Єа®б ®ваЁб®ўЄЁ ЈагЇЇл checkboxes. +macro checkboxes_draw2 start,end +{ + mov ebp,start + mov ecx,((end-start)/ch_struc_size) +@@: + push ebp ;гЄ § вҐ«м ­  ЇҐаўл© checkbox + call [check_box_draw2] ;­ аЁб®ў вм checkbox + add ebp,ch_struc_size + loop @b +} + +macro check_boxes_set_sys_color2 start,end,color_table +{ + mov ebp,start + mov ecx,((end-start)/ch_struc_size) + mov esi,color_table +@@: + push dword [esi+32] ;梥в ⥪бв  ў а Ў®зҐ© ®Ў« бвЁ ®Є­  + pop dword ch_text_color + push dword [esi+36] ;梥⠣а дЁЄЁ ў ®Є­Ґ (а §¤Ґ«ЁвҐ«м­лҐ «Ё­ЁЁ Ё в.Ї.) + pop dword ch_border_color + add ebp,ch_struc_size + loop @b +} + + + + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Basic macros for use OptionBox ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/programs/develop/libraries/box_lib/trunk/checkbox2.mac b/programs/develop/libraries/box_lib/trunk/checkbox2.mac new file mode 100644 index 0000000000..74c9afa464 --- /dev/null +++ b/programs/develop/libraries/box_lib/trunk/checkbox2.mac @@ -0,0 +1,155 @@ +;Последная модификация 03.10.2010 +;файл создан 13.02.2009 На код применена GPL2 лицензия +;Макрос для системной библиотеки box_lib.obj +;Checkbox + +;Инициализация checkbox +macro _init_checkbox2 +{ +init_checkbox2: +;подсчитаем кол-во символов в длинне выводимой строки. + pushad + mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке + mov ebx,dword 2ch_text_margin ;eax=0 + mov esi,dword 2ch_text_ptr ;указатель на строчку + lodsb ;в al первый символ из строки + test al,al + jz .ex_loop +@@: + add ebx,6 ;ширина символа + lodsb + test al,al + jnz @b +.ex_loop: + + mov dword 2ch_sz_str,ebx ;запишим длинну строки с учетом отступа от квадратика + popad + ret 4 +} + +macro use_checkbox_draw2 +{ +check_box_draw2: + pushad ;сохраним все регистры + mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке + mcall 13,2ch_left_s,2ch_top_s,2ch_border_color ;рисуем рамку чек бокса, фактически рисуем прямоугольник и закрашиваем фон внутри цветом рамки бокса + + mov edx,dword 2ch_color ;загружаем цвет фона + add ebx,1 shl 16 - 2 + add ecx,1 shl 16 - 2 + mcall ;закрашиваем внутренности чекбокса фоном + + test dword 2ch_flags,2 ;достать значение бита из переменной и поместить в флаг CF + jz @f ;в если CF=1, то выполним следующую процедуру иначе перейти на нижнюю @@ + call check_box_draw_ch2 ;нарисовать включенный чек бокс +@@: +;---------------------------- +;расчет куда будет произведен вывод текста +;---------------------------- +; mov ebx,dword ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса +; add ebx,dword ch_text_margin ;добавим размер стороны и расстояние на котором начнется вывод текста +; shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) +; add ebx,dword ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х + +; mov eax,word ch_top_s ;загрузим значение по (y shl 16 + длинна) для чек бокса +; shr eax,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) +; add eax,dword ch_top_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Y + +; Оптимизация для ЦП + mov ebx,dword 2ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса + mov eax,dword 2ch_top_s ;загрузим значение по (y shl 16 + длинна) для чек бокса + mov ecx,eax + add ebx,dword 2ch_text_margin ;добавим размер стороны и расстояние на котором начнется вывод текста + shr eax,16 ;сдвинем на 16 разрядов в право (разделим на 65536) в ax верхная точка + shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + + sub ecx,8 ;корретировка учитываем высоту шрифта + + test dword 2ch_flags,ch_flag_bottom ;проверим, нужно ли выводить вверху надпись + jnz .bottom + + test dword 2ch_flags,ch_flag_middle ;проверим, нужно ли выводить в центр надпись + jz .top ;остался только top + + shr cx,1 ;разделим на 2 +.bottom: + add ax,cx +.top: + add ebx,dword 2ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х + mov bx,ax + ;ebx х shl 16 +y координаты вывода строчки + + mov ecx,dword 2ch_text_color ;загрузим цвет надписи + flags + mov edx,dword 2ch_text_ptr ;укажем адрес от куда нужно выводить строку + mcall 4 ;Вывод + popad ;восстановить значения регистров из стека + ret 4 ;выйдем из процедуры и удалим из стека указатель на структуру (4 байта) + +check_box_clear_ch2: ;очистка чек бокса + mov edx,dword 2ch_color ;цвет внутри чек бокса + jmp @f ;безусловный прыжок на нижнюю метку @@ +check_box_draw_ch2: ;нарисовать включенный чек бокс + mov edx,dword 2ch_border_color ;загрузить цвет +@@: +;Отобразить включеный checkbox + mov ebx,dword 2ch_left_s ;загружаем х shl 16 + длинна по Х + mov ecx,dword 2ch_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 +} + + +macro use_checkbox_mouse2 +{ + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Обработчик mouse +;При попадании мышки + нажата клавиша в область checkbox состояние бокса должно менятся активный - не активный. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +check_box_mouse2: ;обработка мыши +pushad + mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке + mcall 37,2 ;проверяем состояние клавиш мышки. Было ли событие нажатая клавиша на мышке. + test eax,eax ;проверка если у нас в eax=0, выйдем + jz .check_box_mouse_end ;обработка закончилась +; Да событие: нажатие клавиши мышки произошло. +@@: + mcall 37,1 ;получить координаты курсора относительно окна + ;на выходе в eax x shl 16 + y +;сравнение верхней точки по Y + mov ecx,dword 2ch_top_s ;y shl 16 +длинна по y + mov ebx,ecx + shr ebx,16 ;bx = координата по y + cmp ax,bx + jb .check_box_mouse_end ;указатель мышки меньше начальной координаты по y чем координата по Y у бокса +;сравнение нижней точки по Y + add cx,bx ;сложим длинну по y и координату верхней точки по y поличим координату нижней точки по Y + cmp ax,cx + ja .check_box_mouse_end ;указатель мышки больше конечной координаты по y чем координата по Y у бокса +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + shr eax,16 ;сместим координату по Х в нижную часть регистра т.е. в ax +;сравнение по начальной точке Х + mov ecx,dword 2ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса + mov ebx,ecx + shr ebx,16 ;bx = координата по X + cmp ax,bx + jb .check_box_mouse_end ;указатель мышки меньше начальной координаты по X чем координата по X у бокса +;сравнение конечной точки по X + add bx,cx ;сложим длинну по x и координату точки по х получим координату конечной точки по Х + add bx,word 2ch_sz_str ;добавим длинну строки текста с отступом предвартиельно записав их в момент инициализации + cmp ax,bx + ja .check_box_mouse_end ;указатель мышки больше конечной координаты по х чем координата по Х у бокса +;если все проверки были успешно пройдены мы обязаны поменять состояние бокса + btc dword 2ch_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_ch2 ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона. + +.enable_box: + call check_box_draw_ch2 ;отобразить включенный чек бокс +.check_box_mouse_end: +popad ;восстановить регистры из стека + ret 4 ;выйти и восстановим стек +} \ No newline at end of file