Rev 1652 | 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 + длинна) для чек бокса |
61 | add ebx,dword ch_text_margin ;добавим размер стороны и расстояние на котором начнется вывод текста |
||
62 | shr eax,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) |
||
63 | shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) |
||
64 | add eax,dword ch_top_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Y |
||
65 | add ebx,dword ch_left_s ;cкорректируем позицию Х. Т.е. сейчас в верхней части ebx у нас точка начала вывода текста по Х |
||
66 | sub ax,7 ;внесем смещение для y |
||
67 | mov bx,ax |
||
68 | ;ebx х shl 16 +y координаты вывода строчки |
||
1652 | lrz | 69 | |
70 | mov ecx,dword ch_text_color ;загрузим цвет надписи + flags |
||
1639 | Lrz | 71 | mov edx,dword ch_text_ptr ;укажем адрес от куда нужно выводить строку |
1657 | lrz | 72 | mcall 4 ;Вывод |
1652 | lrz | 73 | popad ;восстановить значения регистров из стека |
74 | ret 4 ;выйдем из процедуры и удалим из стека указатель на структуру (4 байта) |
||
1639 | Lrz | 75 | |
1652 | lrz | 76 | check_box_clear_ch: ;очистка чек бокса |
77 | mov edx,dword ch_color ;цвет внутри чек бокса |
||
78 | jmp @f ;безусловный прыжок на нижнюю метку @@ |
||
79 | check_box_draw_ch: ;нарисовать включенный чек бокс |
||
80 | mov edx,dword ch_border_color ;загрузить цвет |
||
1639 | Lrz | 81 | @@: |
1657 | lrz | 82 | ;Отобразить включеный checkbox |
83 | mov ebx,dword ch_left_s ;загружаем х shl 16 + длинна по Х |
||
84 | mov ecx,dword ch_top_s ;загружаем Y shl 16 + длинна по Y |
||
85 | add ebx,2 shl 16 - 4 ;после этих изменений (X+2) shl 16 +длинна по (Х-2) |
||
86 | add ecx,2 shl 16 - 4 ;после этих изменений (Y+2) shl 16 +длинна по (Y-2) |
||
87 | mcall 13 ;отобразить квадрат внутри checkbox |
||
1652 | lrz | 88 | ret |
1639 | Lrz | 89 | } |
90 | |||
91 | |||
92 | macro use_checkbox_mouse |
||
93 | { |
||
94 | |||
95 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
96 | ;Обработчик mouse |
||
1657 | lrz | 97 | ;При попадании мышки + нажата клавиша в область checkbox состояние бокса должно менятся активный - не активный. |
1639 | Lrz | 98 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
99 | check_box_mouse: ;обработка мыши |
||
1652 | lrz | 100 | pushad |
101 | mov ebp,dword [esp+36] ;загружаем указатель на структуру, указатель мы передаем в стеке |
||
102 | mcall 37,2 ;проверяем состояние клавиш мышки. Было ли событие нажатая клавиша на мышке. |
||
1657 | lrz | 103 | test eax,eax ;проверка если у нас в eax=0, выйдем |
104 | jz .check_box_mouse_end ;обработка закончилась |
||
1652 | lrz | 105 | ; Да событие: нажатие клавиши мышки произошло. |
1639 | Lrz | 106 | @@: |
1652 | lrz | 107 | mcall 37,1 ;получить координаты курсора относительно окна |
108 | ;на выходе в eax x shl 16 + y |
||
109 | ;сравнение верхней точки по Y |
||
110 | mov ecx,dword ch_top_s ;y shl 16 +длинна по y |
||
111 | mov ebx,ecx |
||
112 | shr ebx,16 ;bx = координата по y |
||
113 | cmp ax,bx |
||
114 | jb .check_box_mouse_end ;указатель мышки меньше начальной координаты по y чем координата по Y у бокса |
||
115 | ;сравнение нижней точки по Y |
||
116 | add cx,bx ;сложим длинну по y и координату верхней точки по y поличим координату нижней точки по Y |
||
117 | cmp ax,cx |
||
118 | ja .check_box_mouse_end ;указатель мышки больше конечной координаты по y чем координата по Y у бокса |
||
1657 | lrz | 119 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
120 | shr eax,16 ;сместим координату по Х в нижную часть регистра т.е. в ax |
||
1652 | lrz | 121 | ;сравнение по начальной точке Х |
122 | mov ecx,dword ch_left_s ;загрузить значение (х shl 16 + длинна) для чек бокса |
||
123 | mov ebx,ecx |
||
124 | shr ebx,16 ;bx = координата по X |
||
125 | cmp ax,bx |
||
126 | jb .check_box_mouse_end ;указатель мышки меньше начальной координаты по X чем координата по X у бокса |
||
127 | ;сравнение конечной точки по X |
||
1657 | lrz | 128 | add bx,cx ;сложим длинну по x и координату точки по х получим координату конечной точки по Х |
129 | add bx,word ch_sz_str ;добавим длинну строки текста с отступом предвартиельно записав их в момент инициализации |
||
1652 | lrz | 130 | cmp ax,bx |
1657 | lrz | 131 | ja .check_box_mouse_end ;указатель мышки больше конечной координаты по х чем координата по Х у бокса |
1652 | lrz | 132 | ;если все проверки были успешно пройдены мы обязаны поменять состояние бокса |
133 | btc dword ch_flags,2 ;перенос 2-го бита в cf и инверсия его |
||
134 | jc .enable_box ;если CF=1 то отобразим включенный бокс и выйдем |
||
135 | push dword .check_box_mouse_end ;фокус -покус, вернемся после вызова check_box_clear_ch на метку check_box_mouse_end |
||
1657 | lrz | 136 | jmp check_box_clear_ch ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона. |
1652 | lrz | 137 | |
138 | .enable_box: |
||
1657 | lrz | 139 | call check_box_draw_ch ;отобразить включенный чек бокс |
1652 | lrz | 140 | .check_box_mouse_end: |
1657 | lrz | 141 | popad ;восстановить регистры из стека |
142 | ret 4 ;выйти и восстановим стек |
||
1639 | Lrz | 143 | } |