forked from KolibriOS/kolibrios
new version checkbox ver. 2
git-svn-id: svn://kolibrios.org@1657 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
1a4a3e0071
commit
b096a3be30
@ -43,6 +43,8 @@ align 16
|
|||||||
;CheckBox
|
;CheckBox
|
||||||
;----------------------------------------------------
|
;----------------------------------------------------
|
||||||
align 16
|
align 16
|
||||||
|
_init_checkbox ;macro for init checkbox
|
||||||
|
align 16
|
||||||
use_checkbox_draw ;macro reveals the function of the display.
|
use_checkbox_draw ;macro reveals the function of the display.
|
||||||
align 16
|
align 16
|
||||||
use_checkbox_mouse ;macro reveals processing function of the mouse.
|
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 sz_edit_box_set_text, edit_box_set_text
|
||||||
;dd szVersion_ed, 0x00000001
|
;dd szVersion_ed, 0x00000001
|
||||||
|
|
||||||
|
dd sz_init_checkbox, init_checkbox
|
||||||
dd sz_check_box_draw, check_box_draw
|
dd sz_check_box_draw, check_box_draw
|
||||||
dd sz_check_box_mouse, check_box_mouse
|
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_draw, option_box_draw
|
||||||
;dd sz_option_box_mouse, option_box_mouse
|
;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
|
sz_edit_box_set_text db 'edit_box_set_text',0
|
||||||
szVersion_ed db 'version_ed',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_draw db 'check_box_draw',0
|
||||||
sz_check_box_mouse db 'check_box_mouse',0
|
sz_check_box_mouse db 'check_box_mouse',0
|
||||||
szVersion_ch db 'version_ch',0
|
szVersion_ch db 'version_ch',0
|
||||||
|
@ -103,9 +103,9 @@ macro edit_boxes_set_sys_color start,end,color_table
|
|||||||
}
|
}
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;Basic macros for use CheckBox ;
|
;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_flag_en=10b ;ôëŕă óńňŕíîâëĺííîăî ÷ĺę áîęńŕ.
|
||||||
|
|
||||||
ch_left_s equ [ebp] ;ęîđäčíŕňŕ íŕ÷ŕëŕ đčńîâŕíč˙ ďî ő
|
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_color equ [ebp+20] ;[edi+4] ;öâĺň ňĺęńňŕ
|
||||||
ch_text_ptr equ [ebp+24] ;óęŕçŕňĺëü íŕ íŕ÷ŕëî ňĺęńňîâîé ńňđîęč
|
ch_text_ptr equ [ebp+24] ;óęŕçŕňĺëü íŕ íŕ÷ŕëî ňĺęńňîâîé ńňđîęč
|
||||||
ch_flags equ [ebp+28] ;ôëŕăč
|
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
|
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 ;öâĺň đŕěęč
|
.border_color: dd border_color ;öâĺň đŕěęč
|
||||||
.text_color: dd text_color ;öâĺň íŕäďčńč
|
.text_color: dd text_color ;öâĺň íŕäďčńč
|
||||||
.text: dd text ;ŕäđĺń â ęîäĺ ďđîăđŕěěű ăäĺ đŕńďîëîćĺí ňĺęńň
|
.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
|
macro check_boxes_set_sys_color start,end,color_table
|
||||||
|
@ -52,11 +52,23 @@ include 'box_lib.mac'
|
|||||||
;--- Start of program ----------------------------------------------
|
;--- Start of program ----------------------------------------------
|
||||||
;---------------------------------------------------------------------
|
;---------------------------------------------------------------------
|
||||||
START:
|
START:
|
||||||
|
mcall 40,0x27
|
||||||
|
|
||||||
sys_load_library library_name, cur_dir_path, library_path, system_path, \
|
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
|
err_message_found_lib, head_f_l, myimport, err_message_import, head_f_i
|
||||||
test eax,eax
|
test eax,eax
|
||||||
jnz exit
|
jnz exit
|
||||||
|
;init checkboxes
|
||||||
|
push dword check1
|
||||||
|
call [init_checkbox]
|
||||||
|
|
||||||
|
push dword check2
|
||||||
|
call [init_checkbox]
|
||||||
|
|
||||||
|
push dword check3
|
||||||
|
call [init_checkbox]
|
||||||
|
|
||||||
|
|
||||||
window:
|
window:
|
||||||
call draw_window ;ïåðâîíà÷àëüíî íåîáõîäèìî íàðèñîâàòü îêíî
|
call draw_window ;ïåðâîíà÷àëüíî íåîáõîäèìî íàðèñîâàòü îêíî
|
||||||
align 4
|
align 4
|
||||||
@ -75,6 +87,10 @@ still: ;
|
|||||||
push dword check2
|
push dword check2
|
||||||
call [check_box_mouse]
|
call [check_box_mouse]
|
||||||
|
|
||||||
|
push dword check3
|
||||||
|
call [check_box_mouse]
|
||||||
|
|
||||||
|
|
||||||
jmp still ;åñëè íè÷åãî èç ïåðå÷èñëåííîãî òî ñíîâà â öèêë
|
jmp still ;åñëè íè÷åãî èç ïåðå÷èñëåííîãî òî ñíîâà â öèêë
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
button:
|
button:
|
||||||
@ -99,6 +115,10 @@ draw_window: ;
|
|||||||
push dword check2
|
push dword check2
|
||||||
call [check_box_draw]
|
call [check_box_draw]
|
||||||
|
|
||||||
|
push dword check3
|
||||||
|
call [check_box_draw]
|
||||||
|
|
||||||
|
|
||||||
mcall 12,2
|
mcall 12,2
|
||||||
ret
|
ret
|
||||||
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||||
@ -119,24 +139,28 @@ err_message_import db 'Error on load import library box_lib.obj',0
|
|||||||
|
|
||||||
myimport:
|
myimport:
|
||||||
|
|
||||||
|
init_checkbox dd aInit_checkbox
|
||||||
check_box_draw dd aCheck_box_draw
|
check_box_draw dd aCheck_box_draw
|
||||||
check_box_mouse dd aCheck_box_mouse
|
check_box_mouse dd aCheck_box_mouse
|
||||||
version_ch dd aVersion_ch
|
version_ch dd aVersion_ch
|
||||||
dd 0,0
|
dd 0,0
|
||||||
|
|
||||||
|
|
||||||
|
aInit_checkbox db 'init_checkbox',0
|
||||||
aCheck_box_draw db 'check_box_draw',0
|
aCheck_box_draw db 'check_box_draw',0
|
||||||
aCheck_box_mouse db 'check_box_mouse',0
|
aCheck_box_mouse db 'check_box_mouse',0
|
||||||
aVersion_ch db 'version_ch',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
|
check1 check_box (20 shl 16 + 12),(45 shl 16 + 12),6,0xC0AABBCC,0,0x80000000,check_text,ch_flag_en
|
||||||
check2 check_box (10 shr 16 + 12),(60 shr 16 + 12),6,0x80AABBCC,0,0,check_text2
|
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 <Lrz> date 03.10.2010',0
|
hed db 'CheckBox Exemples <Lrz> date 12.10.2010',0
|
||||||
hed_end:
|
hed_end:
|
||||||
;---------------------------------------------------------------------
|
;---------------------------------------------------------------------
|
||||||
check_text db 'First checkbox',0
|
check_text db 'First checkbox',0
|
||||||
check_text2 db 'Second checkbox',0
|
check_text2 db 'Second checkbox',0
|
||||||
|
check_text3 db 'Number 3 checkbox',0
|
||||||
;---------------------------------------------------------------------
|
;---------------------------------------------------------------------
|
||||||
MEM_END:
|
MEM_END:
|
||||||
cur_dir_path rb 1024
|
cur_dir_path rb 1024
|
||||||
|
@ -3,16 +3,35 @@
|
|||||||
;Макрос для системной библиотеки box_lib.obj
|
;Макрос для системной библиотеки box_lib.obj
|
||||||
;Checkbox
|
;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
|
macro use_checkbox_draw
|
||||||
{
|
{
|
||||||
check_box_draw:
|
check_box_draw:
|
||||||
pushad ;сохраним все регистры
|
pushad ;сохраним все регистры
|
||||||
mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке
|
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 ;рисуем рамку чек бокса, фактически рисуем прямоугольник и закрашиваем фон внутри цветом рамки бокса
|
mcall 13,ch_left_s,ch_top_s,ch_border_color ;рисуем рамку чек бокса, фактически рисуем прямоугольник и закрашиваем фон внутри цветом рамки бокса
|
||||||
|
|
||||||
mov edx,dword ch_color ;загружаем цвет фона
|
mov edx,dword ch_color ;загружаем цвет фона
|
||||||
@ -33,24 +52,24 @@ check_box_draw:
|
|||||||
; add ebx,dword ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х
|
; add ebx,dword ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х
|
||||||
|
|
||||||
; mov eax,word ch_top_s ;загрузим значение по (y shl 16 + длинна) для чек бокса
|
; 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
|
; add eax,dword ch_top_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Y
|
||||||
|
|
||||||
; Оптимизация для ЦП
|
; Оптимизация для ЦП
|
||||||
mov ebx,dword ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса
|
mov ebx,dword ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса
|
||||||
mov eax,dword ch_top_s ;загрузим значение по (y shl 16 + длинна) для чек бокса
|
mov eax,dword ch_top_s ;загрузим значение по (y shl 16 + длинна) для чек бокса
|
||||||
add ebx,dword ch_text_margin ;добавим размер стороны и расстояние на котором начнется вывод текста
|
add ebx,dword ch_text_margin ;добавим размер стороны и расстояние на котором начнется вывод текста
|
||||||
shl eax,16 ;сдвинем на 16 разрядов в лево (умножим на 65536)
|
shr eax,16 ;сдвинем на 16 разрядов в лево (умножим на 65536)
|
||||||
shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536)
|
shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536)
|
||||||
add eax,dword ch_top_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Y
|
add eax,dword ch_top_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Y
|
||||||
add ebx,dword ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х
|
add ebx,dword ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х
|
||||||
shr eax,16 ;для y поместим в младшую часть
|
sub ax,7 ;внесем смещение для y
|
||||||
mov bx,ax ;внесем смещение для y
|
mov bx,ax
|
||||||
|
;ebx х shl 16 +y координаты вывода строчки
|
||||||
|
|
||||||
mov ecx,dword ch_text_color ;загрузим цвет надписи + flags
|
mov ecx,dword ch_text_color ;загрузим цвет надписи + flags
|
||||||
mov edx,dword ch_text_ptr ;укажем адрес от куда нужно выводить строку
|
mov edx,dword ch_text_ptr ;укажем адрес от куда нужно выводить строку
|
||||||
mov eax,4 ;внесем в eax значение вывода надписи на канву
|
mcall 4 ;Вывод
|
||||||
mcall ;Вывод
|
|
||||||
popad ;восстановить значения регистров из стека
|
popad ;восстановить значения регистров из стека
|
||||||
ret 4 ;выйдем из процедуры и удалим из стека указатель на структуру (4 байта)
|
ret 4 ;выйдем из процедуры и удалим из стека указатель на структуру (4 байта)
|
||||||
|
|
||||||
@ -60,33 +79,12 @@ check_box_clear_ch: ;
|
|||||||
check_box_draw_ch: ;нарисовать включенный чек бокс
|
check_box_draw_ch: ;нарисовать включенный чек бокс
|
||||||
mov edx,dword ch_border_color ;загрузить цвет
|
mov edx,dword ch_border_color ;загрузить цвет
|
||||||
@@:
|
@@:
|
||||||
; movzx ebx,word ch_left ;загрузить координату по х
|
;Отобразить включеный checkbox
|
||||||
; mov eax,dword ch_size
|
mov ebx,dword ch_left_s ;загружаем х shl 16 + длинна по Х
|
||||||
; mov di,ax
|
mov ecx,dword ch_top_s ;загружаем Y shl 16 + длинна по Y
|
||||||
; shr eax,2
|
add ebx,2 shl 16 - 4 ;после этих изменений (X+2) shl 16 +длинна по (Х-2)
|
||||||
; push ax
|
add ecx,2 shl 16 - 4 ;после этих изменений (Y+2) shl 16 +длинна по (Y-2)
|
||||||
;
|
mcall 13 ;отобразить квадрат внутри checkbox
|
||||||
; 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
|
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,16 +94,14 @@ macro use_checkbox_mouse
|
|||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;Обработчик mouse
|
;Обработчик mouse
|
||||||
; При попадании мышки + нажата клавиша в область checkbox состояние бокса должно менятся активный - не активный.
|
;При попадании мышки + нажата клавиша в область checkbox состояние бокса должно менятся активный - не активный.
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
check_box_mouse: ;обработка мыши
|
check_box_mouse: ;обработка мыши
|
||||||
pushad
|
pushad
|
||||||
mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке
|
mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке
|
||||||
mcall 37,2 ;проверяем состояние клавиш мышки. Было ли событие нажатая клавиша на мышке.
|
mcall 37,2 ;проверяем состояние клавиш мышки. Было ли событие нажатая клавиша на мышке.
|
||||||
test eax,eax ;проверка если у нас в eax=0, то установим флаг и выйдем
|
test eax,eax ;проверка если у нас в eax=0, выйдем
|
||||||
jnz @f ;перейти на нижнюю метку @@, если в eax не 0.
|
jz .check_box_mouse_end ;обработка закончилась
|
||||||
; and dword ch_flags,eax ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое.
|
|
||||||
jmp .check_box_mouse_end ;обработка закончилась
|
|
||||||
; Да событие: нажатие клавиши мышки произошло.
|
; Да событие: нажатие клавиши мышки произошло.
|
||||||
@@:
|
@@:
|
||||||
mcall 37,1 ;получить координаты курсора относительно окна
|
mcall 37,1 ;получить координаты курсора относительно окна
|
||||||
@ -120,6 +116,8 @@ pushad
|
|||||||
add cx,bx ;сложим длинну по y и координату верхней точки по y поличим координату нижней точки по Y
|
add cx,bx ;сложим длинну по y и координату верхней точки по y поличим координату нижней точки по Y
|
||||||
cmp ax,cx
|
cmp ax,cx
|
||||||
ja .check_box_mouse_end ;указатель мышки больше конечной координаты по y чем координата по Y у бокса
|
ja .check_box_mouse_end ;указатель мышки больше конечной координаты по y чем координата по Y у бокса
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
shr eax,16 ;сместим координату по Х в нижную часть регистра т.е. в ax
|
||||||
;сравнение по начальной точке Х
|
;сравнение по начальной точке Х
|
||||||
mov ecx,dword ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса
|
mov ecx,dword ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса
|
||||||
mov ebx,ecx
|
mov ebx,ecx
|
||||||
@ -127,74 +125,19 @@ pushad
|
|||||||
cmp ax,bx
|
cmp ax,bx
|
||||||
jb .check_box_mouse_end ;указатель мышки меньше начальной координаты по X чем координата по X у бокса
|
jb .check_box_mouse_end ;указатель мышки меньше начальной координаты по X чем координата по X у бокса
|
||||||
;сравнение конечной точки по X
|
;сравнение конечной точки по X
|
||||||
add bx,cx ;сложим длинну по y и координату верхней точки по y поличим координату нижней точки по Y
|
add bx,cx ;сложим длинну по x и координату точки по х получим координату конечной точки по Х
|
||||||
add ebx,dword ch_text_margin ;добавим размер стороны и расстояние на котором начнется вывод текста
|
add bx,word ch_sz_str ;добавим длинну строки текста с отступом предвартиельно записав их в момент инициализации
|
||||||
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
|
|
||||||
cmp ax,bx
|
cmp ax,bx
|
||||||
ja .check_box_mouse_end ;указатель мышки больше конечной координаты по y чем координата по Y у бокса
|
ja .check_box_mouse_end ;указатель мышки больше конечной координаты по х чем координата по Х у бокса
|
||||||
;если все проверки были успешно пройдены мы обязаны поменять состояние бокса
|
;если все проверки были успешно пройдены мы обязаны поменять состояние бокса
|
||||||
btc dword ch_flags,2 ;перенос 2-го бита в cf и инверсия его
|
btc dword ch_flags,2 ;перенос 2-го бита в cf и инверсия его
|
||||||
jc .enable_box ;если CF=1 то отобразим включенный бокс и выйдем
|
jc .enable_box ;если CF=1 то отобразим включенный бокс и выйдем
|
||||||
push dword .check_box_mouse_end ;фокус -покус, вернемся после вызова check_box_clear_ch на метку check_box_mouse_end
|
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:
|
.enable_box:
|
||||||
call check_box_draw_ch ;отобразить включенный чек бокс
|
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 ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона.
|
|
||||||
.check_box_mouse_end:
|
.check_box_mouse_end:
|
||||||
popad ;восстановить регистры из стека
|
popad ;восстановить регистры из стека
|
||||||
ret 4 ;выйти
|
ret 4 ;выйти и восстановим стек
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user