Rev 1657 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1639 | Lrz | 1 | ;Последная модификация 03.10.2010 |
2 | ;файл создан 13.02.2009 |
||
3 | ;Макрос для системной библиотеки box_lib.obj |
||
4 | ;Checkbox |
||
5 | |||
1657 | lrz | 6 | ;Инициализация checkbox |
7 | macro _init_checkbox |
||
8 | { |
||
9 | init_checkbox: |
||
10 | ;подсчитаем кол-во символов в длинне выводимой строки. |
||
11 | pushad |
||
12 | mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке |
||
13 | mov ebx,dword ch_text_margin ;eax=0 |
||
14 | mov esi,dword ch_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 ch_sz_str,ebx ;запишим длинну строки с учетом отступа от квадратика |
||
26 | popad |
||
27 | ret 4 |
||
28 | } |
||
29 | |||
1639 | Lrz | 30 | macro use_checkbox_draw |
31 | { |
||
32 | check_box_draw: |
||
1652 | lrz | 33 | pushad ;сохраним все регистры |
34 | mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке |
||
35 | mcall 13,ch_left_s,ch_top_s,ch_border_color ;рисуем рамку чек бокса, фактически рисуем прямоугольник и закрашиваем фон внутри цветом рамки бокса |
||
1639 | Lrz | 36 | |
1652 | lrz | 37 | mov edx,dword ch_color ;загружаем цвет фона |
1639 | Lrz | 38 | add ebx,1 shl 16 - 2 |
39 | add ecx,1 shl 16 - 2 |
||
1652 | lrz | 40 | mcall ;закрашиваем внутренности чекбокса фоном |
1639 | Lrz | 41 | |
1652 | lrz | 42 | test dword ch_flags,2 ;достать значение бита из переменной и поместить в флаг CF |
43 | jz @f ;в если CF=1, то выполним следующую процедуру иначе перейти на нижнюю @@ |
||
44 | call check_box_draw_ch ;нарисовать включенный чек бокс |
||
1639 | Lrz | 45 | @@: |
46 | ;---------------------------- |
||
47 | ;расчет куда будет произведен вывод текста |
||
48 | ;---------------------------- |
||
1652 | lrz | 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 + длинна) для чек бокса |
||
1657 | lrz | 55 | ; shr eax,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) |
1652 | lrz | 56 | ; add eax,dword ch_top_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Y |
57 | |||
58 | ; Оптимизация для ЦП |
||
59 | mov ebx,dword ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса |
||
1657 | lrz | 60 | mov eax,dword ch_top_s ;загрузим значение по (y shl 16 + длинна) для чек бокса |
1660 | lrz | 61 | mov ecx,eax |
1657 | lrz | 62 | add ebx,dword ch_text_margin ;добавим размер стороны и расстояние на котором начнется вывод текста |
1660 | lrz | 63 | shr eax,16 ;сдвинем на 16 разрядов в право (разделим на 65536) в ax верхная точка |
1657 | lrz | 64 | shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) |
1660 | lrz | 65 | |
66 | sub ecx,8 ;корретировка учитываем высоту шрифта |
||
67 | |||
68 | test dword ch_flags,ch_flag_bottom ;проверим, нужно ли выводить вверху надпись |
||
69 | jnz .bottom |
||
70 | |||
71 | test dword ch_flags,ch_flag_middle ;проверим, нужно ли выводить в центр надпись |
||
72 | jz .top ;остался только top |
||
73 | |||
74 | shr cx,1 ;разделим на 2 |
||
75 | .bottom: |
||
76 | add ax,cx |
||
77 | .top: |
||
1657 | lrz | 78 | add ebx,dword ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х |
79 | mov bx,ax |
||
80 | ;ebx х shl 16 +y координаты вывода строчки |
||
1652 | lrz | 81 | |
82 | mov ecx,dword ch_text_color ;загрузим цвет надписи + flags |
||
1639 | Lrz | 83 | mov edx,dword ch_text_ptr ;укажем адрес от куда нужно выводить строку |
1657 | lrz | 84 | mcall 4 ;Вывод |
1652 | lrz | 85 | popad ;восстановить значения регистров из стека |
86 | ret 4 ;выйдем из процедуры и удалим из стека указатель на структуру (4 байта) |
||
1639 | Lrz | 87 | |
1652 | lrz | 88 | check_box_clear_ch: ;очистка чек бокса |
89 | mov edx,dword ch_color ;цвет внутри чек бокса |
||
90 | jmp @f ;безусловный прыжок на нижнюю метку @@ |
||
91 | check_box_draw_ch: ;нарисовать включенный чек бокс |
||
92 | mov edx,dword ch_border_color ;загрузить цвет |
||
1639 | Lrz | 93 | @@: |
1657 | lrz | 94 | ;Отобразить включеный checkbox |
95 | mov ebx,dword ch_left_s ;загружаем х shl 16 + длинна по Х |
||
96 | mov ecx,dword ch_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 |
||
1652 | lrz | 100 | ret |
1639 | Lrz | 101 | } |
102 | |||
103 | |||
104 | macro use_checkbox_mouse |
||
105 | { |
||
106 | |||
107 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
108 | ;Обработчик mouse |
||
1657 | lrz | 109 | ;При попадании мышки + нажата клавиша в область checkbox состояние бокса должно менятся активный - не активный. |
1639 | Lrz | 110 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
111 | check_box_mouse: ;обработка мыши |
||
1652 | lrz | 112 | pushad |
113 | mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке |
||
114 | mcall 37,2 ;проверяем состояние клавиш мышки. Было ли событие нажатая клавиша на мышке. |
||
1657 | lrz | 115 | test eax,eax ;проверка если у нас в eax=0, выйдем |
116 | jz .check_box_mouse_end ;обработка закончилась |
||
1652 | lrz | 117 | ; Да событие: нажатие клавиши мышки произошло. |
1639 | Lrz | 118 | @@: |
1652 | lrz | 119 | mcall 37,1 ;получить координаты курсора относительно окна |
120 | ;на выходе в eax x shl 16 + y |
||
121 | ;сравнение верхней точки по Y |
||
122 | mov ecx,dword ch_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 у бокса |
||
1657 | lrz | 131 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
132 | shr eax,16 ;сместим координату по Х в нижную часть регистра т.е. в ax |
||
1652 | lrz | 133 | ;сравнение по начальной точке Х |
134 | mov ecx,dword ch_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 |
||
1657 | lrz | 140 | add bx,cx ;сложим длинну по x и координату точки по х получим координату конечной точки по Х |
141 | add bx,word ch_sz_str ;добавим длинну строки текста с отступом предвартиельно записав их в момент инициализации |
||
1652 | lrz | 142 | cmp ax,bx |
1657 | lrz | 143 | ja .check_box_mouse_end ;указатель мышки больше конечной координаты по х чем координата по Х у бокса |
1652 | lrz | 144 | ;если все проверки были успешно пройдены мы обязаны поменять состояние бокса |
145 | btc dword ch_flags,2 ;перенос 2-го бита в cf и инверсия его |
||
146 | jc .enable_box ;если CF=1 то отобразим включенный бокс и выйдем |
||
147 | push dword .check_box_mouse_end ;фокус -покус, вернемся после вызова check_box_clear_ch на метку check_box_mouse_end |
||
1657 | lrz | 148 | jmp check_box_clear_ch ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона. |
1652 | lrz | 149 | |
150 | .enable_box: |
||
1657 | lrz | 151 | call check_box_draw_ch ;отобразить включенный чек бокс |
1652 | lrz | 152 | .check_box_mouse_end: |
1657 | lrz | 153 | popad ;восстановить регистры из стека |
154 | ret 4 ;выйти и восстановим стек |
||
1639 | Lrz | 155 | } |