Rev 383 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
355 | Lrz | 1 | ;компонент OptionBox (Основан на Checkbox) |
356 | Lrz | 2 | ;Огромная благодарность Maxxxx32, Diamond, Heavyiron, и другим программистам, и их программам, без |
355 | Lrz | 3 | ;которых я не смог бы написать этот компонент. |
367 | Lrz | 4 | ;21.02.2007 модернизация и поддержка двух разных вариантов с использованием сис цветов и старой схемой |
362 | Lrz | 5 | ;19.02.2007 общее улучшение кода, уменьшение размера и использование системных цветов для отображения optionkbox |
6 | ;16.02.2007 дата создания компонента |
||
355 | Lrz | 7 | ; |
8 | |||
367 | Lrz | 9 | macro version_op ;для совместимости со старыми версиями optionbox все цвета задаются ручками |
355 | Lrz | 10 | { |
367 | Lrz | 11 | op_struc_size=26 |
12 | option_group equ [edi] |
||
13 | op_left equ [edi+4] ;координата начала рисования по х |
||
14 | op_top equ [edi+6] ;координата начала рисования по у |
||
15 | op_color equ [edi+8] |
||
16 | op_border_color equ [edi+12] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно |
||
17 | op_text_color equ [edi+16];[edi+4] ;цвет текста |
||
18 | op_text_ptr equ [edi+20] ;указатель на начало текстовой строки |
||
19 | op_text_length equ [edi+24] ;длина надписи (2^64 такой длины может быть текст) |
||
20 | } |
||
21 | |||
22 | macro version_op1 ;продвинутая версия, использует цвета скина. |
||
23 | { |
||
24 | op_struc_size=14 |
||
25 | option_group equ [edi] |
||
26 | op_left equ [edi+4] ;координата начала рисования по х |
||
27 | op_top equ [edi+6] ;координата начала рисования по у |
||
28 | op_color equ [sc.work] ; |
||
362 | Lrz | 29 | op_border_color equ [sc.work_graph] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно |
30 | op_text_color equ [sc.work_text];[edi+4] ;цвет текста |
||
367 | Lrz | 31 | op_text_ptr equ [edi+8] ;указатель на начало текстовой строки |
32 | op_text_length equ [edi+12] ;длина надписи (2^64 такой длины может быть текст) |
||
33 | } |
||
34 | |||
35 | |||
36 | macro use_option_box |
||
37 | { |
||
355 | Lrz | 38 | option_box: |
39 | .draw: |
||
40 | pusha ;сохраним все регистры |
||
367 | Lrz | 41 | op_text_margin=4 ;расстояние от прямоугольника чек бокса до надписи |
383 | heavyiron | 42 | op_size=11 ;размер квадрата чек бокса |
367 | Lrz | 43 | mov eax,13 |
44 | mov ebx,op_left |
||
45 | shl ebx,16 |
||
46 | add ebx,op_size |
||
47 | mov ecx,op_top |
||
48 | shl ecx,16 |
||
49 | add ecx,op_size |
||
50 | mov edx,op_border_color |
||
485 | heavyiron | 51 | mcall ;рисуем рамку |
355 | Lrz | 52 | |
367 | Lrz | 53 | mov edx,op_color |
54 | add ebx,1 shl 16 - 2 |
||
55 | add ecx,1 shl 16 - 2 |
||
485 | heavyiron | 56 | mcall ;закрашиваем внутренности чекбокса |
355 | Lrz | 57 | |
367 | Lrz | 58 | mov eax,option_group |
355 | Lrz | 59 | mov dword eax,[eax] |
60 | cmp eax,edi |
||
61 | jne @f |
||
62 | call .draw_op ;нарисовать включенный чек бокс |
||
63 | ;---------------------------- |
||
64 | ;расчет куда будет произведен вывод текста |
||
65 | ;---------------------------- |
||
66 | @@: movzx ebx,word op_left ;загрузить значение х для чек бокса |
||
67 | add ebx,(op_size+op_text_margin) ;добавить размер стороны и расстояние на котором начнется вывод текста |
||
68 | shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) |
||
69 | mov bx,op_top ;загрузим значение по y |
||
383 | heavyiron | 70 | add ebx,(op_size-9+1) ;добавим значение длины стороны -9+1 |
355 | Lrz | 71 | mov ecx,op_text_color ;загрузим цвет надписи |
72 | |||
73 | mov edx,op_text_ptr ;укажем адрес от куда нужно выводить строку |
||
74 | movzx esi,word op_text_length ;Загрузим длину надписи в esi |
||
75 | ;внесем в eax значение вывода надписи на канву |
||
76 | mov eax,4 |
||
485 | heavyiron | 77 | mcall ;Вывод |
355 | Lrz | 78 | popa ;восстановить значения регистров из стека |
79 | ret ;выйдем из процедуры |
||
80 | |||
81 | .clear_op: ;очистка чек бокса |
||
367 | Lrz | 82 | mov edx,op_color ;цвет внутри чек бокса |
355 | Lrz | 83 | jmp @f ;безусловный прыжок на нижнюю метку @@ |
84 | |||
85 | .draw_op: ;нарисовать включенный чек бокс |
||
367 | Lrz | 86 | |
87 | mov edx,op_border_color ;загрузить цвет |
||
355 | Lrz | 88 | @@: |
367 | Lrz | 89 | movzx ebx,word op_left ;загрузить координату по х |
383 | heavyiron | 90 | add ebx,(op_size/3) ;добавить (сторона прямоугольника/3) |
367 | Lrz | 91 | shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) |
92 | mov bx,(op_size/2) ;загрузить (сторона прямоугольника/2) |
||
93 | mov bp,bx ;сохраним регистр bx в регистре указателя базы |
||
94 | ;push bx |
||
95 | movzx ecx,word op_top ;загрузить координату по у |
||
96 | mov eax,13 ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс |
||
383 | heavyiron | 97 | add ecx,(op_size/3) ;добавить (сторона прямоугольника/3) |
367 | Lrz | 98 | shl ecx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) |
99 | mov cx,bp ;загрузим значения регистра указателя базы в cx |
||
485 | heavyiron | 100 | mcall ;вывод |
355 | Lrz | 101 | ret ;выйти из процедуры |
102 | |||
103 | .mouse: ;обработка мыши |
||
104 | pusha |
||
105 | mov eax,37 ;будем что то делать если у нас что - нить нажато |
||
106 | mov ebx,2 ;внести в регистр значение 2 |
||
485 | heavyiron | 107 | mcall ;проверка не нажал ли пользователь кнопку мышки |
355 | Lrz | 108 | test eax,eax ;проверка если у нас в eax=0, то установим флаг и выйдем |
109 | jnz @f ;перейти на нижнюю метку @@ |
||
110 | popa ;если ничего не произошло, то восстановим значения регистров из стека |
||
111 | ret ;выход |
||
112 | @@: |
||
113 | movzx esi,word op_text_length ;загрузить кол-во символов в текстовой строке |
||
114 | ;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea |
||
115 | ;lea esi,[eax*2+eax] |
||
116 | ;shl eax,1 |
||
117 | imul esi,6 ; или можно и так умножить на 6 |
||
356 | Lrz | 118 | xor ebx,ebx |
355 | Lrz | 119 | add esi,op_text_margin ;добавить 3 - расстояние от чек бокса до надписи |
120 | |||
121 | mov eax,37 ;получим координаты мышки |
||
356 | Lrz | 122 | inc ebx ;добавить 1 |
485 | heavyiron | 123 | mcall ;получить координаты курсора относительно окна |
355 | Lrz | 124 | |
125 | movzx ebx,word op_top ;загрузить в bx значение координаты у |
||
126 | cmp ax,bx ;сравнить с с координатой курсора |
||
127 | jl .mouse_end ;SF <> OF если меньше |
||
128 | add ebx,op_size ;добавить размер |
||
129 | cmp ax,bx ;сравнить |
||
130 | jg .mouse_end ;ZF = 0 и SF = OF если больше |
||
131 | |||
132 | shr eax,16 ;разделим на 65536 или просто сдвинем биты на 16 значений |
||
133 | movzx ebx,word op_left ;произведем аналогичное сравнение |
||
134 | cmp ax,bx ;сравнить регистры |
||
135 | jl .mouse_end ;если меньше |
||
136 | add ebx,op_size ;добавить длину стороны прямоугольника |
||
356 | Lrz | 137 | add ebx,esi ;Учесть в значении по х еще и длину надписи к чекбоксу |
355 | Lrz | 138 | cmp ax,bx ;стравнить регистры |
139 | jg .mouse_end ;если больше |
||
367 | Lrz | 140 | mov eax,option_group |
355 | Lrz | 141 | mov [eax],edi |
142 | |||
143 | .mouse_end: |
||
144 | popa ;восстановить регистры из стека |
||
145 | ret ;выйти |
||
146 | } |
||
147 | |||
367 | Lrz | 148 | struc option_box1 point_gr,left,top,text,text_length |
355 | Lrz | 149 | { ;структура параметров для чек бокса |
367 | Lrz | 150 | .option_group: dd point_gr ;указатель на размещение edi - идентификатора optibox |
355 | Lrz | 151 | .left: dw left ;+0 ;положение по х |
152 | .top: dw top ;+2 ;положение по у |
||
153 | .text: dd text ;+16 адрес в коде программы где расположен текстр |
||
154 | .text_length: dw text_length ; +20 длина текста |
||
367 | Lrz | 155 | } |
156 | struc option_box point_gr,left,top,color,border_color,text_color,text,text_length |
||
157 | { ;структура параметров для чек бокса |
||
355 | Lrz | 158 | .option_group: dd point_gr ;указатель на размещение edi - идентификатора optibox |
367 | Lrz | 159 | .left: dw left ;+0 ;положение по х |
160 | .top: dw top ;+2 ;положение по у |
||
161 | .color: dd color |
||
162 | .border_color: dd border_color; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно |
||
163 | .text_color: dd text_color;[edi+4] ;цвет текста |
||
164 | .text: dd text ;+16 адрес в коде программы где расположен текстр |
||
165 | .text_length: dw text_length ; +20 длина текста |
||
355 | Lrz | 166 | } |
367 | Lrz | 167 | |
355 | Lrz | 168 | op_flag_en=10b |
169 | macro draw_option_boxes start,end ;рисовать чек боксы |
||
170 | { |
||
171 | mov edi,start ;Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса |
||
172 | mov ecx,((end-start)/op_struc_size) ;Количество чек боксов |
||
173 | @@: |
||
174 | call option_box.draw ;Отобразить чек бокс |
||
175 | add edi,op_struc_size ;Указатель на последующие чек боксы т.е. +28 |
||
176 | loop @b ;прыгнуть если в ecx/cx значение не 0 на верхнюю @@ |
||
177 | } |
||
178 | macro mouse_option_boxes start,end ;установка чек боксов, в зависимости от события |
||
179 | { |
||
180 | mov edi,start ; Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса |
||
181 | mov ecx,((end-start)/op_struc_size) ;Количество чек боксов |
||
182 | @@: |
||
183 | call option_box.mouse ;проверка мышки и обработка событий |
||
184 | add edi,op_struc_size ;Указатель на последующие чек боксы |
||
185 | loop @b ;прыгнуть если в ecx/cx значение не 0 на верхнюю @@ |
||
186 | |||
187 | mov edi,start ; Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса |
||
188 | mov ecx,((end-start)/op_struc_size) ;Количество чек боксов |
||
189 | |||
190 | .home: |
||
367 | Lrz | 191 | mov eax,[edi] ;op_optibox_gr |
355 | Lrz | 192 | mov dword eax,[eax] |
193 | |||
194 | pusha |
||
195 | |||
196 | cmp eax,edi |
||
197 | jne @f |
||
198 | |||
199 | call option_box.draw_op |
||
200 | jmp .nxtm |
||
201 | @@: call option_box.clear_op |
||
202 | |||
203 | .nxtm: popa |
||
204 | add edi,op_struc_size ;Указатель на последующие чек боксы т.е. +28 |
||
205 | loop .home |
||
206 | |||
207 | }> |