Subversion Repositories Kolibri OS

Rev

Rev 1476 | 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:
1432 mario79 68
        pusha   ;сохраним все регистры
1032 Lrz 69
 
70
        movzx ebx,word op_left
71
        shl ebx,16
72
        add ebx,dword op_size
73
        movzx ecx,word op_top
74
        shl ecx,16
75
        add ecx,dword op_size
76
        mov edx,dword op_border_color
77
        mov eax,13
1432 mario79 78
        mcall ;рисуем рамку
1032 Lrz 79
 
80
        mov edx,dword op_color
81
        add ebx,1 shl 16 - 2
82
        add ecx,1 shl 16 - 2
1432 mario79 83
        mcall ;закрашиваем внутренности чекбокса
1032 Lrz 84
 
85
;        mov     eax,dword option_group
86
;        mov     dword eax,[eax]
87
;        cmp     eax,edi
88
;        jne     @f
1432 mario79 89
;        call    option_box_draw_op  ;нарисовать включенный чек бокс
1032 Lrz 90
 
91
 
92
;----------------------------
1432 mario79 93
;расчет куда будет произведен вывод текста
1032 Lrz 94
;----------------------------
1432 mario79 95
@@:     movzx ebx,word op_left        ;загрузить значение х для чек бокса
1032 Lrz 96
        add   ebx,dword op_size
1432 mario79 97
        add   ebx,dword op_text_margin;добавить размер стороны и расстояние на котором начнется вывод текста
98
        shl   ebx,16                ;сдвинем на 16 разрядов в лево (умножим на 65536)
99
        mov   bx,word op_top        ;загрузим значение по y
2249 mario79 100
        mov   eax,op_size
101
        shr   eax,1
102
        add   eax,4
103
        add   ebx,eax
1432 mario79 104
        mov   ecx,dword op_text_color        ;загрузим цвет надписи + flags
105
        sub   ebx,7        ;добавим значение длины стороны -9+2
1032 Lrz 106
 
1432 mario79 107
        mov   edx,dword op_text_ptr                ;укажем адрес от куда нужно выводить строку
1032 Lrz 108
        mov   esi,dword op_text_length
1432 mario79 109
        ;внесем в eax значение вывода надписи на канву
1032 Lrz 110
        mov   eax,4
1432 mario79 111
        mcall                  ;Вывод
112
popa                           ;восстановить значения регистров из стека
113
ret                            ;выйдем из процедуры
1032 Lrz 114
 
1432 mario79 115
option_box_clear_op:                      ;очистка чек бокса
116
        mov     edx,dword op_color    ;цвет внутри чек бокса
117
        jmp     @f              ;безусловный прыжок на нижнюю метку @@
1032 Lrz 118
 
119
 
1432 mario79 120
option_box_draw_op:            ;нарисовать включенный чек бокс
121
        mov   edx,dword op_border_color        ;загрузить цвет
1032 Lrz 122
@@:
1432 mario79 123
        movzx ebx,word op_left  ;загрузить координату по х
1032 Lrz 124
        mov   eax,dword op_size
1101 Lrz 125
        mov   bp,ax
126
        shr   eax,2
1032 Lrz 127
        push  ax
1101 Lrz 128
 
129
        push  ax
130
        add   ebx,eax
1432 mario79 131
        shl   ebx,16            ;сдвинем на 16 разрядов в лево (умножим на 65536)
1101 Lrz 132
        pop   ax
133
        lea   eax,[eax*2]
1432 mario79 134
        sub   bp,ax             ;сохраним регистр bx в регистре указателя базы
1101 Lrz 135
        mov   bx,bp
1032 Lrz 136
 
1432 mario79 137
        movzx ecx,word op_top ;загрузить координату по у
1101 Lrz 138
        pop   ax
139
        add   cx,ax
1432 mario79 140
        shl   ecx,16          ;сдвинем на 16 разрядов в лево (умножим на 65536)
141
        mov   cx,bp           ;загрузим значения регистра указателя базы в cx
142
        mov   eax,13          ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс
143
        mcall            ;вывод
144
ret                                ;выйти из процедуры
1032 Lrz 145
}
146
 
147
 
148
macro use_optionbox_mouse
149
{
150
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1432 mario79 151
;Обработчик mouse
1032 Lrz 152
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1432 mario79 153
option_box_mouse_op:                 ;обработка мыши
1032 Lrz 154
pusha
1432 mario79 155
        mov     esi,dword op_text_length ;загрузить кол-во символов в текстовой строке
156
        ;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea
1101 Lrz 157
;        lea    esi,[eax*2+eax]
158
;        shl    eax,1
1432 mario79 159
        imul    esi,6               ; или можно и так умножить на 6
1032 Lrz 160
        xor     ebx,ebx
1432 mario79 161
        add     esi,dword op_text_margin   ;добавить 3 - расстояние от чек бокса до надписи
1032 Lrz 162
 
1432 mario79 163
        mov     eax,37          ;получим координаты мышки
164
        inc     ebx             ;добавить 1
165
        mcall                ;получить координаты курсора относительно окна
1032 Lrz 166
 
1432 mario79 167
        movzx   ebx,word op_top           ;загрузить в bx значение координаты у
168
        cmp     ax,bx               ;сравнить с с координатой курсора
169
        jl      option_box_mouse_end          ;SF <> OF если меньше
170
        add     ebx,dword op_size          ;добавить размер
171
        cmp     ax,bx               ;сравнить
172
        jg      option_box_mouse_end          ;ZF = 0 и SF = OF если больше
1032 Lrz 173
 
1432 mario79 174
        shr     eax,16              ;разделим на 65536 или просто сдвинем биты на 16 значений
175
        movzx   ebx,word op_left          ;произведем аналогичное сравнение
176
        cmp     ax,bx                ;сравнить регистры
177
        jl      option_box_mouse_end           ;если меньше
178
        add     ebx,dword op_size          ;добавить длину стороны прямоугольника
179
        add     ebx,esi              ;Учесть в значении по х еще и длину надписи к чекбоксу
180
        cmp     ax,bx                ;стравнить регистры
181
        jg      option_box_mouse_end           ;если больше
1032 Lrz 182
        mov     eax,dword option_group
183
        mov     [eax],edi
184
 
185
option_box_mouse_end:
1432 mario79 186
popa                              ;восстановить регистры из стека
187
ret                               ;выйти
1032 Lrz 188
 
189
}