Subversion Repositories Kolibri OS

Rev

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