Subversion Repositories Kolibri OS

Rev

Rev 483 | Rev 772 | 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
 
468 Lrz 6
Посдедная модификация
7
;;;;;;;;;;;;;;;;;;;;;;;;;;;
483 Lrz 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
483 Lrz 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
61
код обработки мышки, вставляется обычно посел обработки всех предыдуших событий
62
Передаваемые параметры
63
editboxes - указатель на информационную струкуру боксов
64
editboxes_end - конец информационной структуры боксов
65
 
66
Как под вариант существует макрос
67
mouse_edit_box - он используется если выводитьсяч один бокс
68
Передаваемый параметр
69
editboxes - указатель на информационную струкуру боксов
70
Больше никаких параметров передавать не нужно.
71
**********
72
key_edit_boxes - макрос обрабоки клавиш боксами вставляется после того как происходит обработка события что нажата клавиша
73
Передаваемые параметры
74
editboxes - указатель на информационную струкуру боксов
75
editboxes_end - конец информационной структуры боксов
76
 
77
Как под вариант существует макрос
78
key_edit_box - он используется если выводитьсяч один бокс
79
Передаваемый параметр
80
editboxes - указатель на информационную струкуру боксов
81
Больше никаких параметров передавать не нужно.
82
**********
83
draw_edit_boxes - макрос для вывода боксов используется в выводе окна
84
Передаваемые параметры
85
editboxes - указатель на информационную струкуру боксов
86
editboxes_end - конец информационной структуры боксов
483 Lrz 87
use_f9 и procinfo - при передаче этого параметра - при перерисовки боксов будет исползована фунция
88
mcall   9,procinfo,-1
89
которая получает данные о окне и складывает параметры по адресу  procinfo- его то же обязательно нужно передавать!!!!
468 Lrz 90
Если в программе уже используется эта фунция, то не нужно указывать данные параметр!!!!
91
 
92
Как под вариант существует макрос
93
draw_edit_box - он используется если выводитьсяч один бокс
94
Передаваемый параметр
95
editboxes - указатель на информационную струкуру боксов
483 Lrz 96
use_f9 и procinfo - при передаче этого параметра - при перерисовки боксов будет исползована фунция
97
mcall   9,procinfo,-1
98
которая получает данные о окне и складывает параметры по адресу  procinfo- его то же обязательно нужно передавать!!!!
468 Lrz 99
Если в программе уже используется эта фунция, то не нужно указывать данные параметр!!!!
100
Больше никаких параметров передавать не нужно.
101
**********
102
default_box - макрос который приводит основые данные макроса по дефолту т.е. Снимает битовую матрицу выделения
103
Специально дла KFM :)) Нужно добавить этот код при при обработчике yes or no при копировании. Если будет вести себя неадекватно - необходимо раскоментировать строки в данном макросе
104
 
105
 
106
 
107
 
108
 
109
 
110
Q:
111
Возникла пара проблем:
112
1) Длина максимально набираемого текста ничем не ограничена, в результате при превышении размера буфера затираются данные, которые идут после буфера или код, если он там расположен.
113
2) Положение элемента фиксировано, хотелось бы работать с динамически вычисляемыми значениями. Например, если размер окна изменился, а элемент должен располагаться по центру окна всегда.
114
 
115
A:
116
1) Длинна набираемого текста ограничена, вот смотри:
117
edit2 edit_box 250,5,30,0xffffff,0,0,0,308,hed,ed_focus,53 - это пример инициализации editbox
118
Итак попорядку:
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
 
148
308 - max максимальное кол-во текста которое можноввести (ответ на твой вопрос, обрати внимание на то что это значение должно быть меньше на 2 чем размер буффера!! Иначе у тебя будут затерты 2 байта следующие после буффера!)
149
hed - tex указатель на начало буффера
150
ed_focus - флаг(и0 в данном случае установить фокус этому Editbox'у - flags
151
53 - текущее значение размера size. его необходимо указывать, если тебе нужно уже отображать существующий текст. Или можно еще сделать так, ты указываешь, буфер с текстом, но тут ничего не пишешь, или 0, тогда, если человек начинает вводить свой, существующий текст уже будет автоматом затерт.
152
53 - положение курсора - говорим, что бы он находился в конце строчки на последним символе, больше это значение быть не должно, т.к. иначе глюки :)))
153
 - тут расположен сам буффер, + текст.
154
hed db 'EDITBOX optimization and retype  date 09.03.2007',0 ; итого 54 символа
155
rb 256 ; 256+54 =310 у меня указан размер 308 - 2 байта на систеиные нужды (по идее должно хватать одного, но где - то есть косяк в коде)
156
 
157
2) Изменять положение при изменении размеров окна. Вообще это не задача editbox, но это достаточно просто сделать,
158
.width dd width
159
.left dd left
160
.top dd top
161
Вот часть стуктуры.
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
И так далее ))).
192
Надеюсь я для тебя прояснил общий алгоритм изменения