From 352f992feaaf81f2a00392dde074210b50f8f8df Mon Sep 17 00:00:00 2001 From: "Alexey Teplov (" Date: Mon, 19 Feb 2007 07:03:21 +0000 Subject: [PATCH] upgrade component checkbox git-svn-id: svn://kolibrios.org@360 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../develop/examples/checkbox/trunk/check.inc | 58 +++++++------------ .../examples/checkbox/trunk/checkbox.asm | 57 +++++++++--------- 2 files changed, 48 insertions(+), 67 deletions(-) diff --git a/programs/develop/examples/checkbox/trunk/check.inc b/programs/develop/examples/checkbox/trunk/check.inc index c725a25f13..51699e5afa 100644 --- a/programs/develop/examples/checkbox/trunk/check.inc +++ b/programs/develop/examples/checkbox/trunk/check.inc @@ -1,10 +1,10 @@ -;Эффективное программирование в KOLIBRI ;Оптимизированный компонент CheckBox (Исходный вариант от Maxxxx32) ;Оптимизирован вывод строки надписи для CheckBox'a + теперь, при проверке не происходит подсчет кол-ва символов в строке ;Оптимизация команд - отказался от сохранения регистров в стеке. +;19.02.2007 общее улучшение кода, уменьшение размера и использование системных цветов для отображения checkbox ;17.07.2006 произведена оптимизация, при установке чек бокса в положение включено последующие чек боксы в тот же промежуток времени не проверяются ;22.08.2006 произведена оптимизация команд, приняты во внимание замечания DIAMOND'а. -; - Теплов Алексей www.test-kolibri.narod.ru +; - Теплов Алексей www.lrz.land.ru macro use_check_box { @@ -12,12 +12,11 @@ ch_text_margin=4 ; ch_size=10 ;размер квадрата чек бокса ch_left equ [edi] ;координата начала рисования по х ch_top equ [edi+2] ;координата начала рисования по у -ch_color equ [edi+4] ;цвет внутри checkbox -ch_border_color equ [edi+8] ;цвет рамки checkbox -ch_text_color equ [edi+12] ;цвет текста -ch_text_ptr equ [edi+16] ;указатель на начало текстовой строки -ch_text_length equ [edi+20] ;длина надписи (2^64 такой длины может быть текст) -ch_flags equ [edi+22] ;флаги +ch_border_color equ [sc.work_graph] ; or [edi+4] ;цвет рамки checkbox ее можно задать самостоятельно +ch_text_color equ [sc.work_text];[edi+4] ;цвет текста +ch_text_ptr equ [edi+4] ;указатель на начало текстовой строки +ch_text_length equ [edi+8] ;длина надписи (2^64 такой длины может быть текст) +ch_flags equ [edi+10] ;флаги check_box: .draw: pusha ;сохраним все регистры @@ -59,24 +58,9 @@ pusha ; ;pop cx int 0x40 ;нарисовали прямоугольник - mov eax,13 ;закрашиваем его. Функция 13 - нарисовать полосу - movzx ebx,word ch_left ;загрузить в bx, положение по х - add ebx,1 ;сдвинем на 1 т.е. прибавим 1 иначе затрется рамка - shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - mov bx,ch_size ;прибавим длину стороны прямоугольника - sub ebx,1 ;вычтем 1 т.к. иначе затрется рамка - mov bp,bx ;сохраним регистр bx в регистре указателя базы - ;push bx - movzx ecx,word ch_top ;загрузим координаты по y - add ecx,1 ;сдвинем на 1 т.е. прибавим 1 иначе затрется рамка - shl ecx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - mov cx,bp ;восстановим значение регистра cx - ;pop cx - mov edx,ch_color ;загрузим цвет полосы - int 0x40 ;закрасили - - test dword ch_flags,2 ;достать значение бита из переменной и поместить в флаг CF - + call .clear_ch + + test word ch_flags,2 ;достать значение бита из переменной и поместить в флаг CF jz @f ;в если CF=1, то выполним следующую процедуру иначе перейти на нижнюю @@ call .draw_ch ;нарисовать включенный чек бокс @@: @@ -99,7 +83,7 @@ popa ; ret ;выйдем из процедуры .clear_ch: ;очистка чек бокса - mov edx,ch_color ;цвет внутри чек бокса + mov edx,dword [sc.work] ;цвет внутри чек бокса jmp @f ;безусловный прыжок на нижнюю метку @@ .draw_ch: ;нарисовать включенный чек бокс @@ -128,11 +112,11 @@ pusha int 0x40 ;проверка не нажал ли пользователь кнопку мышки test eax,eax ;проверка если у нас в eax=0, то установим флаг и выйдем jnz @f ;перейти на нижнюю метку @@ - btr dword ch_flags,2 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое. + btr word ch_flags,2 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое. popa ;если ничего не произошло, то восстановим значения регистров из стека ret ;выход @@: - bts dword ch_flags,2 ;проверка флага т.е. перенос в cf значение бита и установка бита в состояние включено + bts word ch_flags,2 ;проверка флага т.е. перенос в cf значение бита и установка бита в состояние включено jc .mouse_end ;если CF=1 то перейти в конец т.е. это выход movzx esi,word ch_text_length ;загрузить кол-во символов в текстовой строке ;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea @@ -161,32 +145,32 @@ pusha cmp ax,bx ;стравнить регистры jg .mouse_end ;если больше - bts dword ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на 1. + bts word ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на 1. jc @f ;CF=1 то перейти на нижнюю @@ call .draw_ch ;отобразить включенный чек бокс mov dword [esp+24],1 ;дальнейшая проверка чек боксов бесмыслена, по этому в стек, где располагается ecx поместитм 0 jmp .mouse_end ;выйти @@: - btr dword ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое. + btr word ch_flags,1 ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое. call .clear_ch ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона. .mouse_end: popa ;восстановить регистры из стека ret ;выйти } -struc check_box left,top,color,border_color,text_color,text,text_length,flags +struc check_box left,top,text,text_length,flags { ;структура параметров для чек бокса .left: dw left ;+0 ;положение по х .top: dw top ;+2 ;положение по у -.color: dd color ;+4 ;цвет внутри чек бокса -.border_color: dd border_color ;+8 цвет рамки -.text_color: dd text_color ;+12 цвет текста надписи +;.border_color: dd border_color ;+8 цвет рамки +;.text_color: dd text_color ;+12 цвет текста надписи .text: dd text ;+16 адрес в коде программы где расположен текстр .text_length: dw text_length ; +20 длина текста -.flags: dd flags+0 ;+22 флаги +.flags: dw flags+0 ;+22 флаги } -ch_struc_size=26 ;общая структура 24 байт +ch_struc_size=12 ;общая структура 24 байт +ch_flag_en=10b macro draw_check_boxes start,end ;рисовать чек боксы { mov edi,start ;Указатель на начало данных чек боксов т.е. на начало данных первого чекбокса diff --git a/programs/develop/examples/checkbox/trunk/checkbox.asm b/programs/develop/examples/checkbox/trunk/checkbox.asm index 4999671fea..e7340b18be 100644 --- a/programs/develop/examples/checkbox/trunk/checkbox.asm +++ b/programs/develop/examples/checkbox/trunk/checkbox.asm @@ -1,9 +1,9 @@ -;Эффективное программирование в KOLIBRI ;Оптимизированный компонент CheckBox (Исходный вариант от Maxxxx32) ;Оптимизирован вывод строки, надписи для CheckBox'a + теперь при проверке не ;происходит подсчет кол-ва символов в строке ;Оптимизация команд. +;19.02.2007 общее улучшение кода, уменьшение размера и использование системных цветов для отображения checkbox ;22.08.2006 произведена оптимизация команд, приняты во внимание замечания DIAMOND'а. -; - Теплов Алексей www.test-kolibri.narod.ru +; - Теплов Алексей www.lrz.land.ru ;заголовок приложения use32 ; транслятор, использующий 32 разрядных команды @@ -21,13 +21,19 @@ use32 ; ; указатель на строку, в которую записан путь, ; откуда запущено приложение - - ;------------------ + include 'macros.inc' include 'check.inc' ;включить файл check.inc use_check_box ;используя макросы внести процедуры для рисования чек бокса ;Область кода +align 16 start: ;Точка входа в программу + mov eax,48 ;получить системные цвета + mov ebx,3 + mov ecx,sc + mov edx,sizeof.system_colors + int 0x40 + mov eax,40 ;установить маску для ожидаемых событий mov ebx,0x25 ;система будет реагировать только на сообщение о перерисовке,нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении) int 0x40 @@ -44,10 +50,6 @@ still: ; mouse_check_boxes check_boxes,check_boxes_end ;проверка чек бокса jmp still ;если ничего из перечисленного то снова в цикл button: - mov eax,17 ;получить идентификатор нажатой клавиши - int 0x40 - test ah,ah ;если в ah 0, то перейти на обработчик событий still - jz still or eax,-1 ;в eax,-1 - 5 ,байтов у нас же только 3 выйти int 0x40 ;далее выполняется выход из программы @@ -57,23 +59,17 @@ draw_window: ; mov ebx,1 ;присвоить 1 int 0x40 - xor eax,eax ;обнулить eax - mov ebx,50*65536+180 ;[координата по оси x]*65536 + [размер по оси x] - mov ecx,30*65536+100 ;[координата по оси y]*65536 + [размер по оси y] - mov edx,0x03AABBCC ;0xXYRRGGBB Y =3 - вывод рамки, используя скрин - mov esi,0x805080DD ;0xXYRRGGBB - цвет заголовка - mov edi,0x005080DD ;0x00RRGGBB - цвет рамки - int 0x40 ;нарисовать окно приложения - - add eax,4 ;если предполагается использовать скалярный процессор, то можно использовать данню инструкцию - mov ebx,8*65536+8 ; [координата по оси x]*65536 + [координата по оси y] mov ecx,0x10DDEEFF ; 0xX0RRGGBB, где RR, GG, BB задают цвет текста - mov edx,hed ; указатель на начало строки - mov esi,i_end - hed ; длина строки, должна быть не больше 255 - int 0x40 ;вывести текст - + xor eax,eax ;обнулить eax + mov ebx,50*65536+180 ;[координата по оси x]*65536 + [размер по оси x] + mov ecx,30*65536+100 ;[координата по оси y]*65536 + [размер по оси y] + mov edx,[sc.work] ; color of work area RRGGBB,8->color gl + or edx,0xb3000000 + mov edi,hed + int 0x40 ;нарисовать окно приложения + draw_check_boxes check_boxes,check_boxes_end ;рисование чекбоксов - add eax,8 ;Функция 12 - начать/закончить перерисовку окна. + mov eax,12 ;Функция 12 - начать/закончить перерисовку окна. mov ebx,2 ;Подфункция 2 - закончить перерисовку окна. int 0x40 ret @@ -84,16 +80,16 @@ draw_window: ; ;Формат данных чек бокса: ;10 - координата чек бокса по х ;30 - координата чек бокса по у -;0xffffff - цвет внутри чек бокса -;0 - цвет рамки чек бокса -;0 - цвет текста надписи +;0 - цвет рамки чек бокса если нужно так используются ситемные цвета +;0 - цвет текста надписи если нужно так используются ситемные цвета ;ch_text.1 - указатель на начало строки ;ch_text.e1-ch_text.1 - длина строки ; +align 16 check_boxes: -ch1 check_box 10,30,0xffffff,0,0,ch_text.1,ch_text.e1-ch_text.1 -ch2 check_box 10,45,0xffffff,0,0,ch_text.2,ch_text.e2-ch_text.2 -ch3 check_box 10,60,0xffffff,0,0,ch_text.3,ch_text.e3-ch_text.3 +ch1 check_box 10,15,ch_text.1,ch_text.e1-ch_text.1,ch_flag_en +ch2 check_box 10,30,ch_text.2,ch_text.e2-ch_text.2 +ch3 check_box 10,45,ch_text.3,ch_text.e3-ch_text.3 check_boxes_end: ch_text: ; Сопровождающий текст для чек боксов @@ -104,5 +100,6 @@ ch_text: ; .3 db 'Check_Box #3' .e3: -hed db 'Checkbox [22.08.2006]' ;заголовок приложения +hed db 'Checkbox [19.02.2007]',0 ;заголовок приложения +sc system_colors i_end: ;конец кода \ No newline at end of file