Rev 3130 | Rev 4601 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1032 | Lrz | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;Basic macros for use editbox ; |
||
3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
4 | |||
1228 | Lrz | 5 | |
6 | macro use_editbox_draw |
||
7 | { |
||
8 | edit_box: |
||
1032 | Lrz | 9 | .draw: |
10 | pushad |
||
11 | ;--- рисуем рамку --- |
||
12 | mov edi,dword [esp+36] |
||
13 | call .draw_border ; Функция стабильна |
||
14 | .draw_bg_cursor_text: |
||
15 | ;--- изменяем смещение, если надо --- |
||
16 | call .check_offset ;вычисление позиции курсора стабильна |
||
17 | ;--- рисуем внутреннюю область --- |
||
18 | call .draw_bg ;нарисовать прямоугольник рабочей области |
||
19 | ;---- рисуем выделение, по shift если есть |
||
20 | call .draw_shift |
||
21 | .draw_cursor_text: |
||
22 | ;--- рисуем курсор --- |
||
23 | ;--- может его не надо рисовать ---- |
||
24 | test word ed_flags,ed_focus |
||
1214 | Lrz | 25 | jz @f |
1032 | Lrz | 26 | call .draw_cursor |
27 | @@: |
||
28 | call .draw_text |
||
29 | ; ret |
||
30 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
31 | ;Общий выход из editbox для всех функций и пост обработчиков;; |
||
32 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
33 | .editbox_exit: |
||
34 | popad |
||
35 | ret 4 |
||
36 | } |
||
37 | |||
38 | |||
39 | macro use_editbox_key |
||
40 | { |
||
41 | ;========================================================== |
||
42 | ;=== обработка клавиатуры ================================= |
||
43 | ;========================================================== |
||
44 | edit_box_key: |
||
45 | pushad |
||
46 | mov edi,dword [esp+36] |
||
47 | test word ed_flags,ed_focus ; если не в фокусе, выходим |
||
48 | je edit_box.editbox_exit |
||
49 | test word ed_flags,ed_mouse_on |
||
50 | jne edit_box.editbox_exit |
||
51 | |||
3358 | mario79 | 52 | ;-------------------------------------- |
53 | ; this code for Win-keys, works with |
||
54 | ; kernel SVN r.3356 or later |
||
55 | push eax |
||
56 | push ebx |
||
57 | mcall 66,3 |
||
58 | test ax,0x200 ; LWin |
||
59 | jnz .win_key_pressed |
||
60 | test ax,0x400 ; RWin |
||
61 | jz @f |
||
62 | .win_key_pressed: |
||
63 | pop ebx |
||
64 | pop eax |
||
65 | jmp edit_box.editbox_exit |
||
66 | @@: |
||
67 | pop ebx |
||
68 | pop eax |
||
69 | ;-------------------------------------- |
||
1032 | Lrz | 70 | ;Проверка нажат shift ? |
71 | call edit_box_key.check_shift |
||
72 | ;---------------------------------------------------------- |
||
73 | ;--- проверяем, что нажато -------------------------------- |
||
74 | ;---------------------------------------------------------- |
||
3130 | IgorA | 75 | cmp ah,8 |
76 | jz edit_box_key.backspace |
||
77 | cmp ah,0xb6 |
||
78 | jz edit_box_key.delete |
||
79 | cmp ah,176 |
||
80 | jz edit_box_key.left |
||
81 | cmp ah,179 |
||
82 | jz edit_box_key.right |
||
83 | cmp ah,180 |
||
84 | jz edit_box_key.home |
||
85 | cmp ah,181 |
||
86 | jz edit_box_key.end |
||
87 | cmp ah,185 ;insert |
||
88 | jz edit_box_key.insert |
||
1032 | Lrz | 89 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
90 | ;Заглушка на обработку клавиш вверх и вниз т.е. при обнаружении этих кодов происходит выход из обработчика |
||
91 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
92 | use_key_no_process up,down,esc,enter,tab,numl,capsl,scrolll |
||
93 | ;--- нажата другая клавиша --- |
||
94 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
1858 | lev | 95 | ;Проверка установлен ли флаг при котором нужно выводить только цифры в нужном боксе, если такой необходимости нет, нужно закоментировать макрос |
1032 | Lrz | 96 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
97 | use_key_figures_only |
||
98 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
1858 | lev | 99 | ;проверка на shift, был ли нажат |
1032 | Lrz | 100 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
101 | are_key_shift_press |
||
102 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
103 | ; проверяем, находится ли курсор в конце + дальнейшая обработка |
||
104 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
105 | are_key_cur_end |
||
106 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
1858 | lev | 107 | ;Обработка клавиш insert,delete.backspace,home,end,left,right |
1032 | Lrz | 108 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
109 | use_work_key |
||
110 | } |
||
111 | |||
112 | macro use_editbox_mouse |
||
113 | { |
||
114 | ;========================================================== |
||
115 | ;=== обработка мыши ======================================= |
||
116 | ;========================================================== |
||
117 | ;save for stdcall ebx,esi,edi,ebp |
||
118 | edit_box_mouse: |
||
119 | pushad |
||
120 | mov edi,dword [esp+36] |
||
121 | ;debug |
||
122 | ;---------------------------------------------------------- |
||
123 | ;--- получаем состояние кнопок мыши ----------------------- |
||
124 | ;---------------------------------------------------------- |
||
125 | mcall 37,2 |
||
126 | ;---------------------------------------------------------- |
||
127 | ;--- проверяем состояние ---------------------------------- |
||
128 | ;---------------------------------------------------------- |
||
129 | test eax,1 |
||
130 | jnz edit_box_mouse.mouse_left_button |
||
131 | and word ed_flags,ed_mouse_on_off |
||
1214 | Lrz | 132 | mov ebx,dword ed_mouse_variable |
133 | push 0 |
||
134 | pop dword [ebx] |
||
135 | ; mov dword [ebx],ebx |
||
1032 | Lrz | 136 | jmp edit_box.editbox_exit |
137 | .mouse_left_button: |
||
138 | ;---------------------------------------------------------- |
||
139 | ;--- блокировка от фокусировки в других боксах при попадании на них курсора |
||
140 | ;---------------------------------------------------------- |
||
1214 | Lrz | 141 | mov eax,dword ed_mouse_variable |
142 | push dword [eax] |
||
143 | pop eax |
||
1032 | Lrz | 144 | test eax,eax |
145 | jz @f |
||
146 | cmp eax,edi |
||
147 | je @f |
||
148 | jmp edit_box_mouse._blur |
||
149 | ;---------------------------------------------------------- |
||
150 | ;--- получаем координаты мыши относительно 0 т.е всей области экрана |
||
151 | ;---------------------------------------------------------- |
||
152 | @@: mcall 37,1 |
||
153 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
154 | ;Функция обработки мышки получение координат и проверка их + выделения |
||
155 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
156 | use_work_mouse |
||
157 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
158 | ;Общие функции обработки |
||
159 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
160 | use_general_func |
||
161 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
162 | ;Функции для работы с key |
||
163 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
164 | use_key_func |
||
165 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
166 | ;Функции для работы с mouse |
||
167 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
1858 | lev | 168 | use_mouse_func |
1032 | Lrz | 169 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
170 | ;Bit mask from editbox |
||
171 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
172 | } |
||
173 | |||
174 | |||
175 | ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||
176 | ;ниже расположены функции которыми реализуется весь алгоритм |
||
177 | ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||
1858 | lev | 178 | ;Макрос для вывода основных функций которые используются боксом |
1032 | Lrz | 179 | macro use_general_func |
180 | { |
||
181 | ;debug_func |
||
182 | ;---------------------------------------------------------- |
||
1858 | lev | 183 | ;--- процедура прорисовки выделенной части ----------------- |
1032 | Lrz | 184 | ;---------------------------------------------------------- |
185 | edit_box.draw_shift: |
||
186 | test word ed_flags,ed_shift_bac ;установка флага, выделенной области |
||
187 | jz @f |
||
188 | mov ebp,shift_color |
||
189 | mov ebx,dword ed_shift_pos |
||
190 | call edit_box_key.sh_cl_ |
||
191 | @@: ret |
||
192 | ;---------------------------------------------------------- |
||
193 | ;--- процедура прорисовки текста -------------------------- |
||
194 | ;---------------------------------------------------------- |
||
195 | edit_box.draw_text: |
||
196 | ;--- вычисляем, сколько помещается символов --- |
||
197 | ;--- чтобы мусор не рисовать --- |
||
198 | call edit_box.get_n |
||
199 | mov esi,ed_size |
||
200 | mov ebx,ed_offset |
||
201 | sub esi,ebx |
||
202 | cmp eax,esi |
||
203 | jae @F |
||
204 | mov esi,eax ;чтобы не выходить за пределы экрана |
||
1858 | lev | 205 | ;--- рисуем текст --- |
1032 | Lrz | 206 | @@: mov eax,4 |
207 | mov ebx,ed_left |
||
208 | mov edx,ed_offset |
||
209 | add ebx,2 |
||
210 | shl ebx,16 |
||
211 | add ebx,ed_top |
||
212 | mov ecx,ed_text_color |
||
213 | add ebx,4 |
||
214 | add edx,ed_text |
||
3089 | IgorA | 215 | test word ed_flags,ed_pass |
216 | jz @f |
||
217 | call edit_box.draw_password |
||
218 | jmp .end_f |
||
219 | @@: |
||
1032 | Lrz | 220 | mcall |
3089 | IgorA | 221 | .end_f: |
1032 | Lrz | 222 | ret |
3089 | IgorA | 223 | |
224 | txt_pass db '*',0 |
||
225 | |||
226 | proc edit_box.draw_password |
||
227 | locals |
||
228 | s_len dw ? ;длина выводимого текста |
||
229 | endl |
||
3090 | IgorA | 230 | cmp esi,1 |
231 | jl .end_f ;если строка пустая |
||
3089 | IgorA | 232 | mov [s_len],si |
233 | xor esi,esi |
||
234 | inc esi |