Subversion Repositories Kolibri OS

Rev

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