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