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