Rev 1214 | 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 | ;Checkbox |
||
4 | |||
1372 | IgorA | 5 | ch_struc_size=36 |
6 | ch_flag_en=10b |
||
7 | |||
8 | ch_left equ [edi] ;Є®®а¤Ё в з « аЁб®ў Ёп Ї® е |
||
9 | ch_top equ [edi+2] ;Є®®а¤Ё в з « аЁб®ў Ёп Ї® г |
||
10 | ch_text_margin equ [edi+4] ;=4 а ббв®пЁҐ ®в Їаאַ㣮«мЁЄ 祪 Ў®Єб ¤® ¤ЇЁбЁ |
||
11 | ch_size equ [edi+8] ;12 а §¬Ґа Єў ¤а в 祪 Ў®Єб |
||
12 | ch_color equ [edi+12] ;梥⠢гваЁ checkbox |
||
13 | ch_border_color equ [edi+16] ; or [edi+4] ;梥в а ¬ЄЁ checkbox ҐҐ ¬®¦® § ¤ вм б ¬®бв®пвҐ«м® |
||
14 | ch_text_color equ [edi+20] ;[edi+4] ;梥в ⥪бв |
||
15 | ch_text_ptr equ [edi+24] ;гЄ § ⥫м з «® ⥪бв®ў®© бва®ЄЁ |
||
16 | ch_text_length equ [edi+28] |
||
17 | ch_flags equ [edi+32] ;д« ЈЁ |
||
18 | |||
19 | macro check_boxes_set_sys_color start,end,color_table |
||
20 | { |
||
21 | ch_left equ [edi] ;Є®®а¤Ё в з « аЁб®ў Ёп Ї® е |
||
22 | ch_top equ [edi+2] ;Є®®а¤Ё в з « аЁб®ў Ёп Ї® г |
||
23 | ch_text_margin equ [edi+4] ;=4 а ббв®пЁҐ ®в Їаאַ㣮«мЁЄ 祪 Ў®Єб ¤® ¤ЇЁбЁ |
||
24 | ch_size equ [edi+8] ;12 а §¬Ґа Єў ¤а в 祪 Ў®Єб |
||
25 | ch_color equ [edi+12] ;梥⠢гваЁ checkbox |
||
26 | ch_border_color equ [edi+16] ; or [edi+4] ;梥в а ¬ЄЁ checkbox ҐҐ ¬®¦® § ¤ вм б ¬®бв®пвҐ«м® |
||
27 | ch_text_color equ [edi+20];[edi+4] ;梥в ⥪бв |
||
28 | ch_text_ptr equ [edi+24] ;гЄ § ⥫м з «® ⥪бв®ў®© бва®ЄЁ |
||
29 | ch_text_length equ [edi+28] |
||
30 | ch_flags equ [edi+32] ;д« ЈЁ |
||
31 | |||
32 | mov edi,start |
||
33 | mov ecx,((end-start)/ch_struc_size) |
||
34 | mov esi,color_table |
||
35 | @@: |
||
36 | push dword [esi+32] |
||
37 | pop dword ch_text_color |
||
38 | push dword [esi+36] |
||
39 | pop dword ch_border_color |
||
40 | add edi,ch_struc_size |
||
41 | loop @b |
||
42 | } |
||
43 | struc check_box left,top,ch_text_margin,ch_size,color,border_color,text_color,text,ch_text_length,flags |
||
44 | { ;бвагЄвга Ї а ¬Ґва®ў ¤«п 祪 Ў®Єб |
||
45 | ch_flag_en=10b |
||
46 | .left: dw left ;+0 ;Ї®«®¦ҐЁҐ Ї® е |
||
47 | .top: dw top ;Ї®«®¦ҐЁҐ Ї® г |
||
48 | .ch_text_margin: dd ch_text_margin ;а ббв®пЁҐ ®в Їаאַ㣮«мЁЄ 祪 Ў®Єб ¤® ¤ЇЁбЁ |
||
49 | .ch_size: dd ch_size ;а §¬Ґа Єў ¤а в 祪 Ў®Єб , ¤«п ЇаЁ¬Ґа 12 |
||
50 | .color: dd color ;梥⠢гвਠ祪Ў®Єб |
||
51 | .border_color: dd border_color ;梥в а ¬ЄЁ |
||
52 | .text_color: dd text_color ;梥⠤ЇЁбЁ |
||
53 | .text: dd text ; ¤аҐб ў Є®¤Ґ Їа®Ја ¬¬л Ј¤Ґ а бЇ®«®¦Ґ ⥪бв |
||
54 | .ch_text_length: dd ch_text_length ;¤«Ё бва®ЄЁ б бЁ¬ў®« ¬Ё |
||
55 | .flags: dd flags+0 ; д« ЈЁ |
||
56 | } |
||
57 | |||
1032 | Lrz | 58 | macro use_checkbox_draw |
59 | { |
||
60 | check_box_draw: |
||
61 | pusha ;сохраним все регистры |
||
62 | mov edi,dword [esp+36] |
||
63 | mov eax,13 |
||
64 | movzx ebx,word ch_left |
||
65 | shl ebx,16 |
||
66 | add ebx,ch_size |
||
67 | mov ecx,ch_top |
||
68 | shl ecx,16 |
||
69 | add ecx,dword ch_size |
||
70 | mov edx,dword ch_border_color |
||
71 | mcall ;рисуем рамку |
||
72 | |||
73 | mov edx,dword ch_color |
||
74 | add ebx,1 shl 16 - 2 |
||
75 | add ecx,1 shl 16 - 2 |
||
76 | mcall ;закрашиваем внутренности чекбокса |
||
77 | |||
78 | test dword ch_flags,2 ;достать значение бита из переменной и поместить в флаг CF |
||
79 | jz @f ;в если CF=1, то выполним следующую процедуру иначе перейти на нижнюю @@ |
||
80 | call check_box_draw_ch ;нарисовать включенный чек бокс |
||
81 | @@: |
||
82 | ;---------------------------- |
||
83 | ;расчет куда будет произведен вывод текста |
||
84 | ;---------------------------- |
||
85 | movzx ebx,word ch_left ;загрузить значение х для чек бокса |
||
86 | add ebx,dword ch_size |
||
87 | add ebx,dword ch_text_margin;добавить размер стороны и расстояние на котором начнется вывод текста |
||
88 | shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) |
||
89 | mov bx,word ch_top ;загрузим значение по y |
||
90 | add ebx,ch_size |
||
91 | mov ecx,dword ch_text_color ;загрузим цвет надписи + flags |
||
92 | sub ebx,7 ;добавим значение длины стороны -9+2 |
||
93 | |||
94 | mov edx,dword ch_text_ptr ;укажем адрес от куда нужно выводить строку |
||
95 | mov esi,dword ch_text_length |
||
96 | ;внесем в eax значение вывода надписи на канву |
||
97 | mov eax,4 |
||
98 | mcall ;Вывод |
||
99 | popa ;восстановить значения регистров из стека |
||
100 | ret 4 ;выйдем из процедуры |
||
101 | |||
102 | check_box_clear_ch: ;очистка чек бокса |
||
103 | mov edx,dword ch_color ;цвет внутри чек бокса |
||
104 | jmp @f ;безусловный прыжок на нижнюю метку @@ |
||
105 | check_box_draw_ch: ;нарисовать включенный чек бокс |
||
106 | mov edx,dword ch_border_color ;загрузить цвет |
||
107 | @@: |
||
108 | movzx ebx,word ch_left ;загрузить координату по х |
||
109 | mov eax,dword ch_size |
||
1099 | Lrz | 110 | mov bp,ax |
111 | shr eax,2 |
||
1032 | Lrz | 112 | push ax |
1099 | Lrz | 113 | |
114 | push ax |
||
115 | add ebx,eax |
||
1032 | Lrz | 116 | shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) |
1099 | Lrz | 117 | pop ax |
118 | lea eax,[eax*2] |
||
119 | sub bp,ax ;сохраним регистр bx в регистре указателя базы |
||
120 | mov bx,bp |
||
1032 | Lrz | 121 | |
122 | movzx ecx,word ch_top ;загрузить координату по у |
||
1099 | Lrz | 123 | pop ax |
124 | add cx,ax |
||
1032 | Lrz | 125 | shl ecx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) |
126 | mov cx,bp ;загрузим значения регистра указателя базы в cx |
||
127 | mov eax,13 ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс |
||
128 | mcall ;вывод |
||
129 | ret ;выйти из процедуры |
||
130 | } |
||
131 | |||
132 | |||
133 | macro use_checkbox_mouse |
||
134 | { |
||
135 | |||
136 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
137 | ;Обработчик mouse |
||
138 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
139 | check_box_mouse: ;обработка мыши |
||
140 | pusha |
||
141 | mov edi,dword [esp+36] |
||
142 | mov eax,37 ;будем что то делать если у нас что - нить нажато |
||
143 | mov ebx,2 ;внести в регистр значение 2 |
||
144 | mcall ;проверка не нажал ли пользователь кнопку мышки |
||
145 | test eax,eax ;проверка если у нас в eax=0, то установим флаг и выйдем |
||
146 | jnz @f ;перейти на нижнюю метку @@ |
||
147 | btr dword ch_flags,2 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое. |
||
148 | jmp check_box_mouse_end |
||
149 | |||
150 | @@: |
||
151 | bts dword ch_flags,2 ;проверка флага т.е. перенос в cf значение бита и установка бита в состояние включено |
||
152 | jc check_box_mouse_end ;если CF=1 то перейти в конец т.е. это выход |
||
153 | mov esi,dword ch_text_length ;загрузить кол-во символов в текстовой строке |
||
154 | ;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea |
||
1214 | Lrz | 155 | lea esi,[eax*3] |
156 | shl esi,1 |
||
157 | ; imul esi,6 ; или можно и так умножить на 6 |
||
1032 | Lrz | 158 | add esi,dword ch_text_margin ;добавить 3 - расстояние от чек бокса до надписи |
159 | |||
160 | mov eax,37 ;получим координаты мышки |
||
161 | mov ebx,1 ;добавить 1 |
||
162 | mcall ;получить координаты курсора относительно окна |
||
163 | |||
164 | movzx ebx,word ch_top ;загрузить в bx значение координаты у |
||
165 | cmp ax,bx ;сравнить с с координатой курсора |
||
166 | jl check_box_mouse_end ;SF <> OF если меньше |
||
167 | add ebx,dword ch_size ;добавить размер |
||
168 | cmp ax,bx ;сравнить |
||
169 | jg check_box_mouse_end ;ZF = 0 и SF = OF если больше |
||
170 | |||
171 | shr eax,16 ;разделим на 65536 или просто сдвинем биты на 16 значений |
||
172 | movzx ebx,word ch_left ;произведем аналогичное сравнение |
||
173 | cmp ax,bx ;сравнить регистры |
||
174 | jl check_box_mouse_end ;если меньше |
||
175 | add ebx,dword ch_size ;добавить длину стороны прямоугольника |
||
176 | add ebx,esi ;Учесть в значении по х еще и длину надписи к чекбоксу |
||
177 | cmp ax,bx ;стравнить регистры |
||
178 | jg check_box_mouse_end ;если больше |
||
179 | |||
180 | bts dword ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на 1. |
||
181 | jc @f ;CF=1 то перейти на нижнюю @@ |
||
182 | |||
183 | call check_box_draw_ch ;отобразить включенный чек бокс |
||
184 | ; mov dword [esp+24],1 ;дальнейшая проверка чек боксов бесмыслена, по этому в стек, где располагается ecx поместитм 0 |
||
185 | jmp check_box_mouse_end ;выйти |
||
186 | @@: |
||
187 | btr word ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое. |
||
188 | call check_box_clear_ch ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона. |
||
189 | check_box_mouse_end: |
||
190 | popa ;восстановить регистры из стека |
||
191 | ret 4 ;выйти |
||
192 | }> |