Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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