Посдедная модификация ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;Структурное описание возможности компонета и моделей его использования. ;;;;;;;;;;;;;;;;;;;;;;;;;;; Напишите в исходном коде своей программы 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 - положение курсора - говорим, что бы он находился в конце строчки на последним символе, больше это значение быть не должно, т.к. иначе глюки :))) - тут расположен сам буффер, + текст. hed db 'EDITBOX optimization and retype 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 И так далее ))). Надеюсь я для тебя прояснил общий алгоритм изменения