Subversion Repositories Kolibri OS

Rev

Rev 583 | Go to most recent revision | 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 - конец информационной структуры боксов
483 Lrz 87
use_f9 и procinfo - при передаче этого параметра - при перерисовки боксов будет исползована фунция
88
mcall   9,procinfo,-1
89
которая получает данные о окне и складывает параметры по адресу  procinfo- его то же обязательно нужно передавать!!!!
772 gluk 90
Если в программе уже используется эта функция, то не нужно указывать данные параметр!!!!
468 Lrz 91
 
92
Как под вариант существует макрос
772 gluk 93
draw_edit_box - он используется если выводится один бокс
468 Lrz 94
Передаваемый параметр
772 gluk 95
editboxes - указатель на информационную структуру боксов
96
use_f9 и procinfo - при передаче этого параметра - при перерисовки боксов будет использована функция
483 Lrz 97
mcall   9,procinfo,-1
98
которая получает данные о окне и складывает параметры по адресу  procinfo- его то же обязательно нужно передавать!!!!
772 gluk 99
Если в программе уже используется эта функция, то не нужно указывать данные параметр!!!!
468 Lrz 100
Больше никаких параметров передавать не нужно.
101
**********
772 gluk 102
default_box - макрос который приводит основные данные макроса по дефолту т.е. Снимает битовую матрицу выделения
103
Специально для KFM :)) Нужно добавить этот код при обработчике yes or no при копировании. Если будет вести себя неадекватно - необходимо раскомментировать строки в данном макросе
468 Lrz 104
 
105
 
106
 
107
 
108
 
109
 
110
Q:
111
Возникла пара проблем:
112
1) Длина максимально набираемого текста ничем не ограничена, в результате при превышении размера буфера затираются данные, которые идут после буфера или код, если он там расположен.
113
2) Положение элемента фиксировано, хотелось бы работать с динамически вычисляемыми значениями. Например, если размер окна изменился, а элемент должен располагаться по центру окна всегда.
114
 
115
A:
772 gluk 116
1) Длина набираемого текста ограничена, вот смотри:
468 Lrz 117
edit2 edit_box 250,5,30,0xffffff,0,0,0,308,hed,ed_focus,53 - это пример инициализации editbox
772 gluk 118
Итак, по порядку:
468 Lrz 119
Это макрос инициализации структуры
120
struc edit_box width,left,top,color,focus_border_color,blur_border_color,text_color,max,text,flags,size
121
{
122
.width dd width
123
.left dd left
124
.top dd top
125
.color dd color
126
.focus_border_color dd focus_border_color
127
.blur_border_color dd blur_border_color
128
.text_color dd text_color
129
.max dd max
130
.text dd text
131
.flags dw flags+0
132
.size dd size+0
133
.pos dd 0 - где будет находиться курсор
134
.offset dd 0
135
.cl_curs_x dd 0
136
.cl_curs_y dd 0
137
.shift dd 0
138
.shift_old dd 0
139
}
140
250 - это длинна editbox width
141
5 - отступ от левого края left
142
30 - отступ с верха top
143
0xffffff - цвет внутри editbox
144
0x6a9480 - цвет при выделении мышкой или по shift
145
 
146
 
147
 
772 gluk 148
308 - max максимальное кол-во текста, которое можно ввести (ответ на твой вопрос, обрати внимание на то, что это значение должно быть меньше на 2, чем размер буфера!! Иначе у тебя будут затерты 2 байта следующие после буфера!)
149
hed - tex указатель на начало буфера
468 Lrz 150
ed_focus - флаг(и0 в данном случае установить фокус этому Editbox'у - flags
151
53 - текущее значение размера size. его необходимо указывать, если тебе нужно уже отображать существующий текст. Или можно еще сделать так, ты указываешь, буфер с текстом, но тут ничего не пишешь, или 0, тогда, если человек начинает вводить свой, существующий текст уже будет автоматом затерт.
152
53 - положение курсора - говорим, что бы он находился в конце строчки на последним символе, больше это значение быть не должно, т.к. иначе глюки :)))
772 gluk 153
 - тут расположен сам буфер, + текст.
468 Lrz 154
hed db 'EDITBOX optimization and retype  date 09.03.2007',0 ; итого 54 символа
772 gluk 155
rb 256 ; 256+54 =310 у меня указан размер 308 - 2 байта на системные нужды (по идее должно хватать одного, но где - то есть косяк в коде)
468 Lrz 156
 
157
2) Изменять положение при изменении размеров окна. Вообще это не задача editbox, но это достаточно просто сделать,
158
.width dd width
159
.left dd left
160
.top dd top
772 gluk 161
Вот часть структуры.
468 Lrz 162
 
163
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
164
;DATA данные
165
editboxes:
166
edit1 edit_box 168,5,10,0xffffff,0x6a9480,0,0,0,99,ed_buffer.2,ed_figure_only
167
edit2 edit_box 250,5,30,0xffffff,0x6a9480,0,0xAABBCC,0,308,hed,ed_focus,53,53
168
edit3 edit_box 35,5,50,0xffffff,0x6a9480,0,0,0,9,ed_buffer.3,ed_figure_only
169
edit4 edit_box 16,5,70,0xffffff,0x6a9480,0,0,0,1,ed_buffer.4,ed_figure_only
170
editboxes_end:
171
 
172
 
173
А это пример инициализации
174
Итак получаем
175
lea eax, editboxes - в еах указатель на данные боксов.
176
Далее вносим по адресу
177
mov dword [eax], новое значение width
178
mov dword [eax+4], новое значение left
179
mov dword [eax+8], новое значение top
180
 
181
Это все для первого editbox
182
для второго
183
add eax,ed_struc_size
184
; это размерность в байтах записи длинны одного editbox
185
И снова
186
mov dword [eax], новое значение width
187
mov dword [eax+4], новое значение left
188
mov dword [eax+8], новое значение top
189
Это уже для второго editbox
190
 
191
И так далее ))).
772 gluk 192
Надеюсь, я для тебя прояснил общий алгоритм изменения