Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
6789 IgorA 1
;Последная модификация 07.12.2016
1682 lrz 2
;файл создан 13.02.2009  На код применена GPL2 лицензия
3
;Checkbox
4
 
5
;Инициализация checkbox
6789 IgorA 6
align 16
1682 lrz 7
init_checkbox2:
8
;подсчитаем кол-во символов в длинне выводимой строки.
9
	pushad
10
	mov	ebp,dword [esp+36]	;загружаем указатель на структуру, указатель мы передаем в стеке
11
	mov	ebx,dword 2ch_text_margin	;eax=0
12
	mov	esi,dword 2ch_text_ptr   ;указатель на строчку
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
 
1720 IgorA 23
	mov	dword 2ch_sz_str,ebx     ;запишем длинну строки с учетом отступа от квадратика
24
	or	dword 2ch_text_color,0x80000000 ;добавляем бит для вывода ASCIIZ-строки
25
		;на случай если пользователь забыл его самостоятельно поставить в структуре
1682 lrz 26
	popad
27
	ret 4
28
 
6789 IgorA 29
 
30
align 16
1682 lrz 31
check_box_draw2:
32
	pushad   ;сохраним все регистры
33
	mov	ebp,dword [esp+36]	;загружаем указатель на структуру, указатель мы передаем в стеке
6789 IgorA 34
	mcall	SF_DRAW_RECT,2ch_left_s,2ch_top_s,2ch_border_color		;рисуем рамку чек бокса, фактически рисуем прямоугольник и закрашиваем фон внутри цветом рамки бокса
1682 lrz 35
 
6789 IgorA 36
	mov	edx,dword 2ch_color	;загружаем цвет фона
37
	add	ebx,1 shl 16 - 2
38
	add	ecx,1 shl 16 - 2
39
	mcall ;закрашиваем внутренности чекбокса фоном
1682 lrz 40
 
41
	test dword 2ch_flags,2  ;достать значение бита из переменной и поместить в  флаг CF
42
	jz   @f                ;в если CF=1, то выполним следующую процедуру иначе перейти на нижнюю @@
43
	call check_box_draw_ch2 ;нарисовать включенный чек бокс
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
; Оптимизация для ЦП
6789 IgorA 58
	mov	ebx,dword 2ch_left_s		;загрузить значение (х shl 16 + длинна)  для чек бокса
1682 lrz 59
	mov	eax,dword 2ch_top_s		;загрузим значение по (y shl 16 + длинна) для чек бокса
60
	mov	ecx,eax
61
	add	ebx,dword 2ch_text_margin	;добавим размер стороны и расстояние на котором начнется вывод текста
62
	shr	eax,16				;сдвинем на 16 разрядов в право (разделим на 65536) в ax верхная точка
63
	shl	ebx,16				;сдвинем на 16 разрядов в лево (умножим на 65536)
64
 
65
	sub	ecx,8				;корретировка учитываем высоту шрифта
66
 
67
	test 	dword 2ch_flags,ch_flag_bottom	;проверим, нужно ли выводить вверху надпись
68
	jnz	.bottom
69
 
70
	test 	dword 2ch_flags,ch_flag_middle	;проверим, нужно ли выводить в центр надпись
71
	jz	.top				;остался только top
72
 
73
	shr	cx,1				;разделим на 2
74
.bottom:
75
	add	ax,cx
76
.top:
77
	add	ebx,dword 2ch_left_s             ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х
78
	mov	bx,ax
79
						;ebx х shl 16 +y координаты вывода строчки
80
 
81
	mov	ecx,dword 2ch_text_color		;загрузим цвет надписи + flags
6789 IgorA 82
	mov	edx,dword 2ch_text_ptr		;укажем адрес от куда нужно выводить строку
83
	mcall	SF_DRAW_TEXT
1682 lrz 84
	popad					;восстановить значения регистров из стека
85
	ret 4					;выйдем из процедуры и удалим из стека указатель на структуру (4 байта)
86
 
87
check_box_clear_ch2:				;очистка чек бокса
6789 IgorA 88
	mov	edx,dword 2ch_color   		;цвет внутри чек бокса
89
	jmp	@f				;безусловный прыжок на нижнюю метку @@
1682 lrz 90
check_box_draw_ch2:				;нарисовать включенный чек бокс
91
        mov	edx,dword 2ch_border_color	;загрузить цвет
92
@@:
93
;Отобразить включеный checkbox
94
	mov	ebx,dword 2ch_left_s		;загружаем х shl 16 + длинна по Х
95
	mov	ecx,dword 2ch_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
1682 lrz 107
check_box_mouse2:      ;обработка мыши
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
118
	mov	ecx,dword 2ch_top_s	;y shl 16 +длинна по y
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
;сравнение по начальной точке Х
6789 IgorA 130
	mov	ecx,dword 2ch_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 и координату точки по х получим координату конечной точки по Х
137
	add	bx,word 2ch_sz_str	;добавим длинну строки текста с отступом предвартиельно записав их в момент инициализации
138
	cmp	ax,bx
139
	ja	.check_box_mouse_end	;указатель мышки больше конечной координаты по х чем координата по Х у бокса
140
;если все проверки были успешно пройдены мы обязаны поменять состояние бокса
1715 IgorA 141
	btc	dword	2ch_flags,1	;перенос 2-го бита в cf и инверсия его
142
	jnc	.enable_box		;если CF=1 то отобразим включенный бокс и выйдем
1682 lrz 143
	push	dword .check_box_mouse_end	;фокус -покус, вернемся после вызова check_box_clear_ch на метку check_box_mouse_end
144
	jmp	check_box_clear_ch2     ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона.
145
 
146
.enable_box:
147
	call	check_box_draw_ch2	;отобразить включенный чек бокс
148
.check_box_mouse_end:
149
popad					;восстановить регистры из стека
6789 IgorA 150
	ret 4				;выйти и восстановим стек