Subversion Repositories Kolibri OS

Rev

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

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