forked from KolibriOS/kolibrios
b192d9260a
git-svn-id: svn://kolibrios.org@483 a494cfbc-eb01-0410-851d-a64ba20cac60
187 lines
8.2 KiB
Plaintext
187 lines
8.2 KiB
Plaintext
Посдедная модификация
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
;;;Структурное описание возможности компонета и моделей его использования.
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
Напишите в исходном коде своей программы use_edit_box,
|
||
это вставит необходимые процедуры в код вашей программы.
|
||
Процедуры:
|
||
edit_box.draw - полная перерисовка;
|
||
edit_box.key - обработка клавиатуры;
|
||
edit_box.mouse - обработка мыши;
|
||
edit_box.focus - установка фокуса;
|
||
edit_box.blur - его размывание;
|
||
edit_box.get_n - получить количество прорисовываемых символов.
|
||
При вызове любых из этих процедур в регистре edi следует
|
||
оставить указатель на структуру.
|
||
Пример структуры:
|
||
some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text
|
||
длина, высота, верх, цвет фона, цвет рамки, если выбран,
|
||
цвет рамки, если не выбран, максимальное количество символов,
|
||
указатель на буфер, где будут хранится символы. Буфер должен
|
||
оканчиваться нулем, например если максимальное количество 255:
|
||
some_edit_text:
|
||
rb 256 ;255+1
|
||
Пример вызова процедуры:
|
||
mov edi,some_edit
|
||
call edit_box.draw
|
||
При вызове процедуры edit_box.key код клавиши должен
|
||
находится в ah, то есть перед вызовом этой процедуры надо вызвать
|
||
2-ую сисемную функцию, например:
|
||
mov eax,2
|
||
int 0x40
|
||
mov edi,some_edit1
|
||
call edit_box.key
|
||
mov edi,some_edit2
|
||
call edit_box.key
|
||
Перед вызовом обработчика мыши следует проверить, является ли окно
|
||
активным.
|
||
Если щелчок мыши был пройзведен за пределами edit box
|
||
фокус теряется.
|
||
:::::::::::::::::::::::::
|
||
;;;Макросы, и передаваемые им параметры
|
||
;;;;;;;;;;;;;;;;;;;;;;;;;
|
||
***********
|
||
use_edit_box
|
||
данный макрос вставляет общий код editbox
|
||
procinfo - указатель на информационную стрктуру 9 фунции - обязательный параметр
|
||
|
||
Если вы используете при прорисовке окна
|
||
mcall 0,(50*65536+390),(30*65536+200),0xb3AABBCC,0x805080DD,hed
|
||
то 0xb3AABBCC - третий бит - который говорит что координаты отчитывать от клиентской области, вам нужно указать обязательно два этих параметра
|
||
В других случаях передавать эти параметры не нужно
|
||
scr_h - не обязательный параметр обычно 22
|
||
scr_w - не обязательный параметр обычно 5
|
||
***********
|
||
mouse_edit_boxes
|
||
код обработки мышки, вставляется обычно посел обработки всех предыдуших событий
|
||
Передаваемые параметры
|
||
editboxes - указатель на информационную струкуру боксов
|
||
editboxes_end - конец информационной структуры боксов
|
||
|
||
Как под вариант существует макрос
|
||
mouse_edit_box - он используется если выводитьсяч один бокс
|
||
Передаваемый параметр
|
||
editboxes - указатель на информационную струкуру боксов
|
||
Больше никаких параметров передавать не нужно.
|
||
**********
|
||
key_edit_boxes - макрос обрабоки клавиш боксами вставляется после того как происходит обработка события что нажата клавиша
|
||
Передаваемые параметры
|
||
editboxes - указатель на информационную струкуру боксов
|
||
editboxes_end - конец информационной структуры боксов
|
||
|
||
Как под вариант существует макрос
|
||
key_edit_box - он используется если выводитьсяч один бокс
|
||
Передаваемый параметр
|
||
editboxes - указатель на информационную струкуру боксов
|
||
Больше никаких параметров передавать не нужно.
|
||
**********
|
||
draw_edit_boxes - макрос для вывода боксов используется в выводе окна
|
||
Передаваемые параметры
|
||
editboxes - указатель на информационную струкуру боксов
|
||
editboxes_end - конец информационной структуры боксов
|
||
use_f9 и procinfo - при передаче этого параметра - при перерисовки боксов будет исползована фунция
|
||
mcall 9,procinfo,-1
|
||
которая получает данные о окне и складывает параметры по адресу procinfo- его то же обязательно нужно передавать!!!!
|
||
Если в программе уже используется эта фунция, то не нужно указывать данные параметр!!!!
|
||
|
||
Как под вариант существует макрос
|
||
draw_edit_box - он используется если выводитьсяч один бокс
|
||
Передаваемый параметр
|
||
editboxes - указатель на информационную струкуру боксов
|
||
use_f9 и procinfo - при передаче этого параметра - при перерисовки боксов будет исползована фунция
|
||
mcall 9,procinfo,-1
|
||
которая получает данные о окне и складывает параметры по адресу procinfo- его то же обязательно нужно передавать!!!!
|
||
Если в программе уже используется эта фунция, то не нужно указывать данные параметр!!!!
|
||
Больше никаких параметров передавать не нужно.
|
||
**********
|
||
default_box - макрос который приводит основые данные макроса по дефолту т.е. Снимает битовую матрицу выделения
|
||
Специально дла KFM :)) Нужно добавить этот код при при обработчике yes or no при копировании. Если будет вести себя неадекватно - необходимо раскоментировать строки в данном макросе
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Q:
|
||
Возникла пара проблем:
|
||
1) Длина максимально набираемого текста ничем не ограничена, в результате при превышении размера буфера затираются данные, которые идут после буфера или код, если он там расположен.
|
||
2) Положение элемента фиксировано, хотелось бы работать с динамически вычисляемыми значениями. Например, если размер окна изменился, а элемент должен располагаться по центру окна всегда.
|
||
|
||
A:
|
||
1) Длинна набираемого текста ограничена, вот смотри:
|
||
edit2 edit_box 250,5,30,0xffffff,0,0,0,308,hed,ed_focus,53 - это пример инициализации editbox
|
||
Итак попорядку:
|
||
Это макрос инициализации структуры
|
||
struc edit_box width,left,top,color,focus_border_color,blur_border_color,text_color,max,text,flags,size
|
||
{
|
||
.width dd width
|
||
.left dd left
|
||
.top dd top
|
||
.color dd color
|
||
.focus_border_color dd focus_border_color
|
||
.blur_border_color dd blur_border_color
|
||
.text_color dd text_color
|
||
.max dd max
|
||
.text dd text
|
||
.flags dw flags+0
|
||
.size dd size+0
|
||
.pos dd 0 - где будет находиться курсор
|
||
.offset dd 0
|
||
.cl_curs_x dd 0
|
||
.cl_curs_y dd 0
|
||
.shift dd 0
|
||
.shift_old dd 0
|
||
}
|
||
250 - это длинна editbox width
|
||
5 - отступ от левого края left
|
||
30 - отступ с верха top
|
||
0xffffff - цвет внутри editbox
|
||
0x6a9480 - цвет при выделении мышкой или по shift
|
||
0 - focus_border_color цвет рамки editbox, когда в фокусе т.е. активен editbox
|
||
0 - blur_border_color цвет рамки editbox, когда в не фокусе т.е. не активен editbox
|
||
0 - text_color цвет текста editbox.
|
||
308 - max максимальное кол-во текста которое можноввести (ответ на твой вопрос, обрати внимание на то что это значение должно быть меньше на 2 чем размер буффера!! Иначе у тебя будут затерты 2 байта следующие после буффера!)
|
||
hed - tex указатель на начало буффера
|
||
ed_focus - флаг(и0 в данном случае установить фокус этому Editbox'у - flags
|
||
53 - текущее значение размера size. его необходимо указывать, если тебе нужно уже отображать существующий текст. Или можно еще сделать так, ты указываешь, буфер с текстом, но тут ничего не пишешь, или 0, тогда, если человек начинает вводить свой, существующий текст уже будет автоматом затерт.
|
||
53 - положение курсора - говорим, что бы он находился в конце строчки на последним символе, больше это значение быть не должно, т.к. иначе глюки :)))
|
||
<DATA> - тут расположен сам буффер, + текст.
|
||
hed db 'EDITBOX optimization and retype <Lrz> date 09.03.2007',0 ; итого 54 символа
|
||
rb 256 ; 256+54 =310 у меня указан размер 308 - 2 байта на систеиные нужды (по идее должно хватать одного, но где - то есть косяк в коде)
|
||
|
||
2) Изменять положение при изменении размеров окна. Вообще это не задача editbox, но это достаточно просто сделать,
|
||
.width dd width
|
||
.left dd left
|
||
.top dd top
|
||
Вот часть стуктуры.
|
||
|
||
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||
;DATA данные
|
||
editboxes:
|
||
edit1 edit_box 168,5,10,0xffffff,0x6a9480,0,0,0,99,ed_buffer.2,ed_figure_only
|
||
edit2 edit_box 250,5,30,0xffffff,0x6a9480,0,0xAABBCC,0,308,hed,ed_focus,53,53
|
||
edit3 edit_box 35,5,50,0xffffff,0x6a9480,0,0,0,9,ed_buffer.3,ed_figure_only
|
||
edit4 edit_box 16,5,70,0xffffff,0x6a9480,0,0,0,1,ed_buffer.4,ed_figure_only
|
||
editboxes_end:
|
||
|
||
|
||
А это пример инициализации
|
||
Итак получаем
|
||
lea eax, editboxes - в еах указатель на данные боксов.
|
||
Далее вносим по адресу
|
||
mov dword [eax], новое значение width
|
||
mov dword [eax+4], новое значение left
|
||
mov dword [eax+8], новое значение top
|
||
|
||
Это все для первого editbox
|
||
для второго
|
||
add eax,ed_struc_size
|
||
; это размерность в байтах записи длинны одного editbox
|
||
И снова
|
||
mov dword [eax], новое значение width
|
||
mov dword [eax+4], новое значение left
|
||
mov dword [eax+8], новое значение top
|
||
Это уже для второго editbox
|
||
|
||
И так далее ))).
|
||
Надеюсь я для тебя прояснил общий алгоритм изменения |