kolibrios/programs/develop/examples/editbox/trunk/FAQ.txt
Alexey Teplov ( b192d9260a modify macros and optimization
git-svn-id: svn://kolibrios.org@483 a494cfbc-eb01-0410-851d-a64ba20cac60
2007-05-10 04:03:05 +00:00

187 lines
8.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Посдедная модификация
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Структурное описание возможности компонета и моделей его использования.
;;;;;;;;;;;;;;;;;;;;;;;;;;;
Напишите в исходном коде своей программы 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
И так далее ))).
Надеюсь я для тебя прояснил общий алгоритм изменения