Subversion Repositories Kolibri OS

Rev

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  date 09.03.2007',0 ; итого 54 символа
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
Надеюсь, я для тебя прояснил общий алгоритм изменения