Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1032 Lrz 1
;файл создан 13.02.2009  На код применена GPL2 лицензия
2
;Макрос для системной библиотеки box_lib.obj
3
;Optionbox
4
 
1372 IgorA 5
struc option_box point_gr,left,top,op_text_margin,op_size,color,border_color,text_color,text,op_text_length,flags
6
{        ;бвагЄвга  Ї а ¬Ґва®ў ¤«п 祪 Ў®Єб 
7
op_flag_en=10b
8
.option_group: dd point_gr
9
.left: dw left       ;+0 ;Ї®«®¦Ґ­ЁҐ Ї® е
10
.top:  dw top        ;Ї®«®¦Ґ­ЁҐ Ї® г
11
.ch_text_margin:  dd op_text_margin ;а ббв®п­ЁҐ ®в Їаאַ㣮«м­ЁЄ  祪 Ў®Єб  ¤® ­ ¤ЇЁбЁ
12
.ch_size: dd op_size ;а §¬Ґа Єў ¤а в  祪 Ў®Єб , ¤«п ЇаЁ¬Ґа  12
13
.color:   dd color   ;梥⠢­гвਠ祪Ў®Єб 
14
.border_color: dd border_color ;梥в а ¬ЄЁ
15
.text_color:   dd text_color   ;梥⠭ ¤ЇЁбЁ
16
.text: dd text                 ; ¤аҐб ў Є®¤Ґ Їа®Ја ¬¬л Ј¤Ґ а бЇ®«®¦Ґ­ ⥪бв
17
.ch_text_length: dd op_text_length ;¤«Ё­­  бва®ЄЁ б бЁ¬ў®« ¬Ё
18
.flags: dd flags+0   ; д« ЈЁ
19
}
20
 
1032 Lrz 21
macro use_optionbox_driver	;макросы которые управляют работой бокса )
22
{
23
option_box_draw:
24
        pusha
25
 
26
        mov     eax,dword [esp+36]
27
@@:     mov     edi,dword [eax]
28
        test    edi,edi
29
        je      option_check
30
        call    option_box_draw_box
31
        add     eax,4
32
        jmp    @b
33
 
34
option_check:
35
        mov     eax,dword [esp+36]
36
@@:     mov     edi,dword [eax]
37
        test    edi,edi
38
        je      @f
39
 
40
        mov     ebx,dword [edi]
41
        mov     ebx,dword [ebx]
42
        cmp     edi,ebx
43
        jne     .clear_op
44
 
45
        pusha
46
        call    option_box_draw_op
47
        popa
48
        add     eax,4
49
        jmp     @b
50
 
51
.clear_op:
52
        pusha
53
        call    option_box_clear_op
54
        popa
55
        add     eax,4
56
        jmp     @b
57
 
58
 
59
@@:     popa
60
        ret 4
61
        ; exit вообще :)
62
 
63
 
64
option_box_mouse:
65
        pusha
1227 mario79 66
	mcall	37,2
67
	test    eax,eax
68
	jnz	@f
69
	popa
70
        ret 4
71
@@:
1032 Lrz 72
        mov     eax,dword [esp+36]
73
@@:     mov     edi,dword [eax]
74
        test    edi,edi
75
        je      option_check
76
        call    option_box_mouse_op
77
        add     eax,4
78
        jmp    @b
79
 
80
}
81
macro use_optionbox_draw
82
{
83
option_box_draw_box:
84
option_group equ [edi]
85
op_left equ [edi+4]    ;координата начала рисования по х
86
op_top equ [edi+6]     ;координата начала рисования по у
87
op_text_margin equ [edi+8]      ;=4 расстояние от прямоугольника чек бокса до надписи
88
op_size equ [edi+12]             ;12 размер квадрата чек бокса
89
op_color equ [edi+16]
90
op_border_color equ [edi+20] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно
91
op_text_color equ   [edi+24];[edi+4]  ;цвет текста
92
op_text_ptr equ [edi+28]    ;указатель на начало текстовой строки
93
op_text_length equ [edi+32]
94
op_flags equ [edi+36]       ;флаги
95
 
96
        pusha   ;сохраним все регистры
97
 
98
        movzx ebx,word op_left
99
        shl ebx,16
100
        add ebx,dword op_size
101
        movzx ecx,word op_top
102
        shl ecx,16
103
        add ecx,dword op_size
104
        mov edx,dword op_border_color
105
        mov eax,13
106
        mcall ;рисуем рамку
107
 
108
        mov edx,dword op_color
109
        add ebx,1 shl 16 - 2
110
        add ecx,1 shl 16 - 2
111
        mcall ;закрашиваем внутренности чекбокса
112
 
113
;        mov     eax,dword option_group
114
;        mov     dword eax,[eax]
115
;        cmp     eax,edi
116
;        jne     @f
117
;        call    option_box_draw_op  ;нарисовать включенный чек бокс
118
 
119
 
120
;----------------------------
121
;расчет куда будет произведен вывод текста
122
;----------------------------
123
@@:     movzx ebx,word op_left        ;загрузить значение х для чек бокса
124
        add   ebx,dword op_size
125
        add   ebx,dword op_text_margin;добавить размер стороны и расстояние на котором начнется вывод текста
126
        shl   ebx,16                ;сдвинем на 16 разрядов в лево (умножим на 65536)
127
        mov   bx,word op_top        ;загрузим значение по y
128
        add   ebx,op_size
129
        mov   ecx,dword op_text_color        ;загрузим цвет надписи + flags
130
        sub   ebx,7        ;добавим значение длины стороны -9+2
131
 
132
        mov   edx,dword op_text_ptr                ;укажем адрес от куда нужно выводить строку
133
        mov   esi,dword op_text_length
134
        ;внесем в eax значение вывода надписи на канву
135
        mov   eax,4
136
        mcall                  ;Вывод
137
popa                           ;восстановить значения регистров из стека
138
ret                            ;выйдем из процедуры
139
 
140
option_box_clear_op:                      ;очистка чек бокса
141
        mov     edx,dword op_color    ;цвет внутри чек бокса
142
        jmp     @f              ;безусловный прыжок на нижнюю метку @@
143
 
144
 
145
option_box_draw_op:            ;нарисовать включенный чек бокс
146
        mov   edx,dword op_border_color        ;загрузить цвет
147
@@:
148
        movzx ebx,word op_left  ;загрузить координату по х
149
        mov   eax,dword op_size
1101 Lrz 150
        mov   bp,ax
151
        shr   eax,2
1032 Lrz 152
        push  ax
1101 Lrz 153
 
154
        push  ax
155
        add   ebx,eax
1032 Lrz 156
        shl   ebx,16            ;сдвинем на 16 разрядов в лево (умножим на 65536)
1101 Lrz 157
        pop   ax
158
        lea   eax,[eax*2]
159
        sub   bp,ax             ;сохраним регистр bx в регистре указателя базы
160
        mov   bx,bp
1032 Lrz 161
 
162
        movzx ecx,word op_top ;загрузить координату по у
1101 Lrz 163
        pop   ax
164
        add   cx,ax
1032 Lrz 165
        shl   ecx,16          ;сдвинем на 16 разрядов в лево (умножим на 65536)
166
        mov   cx,bp           ;загрузим значения регистра указателя базы в cx
167
        mov   eax,13          ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс
168
        mcall            ;вывод
169
ret                                ;выйти из процедуры
170
}
171
 
172
 
173
macro use_optionbox_mouse
174
{
175
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
176
;Обработчик mouse
177
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
178
option_box_mouse_op:                 ;обработка мыши
179
pusha
180
        mov     esi,dword op_text_length ;загрузить кол-во символов в текстовой строке
181
        ;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea
1101 Lrz 182
;        lea    esi,[eax*2+eax]
183
;        shl    eax,1
1032 Lrz 184
        imul    esi,6               ; или можно и так умножить на 6
185
        xor     ebx,ebx
186
        add     esi,dword op_text_margin   ;добавить 3 - расстояние от чек бокса до надписи
187
 
188
        mov     eax,37          ;получим координаты мышки
189
        inc     ebx             ;добавить 1
190
        mcall                ;получить координаты курсора относительно окна
191
 
192
        movzx   ebx,word op_top           ;загрузить в bx значение координаты у
193
        cmp     ax,bx               ;сравнить с с координатой курсора
194
        jl      option_box_mouse_end          ;SF <> OF если меньше
195
        add     ebx,dword op_size          ;добавить размер
196
        cmp     ax,bx               ;сравнить
197
        jg      option_box_mouse_end          ;ZF = 0 и SF = OF если больше
198
 
199
        shr     eax,16              ;разделим на 65536 или просто сдвинем биты на 16 значений
200
        movzx   ebx,word op_left          ;произведем аналогичное сравнение
201
        cmp     ax,bx                ;сравнить регистры
202
        jl      option_box_mouse_end           ;если меньше
203
        add     ebx,dword op_size          ;добавить длину стороны прямоугольника
204
        add     ebx,esi              ;Учесть в значении по х еще и длину надписи к чекбоксу
205
        cmp     ax,bx                ;стравнить регистры
206
        jg      option_box_mouse_end           ;если больше
207
        mov     eax,dword option_group
208
        mov     [eax],edi
209
 
210
option_box_mouse_end:
211
popa                              ;восстановить регистры из стека
212
ret                               ;выйти
213
 
214
}