Subversion Repositories Kolibri OS

Rev

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