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