Rev 446 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
449 | Lrz | 1 | ; |
439 | Lrz | 2 | ; |
404 | Lrz | 3 | ; |
396 | Lrz | 4 | ; |
391 | Lrz | 5 | ; |
348 | Lrz | 6 | ; |
7 | ; |
||
8 | ; добавил фитчу внесения 0х0 по адресу ed_size иначе у Maxxx32 были несостыковки в коде. Причина в том, что оптимизация была сведена к тому, что я не чистил символы в буфере, когда удалял, я просто их не выводил, и потом, когда вносился новый символ, он попросту затирал уже имеющийся. Если бы, программа обрабатывала конец строки по ed_size, проблемы не возникло. Но сейчас этот недостаток исправлен. |
||
306 | Lrz | 9 | ; |
295 | Lrz | 10 | ; |
11 | ; |
||
289 | Lrz | 12 | ; |
13 | ; |
||
234 | Lrz | 14 | ; |
15 | ; |
||
16 | ; |
||
17 | ; |
||
18 | ; |
||
19 | ; Автор: Евтихов Максим (Maxxxx32) email: maxxxxm@mail.ru |
||
20 | ; Дата последних изменений: 13.06.06 10:40 |
||
21 | ; Напишите в исходном коде своей программы use_edit_box, |
||
22 | ; это вставит необходимые процедуры в код вашей программы. |
||
23 | ; Процедуры: |
||
24 | ; edit_box.draw - полная перерисовка; |
||
25 | ; edit_box.key - обработка клавиатуры; |
||
26 | ; edit_box.mouse - обработка мыши; |
||
27 | ; edit_box.focus - установка фокуса; |
||
28 | ; edit_box.blur - его размывание; |
||
29 | ; edit_box.get_n - получить количество прорисовываемых символов. |
||
30 | ; При вызове любых из этих процедур в регистре edi следует |
||
31 | ; оставить указатель на структуру. |
||
32 | ; Пример структуры: |
||
33 | ; some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text |
||
34 | ; длина, высота, верх, цвет фона, цвет рамки, если выбран, |
||
35 | ; цвет рамки, если не выбран, максимальное количество символов, |
||
36 | ; указатель на буфер, где будут хранится символы. Буфер должен |
||
37 | ; оканчиваться нулем, например если максимальное количество 255: |
||
38 | ; some_edit_text: |
||
39 | ; rb 256 ;255+1 |
||
40 | |||
41 | ; Пример вызова процедуры: |
||
42 | ; mov edi,some_edit |
||
43 | ; call edit_box.draw |
||
44 | |||
45 | ; При вызове процедуры edit_box.key код клавиши должен |
||
46 | ; находится в ah, то есть перед вызовом этой процедуры надо вызвать |
||
47 | ; 2-ую сисемную функцию, например: |
||
48 | ; mov eax,2 |
||
49 | ; int 0x40 |
||
50 | ; mov edi,some_edit1 |
||
51 | ; call edit_box.key |
||
52 | ; mov edi,some_edit2 |
||
53 | ; call edit_box.key |
||
54 | ; Перед вызовом обработчика мыши следует проверить, является ли окно |
||
55 | ; активным. |
||
56 | ; Если щелчок мыши был пройзведен за пределами edit box |
||
57 | ; фокус теряется. |
||
58 | macro use_edit_box |
||
59 | { |
||
60 | edit_box: |
||
61 | ed_width equ [edi] ;ширина компонента |
||
62 | ed_left equ [edi+4] ;положение по оси х |
||
63 | ed_top equ [edi+8] ;положение по оси у |
||
64 | ed_color equ [edi+12] ;цвет фона компонента |
||
65 | ed_focus_border_color equ [edi+16] ;цвет рамки компонента |
||
66 | ed_blur_border_color equ [edi+20] ;цвет не активного компонента |
||
67 | ed_text_color equ [edi+24] ;цвет текста |
||
282 | Lrz | 68 | ed_max equ [edi+28] ;кол-во символов которые можно максимально ввести |
69 | ed_text equ [edi+32] ;указатель на буфер |
||
70 | ed_flags equ [edi+36] ;флаги |
||
71 | ed_size equ [edi+38] ;кол-во символов |
||
72 | ed_pos equ [edi+42] ;позиция курсора |
||
73 | ed_offset equ [edi+46] ;смещение |
||
74 | cl_curs_x equ [edi+50] ;предыдущее координата курсора по х |
||
75 | cl_curs_y equ [edi+54] ;предыдущее координата курсора по у |
||
396 | Lrz | 76 | ed_shift_pos equ [edi+58] ;положение курсора |
77 | ed_shift_pos_old equ [edi+62] ;старое положение курсора |
||
234 | Lrz | 78 | ;========================================================== |
79 | ;=== процедура прорисовки ================================= |
||
80 | ;========================================================== |
||
81 | .draw: |
||
82 | pusha |
||
83 | ;--- рисуем рамку --- |
||
84 | call .draw_border ; Функция стабильна |
||
85 | .draw_bg_cursor_text: |
||
86 | ;--- изменяем смещение, если надо --- |
||
87 | call .check_offset ;вычисление позиции курсора стабильна |
||
88 | ;--- рисуем внутреннюю область --- |
||
89 | call .draw_bg ;нарисовать прямоугольник рабочей области |
||
402 | Lrz | 90 | ;---- рисуем выделение, по shift если есть |
91 | call .draw_shift |
||
234 | Lrz | 92 | .draw_cursor_text: |
93 | ;--- рисуем курсор --- |
||
94 | ;--- может его не надо рисовать ---- |
||
282 | Lrz | 95 | test word ed_flags,ed_focus |
234 | Lrz | 96 | je @f |
97 | call .draw_cursor |
||
98 | @@: |
||
99 | call .draw_text |
||
100 | popa |
||
101 | ret |
||
102 | ;---------------------------------------------------------- |
||
402 | Lrz | 103 | ;--- процедура прорисовки выделеной части ----------------- |
104 | ;---------------------------------------------------------- |
||
105 | .draw_shift: |
||
106 | test word ed_flags,ed_shift_bac ;установка флага, выделенной области |
||
107 | jz @f |
||
108 | mov ebp,shift_color |
||
109 | mov ebx,dword ed_shift_pos |
||
110 | call .sh_cl_ |
||
111 | @@: ret |
||
112 | |||
113 | |||
114 | ;---------------------------------------------------------- |
||
234 | Lrz | 115 | ;--- процедура прорисовки текста -------------------------- |
116 | ;---------------------------------------------------------- |
||
117 | .draw_text: |
||
118 | ;--- вычисляем, сколько помещается символов --- |
||
119 | ;--- чтобы мусор не рисовать --- |
||
120 | call .get_n |
||
121 | mov esi,ed_size |
||
122 | mov ebx,ed_offset |
||
123 | sub esi,ebx |
||
124 | cmp eax,esi |
||
125 | jae @F |
||
126 | mov esi,eax ;чтобы не выходить за пределы экрана |
||
402 | Lrz | 127 | ;--- рисуем текст --- |
234 | Lrz | 128 | @@: mov eax,4 |
129 | mov ebx,ed_left |
||
306 | Lrz | 130 | mov edx,ed_offset |
234 | Lrz | 131 | add ebx,2 |
132 | shl ebx,16 |
||
133 | mov bx,ed_top |
||
134 | add ebx,4 |
||
135 | mov ecx,ed_text_color |
||
136 | add edx,ed_text |
||
137 | int 0x40 |
||
138 | ret |
||
139 | ;---------------------------------------------------------- |
||
140 | ;--- процедура прорисовки фона ---------------------------- |
||
141 | ;входные данные |
||
142 | ;eax |
||
292 | Lrz | 143 | ;edx - color |
234 | Lrz | 144 | ;---------------------------------------------------------- |
343 | Lrz | 145 | ;вход только цвет edx |
234 | Lrz | 146 | .draw_bg: |
147 | mov ebx,ed_left |
||
148 | add ebx,1 |
||
149 | shl ebx,16 |
||
150 | mov bx,ed_width |
||
151 | sub ebx,1 |
||
391 | Lrz | 152 | mov edx,ed_color |
153 | .draw_bg_eax: |
||
234 | Lrz | 154 | mov ecx,ed_top |
306 | Lrz | 155 | mov eax,13 |
234 | Lrz | 156 | add ecx,1 |
157 | shl ecx,16 |
||
158 | mov cx,ed_height |
||
391 | Lrz | 159 | dec ecx |
306 | Lrz | 160 | int 0x40 |
234 | Lrz | 161 | ret |
162 | |||
163 | ;---------------------------------------------------------- |
||
164 | ;--- процедура получения количества символов в текущей щирине компонента -------------- |
||
165 | ;---------------------------------------------------------- |
||
166 | .get_n: |
||
306 | Lrz | 167 | mov eax,ed_width ;получем ширину компонента |
234 | Lrz | 168 | xor edx,edx ;результат распологается в паре edx:eax в eax - остаток |
169 | sub eax,4 ;вычтим 4 |
||
170 | mov ebx,6 ;загрузми делитель |
||
171 | div ebx ;размделим на 6 |
||
172 | ret |
||
173 | ;---------------------------------------------------------- |
||
174 | ;--- процедура рисования курсора -------------------------- |
||
175 | ;---------------------------------------------------------- |
||
391 | Lrz | 176 | ;входные ebp- цвет |
234 | Lrz | 177 | .clear_cursor: |
391 | Lrz | 178 | mov edx,ebp |
234 | Lrz | 179 | mov ebx,cl_curs_x |
180 | mov ecx,cl_curs_y |
||
181 | jmp .draw_curs |
||
182 | .draw_cursor: |
||
183 | mov edx,ed_text_color |
||
184 | mov ebx,ed_pos |
||
185 | mov ecx,ed_offset |
||
186 | sub ebx,ecx |
||
187 | |||
188 | lea ebx,[ebx*2+ebx] |
||
189 | shl ebx,1 |
||
190 | ;imul ebx,6 |
||
191 | add bx,ed_left |
||
306 | Lrz | 192 | mov ecx,ed_top |
234 | Lrz | 193 | inc ebx |
306 | Lrz | 194 | add ecx,2 |
234 | Lrz | 195 | mov ebp,ebx |
196 | shl ebx,16 |
||
197 | mov bx,bp |
||
198 | mov ebp,ecx |
||
199 | |||
200 | shl ecx,16 |
||
201 | mov cx,bp |
||
202 | add cx,ed_height-4 |
||
203 | |||
204 | mov cl_curs_x,ebx |
||
205 | mov cl_curs_y,ecx |
||
206 | .draw_curs: |
||
207 | mov eax,38 |
||
208 | int 0x40 |
||
209 | ret |
||
210 | ;---------------------------------------------------------- |
||
211 | ;--- процедура рисования рамки ---------------------------- |
||
212 | ;---------------------------------------------------------- |
||
213 | .draw_border: |
||
214 | ;--- цвет рамки --- |
||
396 | Lrz | 215 | test word ed_flags,ed_focus |
234 | Lrz | 216 | mov edx,ed_focus_border_color |
217 | jne @f |
||
218 | mov edx,ed_blur_border_color |
||