Subversion Repositories Kolibri OS

Rev

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