Subversion Repositories Kolibri OS

Rev

Rev 6789 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
8346 IgorA 1
;Последная модификация 08.12.2020
1682 lrz 2
;файл создан 13.02.2009  На код применена GPL2 лицензия
3
;Checkbox
4
 
5
;Инициализация checkbox
6789 IgorA 6
align 16
8346 IgorA 7
init_checkbox:
1682 lrz 8
;подсчитаем кол-во символов в длинне выводимой строки.
9
	pushad
10
	mov	ebp,dword [esp+36]	;загружаем указатель на структуру, указатель мы передаем в стеке
8346 IgorA 11
	mov	ebx,dword ch_text_margin	;eax=0
12
	mov	esi,dword ch_text_ptr   ;указатель на строчку
1682 lrz 13
	lodsb	                        ;в al первый символ из строки
14
	test	al,al
15
	jz	.ex_loop
16
@@:
17
	add	ebx,6			;ширина символа
18
	lodsb
19
	test	al,al
20
	jnz	@b
21
.ex_loop:
22
 
8346 IgorA 23
	mov	dword ch_sz_str,ebx     ;запишем длинну строки с учетом отступа от квадратика
24
	or	dword ch_text_color,0x80000000 ;добавляем бит для вывода ASCIIZ-строки
1720 IgorA 25
		;на случай если пользователь забыл его самостоятельно поставить в структуре
1682 lrz 26
	popad
27
	ret 4
28
 
6789 IgorA 29
 
30
align 16
8346 IgorA 31
check_box_draw:
1682 lrz 32
	pushad   ;сохраним все регистры
33
	mov	ebp,dword [esp+36]	;загружаем указатель на структуру, указатель мы передаем в стеке
8346 IgorA 34
	mcall	SF_DRAW_RECT,ch_left_s,ch_top_s,ch_border_color		;рисуем рамку чек бокса, фактически рисуем прямоугольник и закрашиваем фон внутри цветом рамки бокса
1682 lrz 35
 
8346 IgorA 36
	mov	edx,dword ch_color	;загружаем цвет фона
6789 IgorA 37
	add	ebx,1 shl 16 - 2
38
	add	ecx,1 shl 16 - 2
39
	mcall ;закрашиваем внутренности чекбокса фоном
1682 lrz 40
 
8346 IgorA 41
	test dword ch_flags,2  ;достать значение бита из переменной и поместить в  флаг CF
1682 lrz 42
	jz   @f                ;в если CF=1, то выполним следующую процедуру иначе перейти на нижнюю @@
8346 IgorA 43
	call check_box_draw_ch ;нарисовать включенный чек бокс
1682 lrz 44
@@:
45
;----------------------------
46
;расчет куда будет произведен вывод текста
47
;----------------------------
48
;        mov 	ebx,dword ch_left_s		;загрузить значение (х shl 16 + длинна)  для чек бокса
49
;        add	ebx,dword ch_text_margin	;добавим размер стороны и расстояние на котором начнется вывод текста
50
;        shl	ebx,16				;сдвинем на 16 разрядов в лево (умножим на 65536)
51
;        add	ebx,dword ch_left_s             ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х
52
 
53
;        mov	eax,word ch_top_s		;загрузим значение по (y shl 16 + длинна) для чек бокса
54
;        shr	eax,16				;сдвинем на 16 разрядов в лево (умножим на 65536)
55
;        add	eax,dword ch_top_s		;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Y
56
 
57
; Оптимизация для ЦП
8346 IgorA 58
	mov	ebx,dword ch_left_s		;загрузить значение (х shl 16 + длинна)  для чек бокса
59
	mov	eax,dword ch_top_s		;загрузим значение по (y shl 16 + длинна) для чек бокса
1682 lrz 60
	mov	ecx,eax
8346 IgorA 61
	add	ebx,dword ch_text_margin	;добавим размер стороны и расстояние на котором начнется вывод текста
1682 lrz 62
	shr	eax,16				;сдвинем на 16 разрядов в право (разделим на 65536) в ax верхная точка
63
	shl	ebx,16				;сдвинем на 16 разрядов в лево (умножим на 65536)
64
 
65
	sub	ecx,8				;корретировка учитываем высоту шрифта
66
 
8346 IgorA 67
	test 	dword ch_flags,ch_flag_bottom	;проверим, нужно ли выводить вверху надпись
1682 lrz 68
	jnz	.bottom
69
 
8346 IgorA 70
	test 	dword ch_flags,ch_flag_middle	;проверим, нужно ли выводить в центр надпись
1682 lrz 71
	jz	.top				;остался только top
72
 
73
	shr	cx,1				;разделим на 2
74
.bottom:
75
	add	ax,cx
76
.top:
8346 IgorA 77
	add	ebx,dword ch_left_s             ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х
1682 lrz 78
	mov	bx,ax
79
						;ebx х shl 16 +y координаты вывода строчки
80
 
8346 IgorA 81
	mov	ecx,dword ch_text_color		;загрузим цвет надписи + flags
82
	mov	edx,dword ch_text_ptr		;укажем адрес от куда нужно выводить строку
6789 IgorA 83
	mcall	SF_DRAW_TEXT
1682 lrz 84
	popad					;восстановить значения регистров из стека
85
	ret 4					;выйдем из процедуры и удалим из стека указатель на структуру (4 байта)
86
 
8346 IgorA 87
check_box_clear_ch:				;очистка чек бокса
88
	mov	edx,dword ch_color   		;цвет внутри чек бокса
6789 IgorA 89
	jmp	@f				;безусловный прыжок на нижнюю метку @@
8346 IgorA 90
check_box_draw_ch:				;нарисовать включенный чек бокс
91
        mov	edx,dword ch_border_color	;загрузить цвет
1682 lrz 92
@@:
93
;Отобразить включеный checkbox
8346 IgorA 94
	mov	ebx,dword ch_left_s		;загружаем х shl 16 + длинна по Х
95
	mov	ecx,dword ch_top_s		;загружаем Y shl 16 + длинна по Y
6789 IgorA 96
	add	ebx,2 shl 16 - 4		;после этих изменений (X+2) shl 16 +длинна по (Х-2)
97
	add	ecx,2 shl 16 - 4		;после этих изменений (Y+2) shl 16 +длинна по (Y-2)
98
	mcall	SF_DRAW_RECT ;отобразить квадрат внутри checkbox
1682 lrz 99
	ret
100
 
101
 
102
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
103
;Обработчик mouse
104
;При попадании мышки + нажата клавиша в область checkbox состояние бокса должно менятся активный - не активный.
105
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6789 IgorA 106
align 16
8346 IgorA 107
check_box_mouse:      ;обработка мыши
1682 lrz 108
pushad
109
	mov	ebp,dword [esp+36]	;загружаем указатель на структуру, указатель мы передаем в стеке
6789 IgorA 110
	mcall	SF_MOUSE_GET,SSF_BUTTON ;проверяем состояние клавиш мышки. Было ли событие нажатая клавиша на мышке.
1682 lrz 111
	test    eax,eax			;проверка если у нас в eax=0, выйдем
112
	jz	.check_box_mouse_end    ;обработка закончилась
113
; Да событие: нажатие клавиши мышки произошло.
114
@@:
6789 IgorA 115
	mcall	SF_MOUSE_GET,SSF_WINDOW_POSITION ;получить координаты курсора относительно окна
1682 lrz 116
					;на выходе в eax x shl 16 + y
117
;сравнение верхней точки по Y
8346 IgorA 118
	mov	ecx,dword ch_top_s	;y shl 16 +длинна по y
1682 lrz 119
	mov	ebx,ecx
120
	shr	ebx,16                  ;bx = координата по y
121
	cmp	ax,bx
122
	jb	.check_box_mouse_end	;указатель мышки меньше начальной координаты по y чем координата по Y у бокса
123
;сравнение нижней точки по Y
124
	add	cx,bx			;сложим длинну по y и координату верхней точки по y поличим координату нижней точки по Y
125
	cmp	ax,cx
126
	ja	.check_box_mouse_end	;указатель мышки больше конечной координаты по y чем координата по Y у бокса
127
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
128
	shr	eax,16			;сместим координату по Х в нижную часть регистра т.е. в ax
129
;сравнение по начальной точке Х
8346 IgorA 130
	mov	ecx,dword ch_left_s	;загрузить значение (х shl 16 + длинна)  для чек бокса
1682 lrz 131
	mov	ebx,ecx
132
	shr	ebx,16                  ;bx = координата по X
133
	cmp	ax,bx
134
	jb	.check_box_mouse_end	;указатель мышки меньше начальной координаты по X чем координата по X у бокса
135
;сравнение конечной точки по X
136
	add	bx,cx			;сложим длинну по x и координату точки по х получим координату конечной точки по Х
8346 IgorA 137
	add	bx,word ch_sz_str	;добавим длинну строки текста с отступом предвартиельно записав их в момент инициализации
1682 lrz 138
	cmp	ax,bx
139
	ja	.check_box_mouse_end	;указатель мышки больше конечной координаты по х чем координата по Х у бокса
140
;если все проверки были успешно пройдены мы обязаны поменять состояние бокса
8346 IgorA 141
	btc	dword	ch_flags,1	;перенос 2-го бита в cf и инверсия его
1715 IgorA 142
	jnc	.enable_box		;если CF=1 то отобразим включенный бокс и выйдем
1682 lrz 143
	push	dword .check_box_mouse_end	;фокус -покус, вернемся после вызова check_box_clear_ch на метку check_box_mouse_end
8346 IgorA 144
	jmp	check_box_clear_ch     ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона.
1682 lrz 145
 
146
.enable_box:
8346 IgorA 147
	call	check_box_draw_ch	;отобразить включенный чек бокс
1682 lrz 148
.check_box_mouse_end:
149
popad					;восстановить регистры из стека
6789 IgorA 150
	ret 4				;выйти и восстановим стек