Subversion Repositories Kolibri OS

Rev

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