Rev 1682 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1682 | lrz | 1 | ;Последная модификация 03.10.2010 |
2 | ;файл создан 13.02.2009 |
||
3 | ;Макрос для системной библиотеки box_lib.obj |
||
4 | ;Checkbox |
||
5 | |||
6 | ;Инициализация checkbox |
||
7 | macro _init_checkbox2 |
||
8 | { |
||
9 | init_checkbox2: |
||
10 | ;подсчитаем кол-во символов в длинне выводимой строки. |
||
11 | pushad |
||
12 | mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке |
||
13 | mov ebx,dword 2ch_text_margin ;eax=0 |
||
14 | mov esi,dword 2ch_text_ptr ;указатель на строчку |
||
15 | lodsb ;в al первый символ из строки |
||
16 | test al,al |
||
17 | jz .ex_loop |
||
18 | @@: |
||
19 | add ebx,6 ;ширина символа |
||
20 | lodsb |
||
21 | test al,al |
||
22 | jnz @b |
||
23 | .ex_loop: |
||
24 | |||
25 | mov dword 2ch_sz_str,ebx ;запишим длинну строки с учетом отступа от квадратика |
||
26 | popad |
||
27 | ret 4 |
||
28 | } |
||
29 | |||
30 | macro use_checkbox_draw2 |
||
31 | { |
||
32 | check_box_draw2: |
||
33 | pushad ;сохраним все регистры |
||
34 | mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке |
||
35 | mcall 13,2ch_left_s,2ch_top_s,2ch_border_color ;рисуем рамку чек бокса, фактически рисуем прямоугольник и закрашиваем фон внутри цветом рамки бокса |
||
36 | |||
37 | mov edx,dword 2ch_color ;загружаем цвет фона |
||
38 | add ebx,1 shl 16 - 2 |
||
39 | add ecx,1 shl 16 - 2 |
||
40 | mcall ;закрашиваем внутренности чекбокса фоном |
||
41 | |||
42 | test dword 2ch_flags,2 ;достать значение бита из переменной и поместить в флаг CF |
||
43 | jz @f ;в если CF=1, то выполним следующую процедуру иначе перейти на нижнюю @@ |
||
44 | call check_box_draw_ch2 ;нарисовать включенный чек бокс |
||
45 | @@: |
||
46 | ;---------------------------- |
||
47 | ;расчет куда будет произведен вывод текста |
||
48 | ;---------------------------- |
||
49 | ; mov ebx,dword ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса |
||
50 | ; add ebx,dword ch_text_margin ;добавим размер стороны и расстояние на котором начнется вывод текста |
||
51 | ; shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) |
||
52 | ; add ebx,dword ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х |
||
53 | |||
54 | ; mov eax,word ch_top_s ;загрузим значение по (y shl 16 + длинна) для чек бокса |
||
55 | ; shr eax,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) |
||
56 | ; add eax,dword ch_top_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Y |
||
57 | |||
58 | ; Оптимизация для ЦП |
||
59 | mov ebx,dword 2ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса |
||
60 | mov eax,dword 2ch_top_s ;загрузим значение по (y shl 16 + длинна) для чек бокса |
||
61 | mov ecx,eax |
||
62 | add ebx,dword 2ch_text_margin ;добавим размер стороны и расстояние на котором начнется вывод текста |
||
63 | shr eax,16 ;сдвинем на 16 разрядов в право (разделим на 65536) в ax верхная точка |
||
64 | shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) |
||
65 | |||
66 | sub ecx,8 ;корретировка учитываем высоту шрифта |
||
67 | |||
68 | test dword 2ch_flags,ch_flag_bottom ;проверим, нужно ли выводить вверху надпись |
||
69 | jnz .bottom |
||
70 | |||
71 | test dword 2ch_flags,ch_flag_middle ;проверим, нужно ли выводить в центр надпись |
||
72 | jz .top ;остался только top |
||
73 | |||
74 | shr cx,1 ;разделим на 2 |
||
75 | .bottom: |
||
76 | add ax,cx |
||
77 | .top: |
||
78 | add ebx,dword 2ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х |
||
79 | mov bx,ax |
||
80 | ;ebx х shl 16 +y координаты вывода строчки |
||
81 | |||
82 | mov ecx,dword 2ch_text_color ;загрузим цвет надписи + flags |
||
83 | mov edx,dword 2ch_text_ptr ;укажем адрес от куда нужно выводить строку |
||
84 | mcall 4 ;Вывод |
||
85 | popad ;восстановить значения регистров из стека |
||
86 | ret 4 ;выйдем из процедуры и удалим из стека указатель на структуру (4 байта) |
||
87 | |||
88 | check_box_clear_ch2: ;очистка чек бокса |
||
89 | mov edx,dword 2ch_color ;цвет внутри чек бокса |
||
90 | jmp @f ;безусловный прыжок на нижнюю метку @@ |
||
91 | check_box_draw_ch2: ;нарисовать включенный чек бокс |
||
92 | mov edx,dword 2ch_border_color ;загрузить цвет |
||
93 | @@: |
||
94 | ;Отобразить включеный checkbox |
||
95 | mov ebx,dword 2ch_left_s ;загружаем х shl 16 + длинна по Х |
||
96 | mov ecx,dword 2ch_top_s ;загружаем Y shl 16 + длинна по Y |
||
97 | add ebx,2 shl 16 - 4 ;после этих изменений (X+2) shl 16 +длинна по (Х-2) |
||
98 | add ecx,2 shl 16 - 4 ;после этих изменений (Y+2) shl 16 +длинна по (Y-2) |
||
99 | mcall 13 ;отобразить квадрат внутри checkbox |
||
100 | ret |
||
101 | } |
||
102 | |||
103 | |||
104 | macro use_checkbox_mouse2 |
||
105 | { |
||
106 | |||
107 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
108 | ;Обработчик mouse |
||
109 | ;При попадании мышки + нажата клавиша в область checkbox состояние бокса должно менятся активный - не активный. |
||
110 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
111 | check_box_mouse2: ;обработка мыши |
||
112 | pushad |
||
113 | mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке |
||
114 | mcall 37,2 ;проверяем состояние клавиш мышки. Было ли событие нажатая клавиша на мышке. |
||
115 | test eax,eax ;проверка если у нас в eax=0, выйдем |
||
116 | jz .check_box_mouse_end ;обработка закончилась |
||
117 | ; Да событие: нажатие клавиши мышки произошло. |
||
118 | @@: |
||
119 | mcall 37,1 ;получить координаты курсора относительно окна |
||
120 | ;на выходе в eax x shl 16 + y |
||
121 | ;сравнение верхней точки по Y |
||
122 | mov ecx,dword 2ch_top_s ;y shl 16 +длинна по y |
||
123 | mov ebx,ecx |
||
124 | shr ebx,16 ;bx = координата по y |
||
125 | cmp ax,bx |
||
126 | jb .check_box_mouse_end ;указатель мышки меньше начальной координаты по y чем координата по Y у бокса |
||
127 | ;сравнение нижней точки по Y |
||
128 | add cx,bx ;сложим длинну по y и координату верхней точки по y поличим координату нижней точки по Y |
||
129 | cmp ax,cx |
||
130 | ja .check_box_mouse_end ;указатель мышки больше конечной координаты по y чем координата по Y у бокса |
||
131 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
132 | shr eax,16 ;сместим координату по Х в нижную часть регистра т.е. в ax |
||
133 | ;сравнение по начальной точке Х |
||
134 | mov ecx,dword 2ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса |
||
135 | mov ebx,ecx |
||
136 | shr ebx,16 ;bx = координата по X |
||
137 | cmp ax,bx |
||
138 | jb .check_box_mouse_end ;указатель мышки меньше начальной координаты по X чем координата по X у бокса |
||
139 | ;сравнение конечной точки по X |
||
140 | add bx,cx ;сложим длинну по x и координату точки по х получим координату конечной точки по Х |
||
141 | add bx,word 2ch_sz_str ;добавим длинну строки текста с отступом предвартиельно записав их в момент инициализации |
||
142 | cmp ax,bx |
||
143 | ja .check_box_mouse_end ;указатель мышки больше конечной координаты по х чем координата по Х у бокса |
||
144 | ;если все проверки были успешно пройдены мы обязаны поменять состояние бокса |
||
1715 | IgorA | 145 | btc dword 2ch_flags,1 ;перенос 2-го бита в cf и инверсия его |
146 | jnc .enable_box ;если CF=1 то отобразим включенный бокс и выйдем |
||
1682 | lrz | 147 | push dword .check_box_mouse_end ;фокус -покус, вернемся после вызова check_box_clear_ch на метку check_box_mouse_end |
148 | jmp check_box_clear_ch2 ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона. |
||
149 | |||
150 | .enable_box: |
||
151 | call check_box_draw_ch2 ;отобразить включенный чек бокс |
||
152 | .check_box_mouse_end: |
||
153 | popad ;восстановить регистры из стека |
||
154 | ret 4 ;выйти и восстановим стек |
||
155 | } |