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 |
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 | }> |