Rev 468 | Rev 583 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
468 | Lrz | 1 | Посдедная модификация |
2 | ;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
483 | Lrz | 3 | ;;;Структурное описание возможности компонета и моделей его использования. |
468 | Lrz | 4 | ;;;;;;;;;;;;;;;;;;;;;;;;;;; |
5 | Напишите в исходном коде своей программы use_edit_box, |
||
6 | это вставит необходимые процедуры в код вашей программы. |
||
7 | Процедуры: |
||
8 | edit_box.draw - полная перерисовка; |
||
9 | edit_box.key - обработка клавиатуры; |
||
10 | edit_box.mouse - обработка мыши; |
||
11 | edit_box.focus - установка фокуса; |
||
12 | edit_box.blur - его размывание; |
||
13 | edit_box.get_n - получить количество прорисовываемых символов. |
||
14 | При вызове любых из этих процедур в регистре edi следует |
||
15 | оставить указатель на структуру. |
||
16 | Пример структуры: |
||
17 | some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text |
||
18 | длина, высота, верх, цвет фона, цвет рамки, если выбран, |
||
19 | цвет рамки, если не выбран, максимальное количество символов, |
||
20 | указатель на буфер, где будут хранится символы. Буфер должен |
||
21 | оканчиваться нулем, например если максимальное количество 255: |
||
22 | some_edit_text: |
||
23 | rb 256 ;255+1 |
||
24 | Пример вызова процедуры: |
||
25 | mov edi,some_edit |
||
26 | call edit_box.draw |
||
27 | При вызове процедуры edit_box.key код клавиши должен |
||
28 | находится в ah, то есть перед вызовом этой процедуры надо вызвать |
||
29 | 2-ую сисемную функцию, например: |
||
30 | mov eax,2 |
||
31 | int 0x40 |
||
32 | mov edi,some_edit1 |
||
33 | call edit_box.key |
||
34 | mov edi,some_edit2 |
||
35 | call edit_box.key |
||
36 | Перед вызовом обработчика мыши следует проверить, является ли окно |
||
37 | активным. |
||
38 | Если щелчок мыши был пройзведен за пределами edit box |
||
39 | фокус теряется. |
||
40 | ::::::::::::::::::::::::: |
||
41 | ;;;Макросы, и передаваемые им параметры |
||
42 | ;;;;;;;;;;;;;;;;;;;;;;;;; |
||
43 | *********** |
||
44 | use_edit_box |
||
45 | данный макрос вставляет общий код editbox |
||
483 | Lrz | 46 | procinfo - указатель на информационную стрктуру 9 фунции - обязательный параметр |
468 | Lrz | 47 | |
48 | Если вы используете при прорисовке окна |
||
49 | mcall 0,(50*65536+390),(30*65536+200),0xb3AABBCC,0x805080DD,hed |
||
50 | то 0xb3AABBCC - третий бит - который говорит что координаты отчитывать от клиентской области, вам нужно указать обязательно два этих параметра |
||
51 | В других случаях передавать эти параметры не нужно |
||
52 | scr_h - не обязательный параметр обычно 22 |
||
53 | scr_w - не обязательный параметр обычно 5 |
||
54 | *********** |
||
55 | mouse_edit_boxes |
||
56 | код обработки мышки, вставляется обычно посел обработки всех предыдуших событий |
||
57 | Передаваемые параметры |
||
58 | editboxes - указатель на информационную струкуру боксов |
||
59 | editboxes_end - конец информационной структуры боксов |
||
60 | |||
61 | Как под вариант существует макрос |
||
62 | mouse_edit_box - он используется если выводитьсяч один бокс |
||
63 | Передаваемый параметр |
||
64 | editboxes - указатель на информационную струкуру боксов |
||
65 | Больше никаких параметров передавать не нужно. |
||
66 | ********** |
||
67 | key_edit_boxes - макрос обрабоки клавиш боксами вставляется после того как происходит обработка события что нажата клавиша |
||
68 | Передаваемые параметры |
||
69 | editboxes - указатель на информационную струкуру боксов |
||
70 | editboxes_end - конец информационной структуры боксов |
||
71 | |||
72 | Как под вариант существует макрос |
||
73 | key_edit_box - он используется если выводитьсяч один бокс |
||
74 | Передаваемый параметр |
||
75 | editboxes - указатель на информационную струкуру боксов |
||
76 | Больше никаких параметров передавать не нужно. |
||
77 | ********** |
||
78 | draw_edit_boxes - макрос для вывода боксов используется в выводе окна |
||
79 | Передаваемые параметры |
||
80 | editboxes - указатель на информационную струкуру боксов |
||
81 | editboxes_end - конец информационной структуры боксов |
||
483 | Lrz | 82 | use_f9 и procinfo - при передаче этого параметра - при перерисовки боксов будет исползована фунция |
83 | mcall 9,procinfo,-1 |
||
84 | которая получает данные о окне и складывает параметры по адресу procinfo- его то же обязательно нужно передавать!!!! |
||
468 | Lrz | 85 | Если в программе уже используется эта фунция, то не нужно указывать данные параметр!!!! |
86 | |||
87 | Как под вариант существует макрос |
||
88 | draw_edit_box - он используется если выводитьсяч один бокс |
||
89 | Передаваемый параметр |
||
90 | editboxes - указатель на информационную струкуру боксов |
||
483 | Lrz | 91 | use_f9 и procinfo - при передаче этого параметра - при перерисовки боксов будет исползована фунция |
92 | mcall 9,procinfo,-1 |
||
93 | которая получает данные о окне и складывает параметры по адресу procinfo- его то же обязательно нужно передавать!!!! |
||
468 | Lrz | 94 | Если в программе уже используется эта фунция, то не нужно указывать данные параметр!!!! |
95 | Больше никаких параметров передавать не нужно. |
||
96 | ********** |
||
97 | default_box - макрос который приводит основые данные макроса по дефолту т.е. Снимает битовую матрицу выделения |
||
98 | Специально дла KFM :)) Нужно добавить этот код при при обработчике yes or no при копировании. Если будет вести себя неадекватно - необходимо раскоментировать строки в данном макросе |
||
99 | |||
100 | |||
101 | |||
102 | |||
103 | |||
104 | |||
105 | Q: |
||
106 | Возникла пара проблем: |
||
107 | 1) Длина максимально набираемого текста ничем не ограничена, в результате при превышении размера буфера затираются данные, которые идут после буфера или код, если он там расположен. |
||
108 | 2) Положение элемента фиксировано, хотелось бы работать с динамически вычисляемыми значениями. Например, если размер окна изменился, а элемент должен располагаться по центру окна всегда. |
||
109 | |||
110 | A: |
||
111 | 1) Длинна набираемого текста ограничена, вот смотри: |
||
112 | edit2 edit_box 250,5,30,0xffffff,0,0,0,308,hed,ed_focus,53 - это пример инициализации editbox |
||
113 | Итак попорядку: |
||
114 | Это макрос инициализации структуры |
||
115 | struc edit_box width,left,top,color,focus_border_color,blur_border_color,text_color,max,text,flags,size |
||
116 | { |
||
117 | .width dd width |
||
118 | .left dd left |
||
119 | .top dd top |
||
120 | .color dd color |
||
121 | .focus_border_color dd focus_border_color |
||
122 | .blur_border_color dd blur_border_color |
||
123 | .text_color dd text_color |
||
124 | .max dd max |
||
125 | .text dd text |
||
126 | .flags dw flags+0 |
||
127 | .size dd size+0 |
||
128 | .pos dd 0 - где будет находиться курсор |
||
129 | .offset dd 0 |
||
130 | .cl_curs_x dd 0 |
||
131 | .cl_curs_y dd 0 |
||
132 | .shift dd 0 |
||
133 | .shift_old dd 0 |
||
134 | } |
||
135 | 250 - это длинна editbox width |
||
136 | 5 - отступ от левого края left |
||
137 | 30 - отступ с верха top |
||
138 | 0xffffff - цвет внутри editbox |
||
139 | 0x6a9480 - цвет при выделении мышкой или по shift |
||
140 | |||
141 | |||
142 | |||
143 | 308 - max максимальное кол-во текста которое можноввести (ответ на твой вопрос, обрати внимание на то что это значение должно быть меньше на 2 чем размер буффера!! Иначе у тебя будут затерты 2 байта следующие после буффера!) |
||
144 | hed - tex указатель на начало буффера |
||
145 | ed_focus - флаг(и0 в данном случае установить фокус этому Editbox'у - flags |
||
146 | 53 - текущее значение размера size. его необходимо указывать, если тебе нужно уже отображать существующий текст. Или можно еще сделать так, ты указываешь, буфер с текстом, но тут ничего не пишешь, или 0, тогда, если человек начинает вводить свой, существующий текст уже будет автоматом затерт. |
||
147 | 53 - положение курсора - говорим, что бы он находился в конце строчки на последним символе, больше это значение быть не должно, т.к. иначе глюки :))) |
||
148 | - тут расположен сам буффер, + текст. |
||
149 | hed db 'EDITBOX optimization and retype |
||
150 | rb 256 ; 256+54 =310 у меня указан размер 308 - 2 байта на систеиные нужды (по идее должно хватать одного, но где - то есть косяк в коде) |
||
151 | |||
152 | 2) Изменять положение при изменении размеров окна. Вообще это не задача editbox, но это достаточно просто сделать, |
||
153 | .width dd width |
||
154 | .left dd left |
||
155 | .top dd top |
||
156 | Вот часть стуктуры. |
||
157 | |||
158 | ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |
||
159 | ;DATA данные |
||
160 | editboxes: |
||
161 | edit1 edit_box 168,5,10,0xffffff,0x6a9480,0,0,0,99,ed_buffer.2,ed_figure_only |
||
162 | edit2 edit_box 250,5,30,0xffffff,0x6a9480,0,0xAABBCC,0,308,hed,ed_focus,53,53 |
||
163 | edit3 edit_box 35,5,50,0xffffff,0x6a9480,0,0,0,9,ed_buffer.3,ed_figure_only |
||
164 | edit4 edit_box 16,5,70,0xffffff,0x6a9480,0,0,0,1,ed_buffer.4,ed_figure_only |
||
165 | editboxes_end: |
||
166 | |||
167 | |||
168 | А это пример инициализации |
||
169 | Итак получаем |
||
170 | lea eax, editboxes - в еах указатель на данные боксов. |
||
171 | Далее вносим по адресу |
||
172 | mov dword [eax], новое значение width |
||
173 | mov dword [eax+4], новое значение left |
||
174 | mov dword [eax+8], новое значение top |
||
175 | |||
176 | Это все для первого editbox |
||
177 | для второго |
||
178 | add eax,ed_struc_size |
||
179 | ; это размерность в байтах записи длинны одного editbox |
||
180 | И снова |
||
181 | mov dword [eax], новое значение width |
||
182 | mov dword [eax+4], новое значение left |
||
183 | mov dword [eax+8], новое значение top |
||
184 | Это уже для второго editbox |
||
185 | |||
186 | И так далее ))). |
||
187 | Надеюсь я для тебя прояснил общий алгоритм изменения |