Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
355 Lrz 1
;компонент OptionBox (Основан на Checkbox)
356 Lrz 2
;Огромная благодарность Maxxxx32, Diamond, Heavyiron, и другим программистам, и их программам, без
355 Lrz 3
;которых я не смог бы написать этот компонент.
362 Lrz 4
;19.02.2007 общее улучшение кода, уменьшение размера и использование системных цветов для отображения optionkbox
5
;16.02.2007 дата создания компонента
355 Lrz 6
;  - Теплов Алексей  www.lrz.land.ru
7
 
8
macro use_option_box
9
{
10
op_text_margin=4     ;расстояние от прямоугольника чек бокса до надписи
11
op_size=10           ;размер квадрата чек бокса
12
op_left equ [edi]    ;координата начала рисования по х
13
op_top equ [edi+2]   ;координата начала рисования по у
362 Lrz 14
op_border_color equ [sc.work_graph] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно
15
op_text_color equ   [sc.work_text];[edi+4]  ;цвет текста
16
;op_border_color equ [edi+4] ;цвет рамки optionbox
17
;op_text_color equ [edi+8]  ;цвет текста
18
op_text_ptr equ [edi+4]    ;указатель на начало текстовой строки
19
op_text_length equ [edi+8] ;длина надписи (2^64 такой длины может быть текст)
20
op_optibox_gr	equ [edi+10]
355 Lrz 21
option_box:
22
.draw:
23
pusha   ;сохраним все регистры
24
	mov	eax,38     	;рисование линии
25
	movzx	ebx,word op_left	;положение по х
26
	mov	ecx,ebx		;сохраним в регистре cx значение bx  1 микрооперация
27
	;push	bx  ;3 - микрооперации  используя стек можно выиграть в размере, используя регистры - в скорости
28
	shl	ebx,16		;сдвинем на 16 разрядов в лево (умножим на 65536)
29
	;pop	bx  ;2 - микрооперации  на данный момент сформирована [координата начала по оси x]*65536 + [координата начала по оси x]
30
	mov	bx,cx		;восстановим значение bx
31
	movzx	ecx,word op_top	;загрузим в cx значение y
32
	mov	esi,ecx		;сохраним значение регистра cx в регистр указатель si
33
	;push	cx
34
	shl	ecx,16		; сдвинем на 16 разрядов в лево (умножим на 65536)	mov	cx,si		;восстановим значение регистра cx
35
	mov 	cx,si		;восстановим значение регистра cx
36
	;pop	cx    	;[координата начала по оси y]*65536 + [координата начала по оси y]
37
	;push	cx
38
	add	ecx,op_size ;[координата начала по оси y]*65536 + [координата конца по оси y]
356 Lrz 39
	mov	edx,dword op_border_color ;Цвет линии
355 Lrz 40
	int	0x40   ;рисование вертикальной левой линии квадрата (прямоугольника)
41
;
42
	mov	ebp,ebx	;сохраним регистр bx в регистре указателя базы
43
	;push	bx   ;втолкнуть в bx [координата начала по оси х]*65536 + [координата начала по оси x]
44
	add	ebx,op_size      ;[координата начала + длина стороны по оси х]
45
	ror	ebx,16          ;[координата начала + дина стороны по оси х]*65536
46
	add	ebx,op_size      ;[координата начала+длина стороны по оси х]*65536 + [координата начала+длина стороны по оси x]
47
	int	0x40
48
 
49
	mov	bx,bp		;восстановим значение регистра bx
50
	;pop	bx
51
	mov	cx,si		;сохраним значение регистра cx в регистр указатель
52
	;pop	cx
53
	int	0x40
54
	add	ecx,op_size	;добавим размер стороны
55
	mov	esi,ecx		;сохраним значение регистра cx в регистр указатель si
56
	;push	cx
57
	shl	ecx,16
58
	mov	cx,si
59
	;pop	cx
60
	int	0x40            ;нарисовали прямоугольник
61
 
362 Lrz 62
	call	.clear_op       ;очистка области
355 Lrz 63
 
356 Lrz 64
        mov	eax,dword op_optibox_gr
355 Lrz 65
	mov	dword eax,[eax]
66
        cmp	eax,edi
67
	jne	@f
68
	call	.draw_op  ;нарисовать включенный чек бокс
69
;----------------------------
70
;расчет куда будет произведен вывод текста
71
;----------------------------
72
@@:	movzx	ebx,word op_left	;загрузить значение х для чек бокса
73
	add	ebx,(op_size+op_text_margin) ;добавить размер стороны и расстояние на котором начнется вывод текста
74
	shl	ebx,16		;сдвинем на 16 разрядов в лево (умножим на 65536)
75
	mov	bx,op_top	;загрузим значение по y
76
	add	ebx,(op_size-9+2)	;добавим значение длины стороны -9+2
77
	mov	ecx,op_text_color	;загрузим цвет надписи
78
 
79
	mov	edx,op_text_ptr		;укажем адрес от куда нужно выводить строку
80
	movzx 	esi,word op_text_length ;Загрузим длину надписи в esi
81
	;внесем в eax значение вывода надписи на канву
82
	mov	eax,4
83
	int	0x40          	;Вывод
84
popa				;восстановить значения регистров из стека
85
ret				;выйдем из процедуры
86
 
87
.clear_op:			;очистка чек бокса
356 Lrz 88
	mov	edx,dword [sc.work]	;цвет внутри чек бокса
355 Lrz 89
	jmp	@f		;безусловный прыжок на нижнюю метку @@
90
 
91
.draw_op:            ;нарисовать включенный чек бокс
92
	mov	edx,op_border_color	;загрузить цвет
93
@@:
94
	movzx	ebx,word op_left	;загрузить координату по х
95
	add	ebx,(op_size/3)	;добавить (сторона прямоугольника/3)
96
	shl	ebx,16		;сдвинем на 16 разрядов в лево (умножим на 65536)
97
	mov	bx,(op_size/2)	;загрузить (сторона прямоугольника/2)
98
	mov	bp,bx		;сохраним регистр bx в регистре указателя базы
99
	;push	bx
100
	movzx	ecx,word op_top	;загрузить координату по у
101
	mov	eax,13		;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс
102
	add	ecx,(op_size/3)	;добавить (сторона прямоугольника/3)
103
	shl	ecx,16		;сдвинем на 16 разрядов в лево (умножим на 65536)
104
	mov	cx,bp		;загрузим значения регистра указателя базы в cx
105
	;pop	cx
106
	int	0x40		;вывод
107
ret				;выйти из процедуры
108
 
109
.mouse:                 ;обработка мыши
110
pusha
111
	mov	eax,37   	;будем что то делать если у нас что - нить нажато
112
	mov	ebx,2		;внести в регистр значение 2
113
	int	0x40		;проверка не нажал ли пользователь кнопку мышки
114
	test	eax,eax    ;проверка если у нас в eax=0, то установим флаг и выйдем
115
	jnz	@f         ;перейти на нижнюю метку @@
116
	popa			;если ничего не произошло, то восстановим значения регистров из стека
117
	ret                     ;выход
118
@@:
119
	movzx	esi,word op_text_length ;загрузить кол-во символов в текстовой строке
120
	;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea
121
	;lea	esi,[eax*2+eax]
122
	;shl	eax,1
123
	imul	esi,6               ; или можно и так умножить на 6
356 Lrz 124
	xor	ebx,ebx
355 Lrz 125
        add	esi,op_text_margin   ;добавить 3 - расстояние от чек бокса до надписи
126
 
127
	mov	eax,37		;получим координаты мышки
356 Lrz 128
	inc	ebx		;добавить 1
355 Lrz 129
	int	0x40                ;получить координаты курсора относительно окна
130
 
131
	movzx	ebx,word op_top           ;загрузить в bx значение координаты у
132
	cmp	ax,bx               ;сравнить с с координатой курсора
133
	jl	.mouse_end          ;SF <> OF если меньше
134
	add	ebx,op_size          ;добавить размер
135
	cmp	ax,bx               ;сравнить
136
	jg	.mouse_end          ;ZF = 0 и SF = OF если больше
137
 
138
	shr	eax,16              ;разделим на 65536 или просто сдвинем биты на 16 значений
139
	movzx	ebx,word op_left          ;произведем аналогичное сравнение
140
	cmp	ax,bx		     ;сравнить регистры
141
	jl	.mouse_end	     ;если меньше
142
	add	ebx,op_size	     ;добавить длину стороны прямоугольника
356 Lrz 143
	add	ebx,esi		     ;Учесть в значении по х еще и длину надписи к чекбоксу
355 Lrz 144
	cmp	ax,bx		     ;стравнить регистры
145
	jg	.mouse_end	     ;если больше
356 Lrz 146
	mov	eax,dword op_optibox_gr
355 Lrz 147
        mov	[eax],edi
148
 
149
.mouse_end:
150
popa				  ;восстановить регистры из стека
151
ret				  ;выйти
152
}
153
 
362 Lrz 154
struc option_box left,top,text,text_length,point_gr
355 Lrz 155
{	;структура параметров для чек бокса
156
.left: dw left	;+0	;положение по х
157
.top: dw top	;+2	;положение по у
362 Lrz 158
;.border_color: dd border_color ;+8	цвет рамки
159
;.text_color: dd text_color     ;+12	цвет текста надписи
355 Lrz 160
.text: dd text	     ;+16		адрес в коде программы где расположен текстр
161
.text_length: dw text_length ; +20	длина текста
162
.option_group: dd point_gr	;указатель на размещение edi - идентификатора optibox
163
}
362 Lrz 164
op_struc_size=14			;общая структура 24 байт
355 Lrz 165
op_flag_en=10b
166
macro draw_option_boxes start,end	;рисовать чек боксы
167
{
168
	mov	edi,start			;Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса
169
	mov	ecx,((end-start)/op_struc_size) ;Количество чек боксов
170
@@:
171
	call	option_box.draw                  ;Отобразить чек бокс
172
	add	edi,op_struc_size               ;Указатель на последующие чек боксы  т.е. +28
173
	loop	@b	;прыгнуть если в ecx/cx значение не 0 на верхнюю @@
174
}
175
macro mouse_option_boxes start,end	;установка чек боксов, в зависимости от события
176
{
177
	mov	edi,start		; Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса
178
	mov	ecx,((end-start)/op_struc_size)	;Количество чек боксов
179
@@:
180
	call	option_box.mouse		;проверка мышки и обработка событий
181
	add	edi,op_struc_size	;Указатель на последующие чек боксы
182
	loop	@b	;прыгнуть если в ecx/cx значение не 0 на верхнюю @@
183
 
184
       	mov	edi,start		; Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса
185
	mov	ecx,((end-start)/op_struc_size)	;Количество чек боксов
186
 
187
.home:
362 Lrz 188
	mov	eax,[edi+10]	;op_optibox_gr
355 Lrz 189
        mov	dword eax,[eax]
190
 
191
        pusha
192
 
193
	cmp	eax,edi
194
	jne	@f
195
 
196
	call	option_box.draw_op
197
	jmp	.nxtm
198
@@:     call	option_box.clear_op
199
 
200
.nxtm:  popa
201
	add	edi,op_struc_size               ;Указатель на последующие чек боксы  т.е. +28
202
        loop 	.home
203
 
204
}