;Оптимизированный компонент CheckBox (Исходный вариант от Maxxxx32)
;Оптимизирован вывод строки, надписи для CheckBox'a + теперь при проверке не ;происходит подсчет кол-ва символов в строке
;Оптимизация команд.
;21.02.2007 модернизация и поддержка двух разных вариантов с использованием сис цветов и старой схемой
;19.02.2007 общее улучшение кода, уменьшение размера и использование системных цветов для отображения checkbox
;22.08.2006 произведена оптимизация команд, приняты во внимание замечания DIAMOND'а.
;<Lrz>  - Теплов Алексей  www.lrz.land.ru

;заголовок приложения
use32                ; транслятор, использующий 32 разрядных команды
    org 0x0                ; базовый адрес кода, всегда 0x0
    db 'MENUET01'        ; идентификатор исполняемого файла (8 байт)
    dd 0x1                ; версия формата заголовка исполняемого файла
    dd start                ; адрес, на который система передаёт управление
                        ; после загрузки приложения в память
    dd i_end                ; размер приложения
    dd (i_end+0x100) and not 3        ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
    dd (i_end+0x100) and not 3        ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
    dd 0x0,0x0                ; указатель на строку с параметрами.
                 ;    если после запуска неравно нулю, приложение было
                 ;    запущено с параметрами из командной строки

                 ;    указатель на строку, в которую записан путь,
                 ;    откуда запущено приложение
;------------------
        include '..\..\..\..\macros.inc'
        include 'check.inc'     ;включить файл check.inc
;        version_ch             ;необходимый макрос для включения "старой" версии check_box
        version_ch1             ;необходимый макрос для включения new версии check_box1
;Недопустимо включение двух макросво version_ch1 и version_ch - они взамоисключают друг- дргуга.
        use_check_box           ;используя макросы внести процедуры для рисования чек бокса
;Область кода
align 4
start:                          ;Точка входа в программу
        mov  eax,48             ;получить системные цвета
        mov  ebx,3
        mov  ecx,sc
        mov  edx,sizeof.system_colors
        mcall

        mov  eax,40          ;установить маску для ожидаемых событий
        mov  ebx,0x25        ;система будет реагировать только на сообщение о перерисовке,нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении)
        mcall
red_win:
        call draw_window     ;первоначально необходимо нарисовать окно
still:                       ;основной обработчик 
        mov  eax,10          ;Ожидать события
        mcall            ;ожидать событие в течение 2 миллисекунд
  
        cmp al,0x1    ;если изменилось положение окна
        jz  red_win
        cmp al,0x3    ;если нажата кнопка то перейти
        jz  button
     mouse_check_boxes check_boxes,check_boxes_end  ;проверка чек бокса      
        jmp still    ;если ничего из перечисленного то снова в цикл
button:
         or eax,-1       ;в eax,-1 - 5 ,байтов у нас же только 3  выйти 
         mcall ;далее выполняется выход из программы

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
draw_window:                ;рисование окна приложения
    mov eax,12                ;в регистр внести значение = 12
    mov ebx,1                 ;присвоить 1
    mcall

    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
    mcall                 ;нарисовать окно приложения
       
        draw_check_boxes check_boxes,check_boxes_end ;рисование чекбоксов

    mov eax,12                ;Функция 12 - начать/закончить перерисовку окна.
    mov ebx,2                 ;Подфункция 2 - закончить перерисовку окна.
    mcall
    ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;DATA данные 
;Формат данных чек бокса:
;10 - координата чек бокса по х 
;30 - координата чек бокса по у
;0 - цвет заливки внутри чек бокса
;0xfffffff - цвет рамки чек бокса если нужно так используются ситемные цвета
;0 - цвет текста надписи  если нужно так используются ситемные цвета
;ch_text.1 - указатель на начало строки
;ch_text.e1-ch_text.1 - длина строки
;
align 4
check_boxes:
;ch1 check_box 10,15,0xffffff,0,0,ch_text.1,ch_text.e1-ch_text.1,ch_flag_en
;ch2 check_box 10,30,0xffffff,0,0,ch_text.2,ch_text.e2-ch_text.2
;ch3 check_box 10,45,0xffffff,0,0,ch_text.3,ch_text.e3-ch_text.3

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;DATA данные  для check_box1 - использует системные цвета
;Формат данных чек бокса:
;10 - координата чек бокса по х 
;30 - координата чек бокса по у
;ch_text.1 - указатель на начало строки
;ch_text.e1-ch_text.1 - длина строки

;
ch1 check_box1 10,15,ch_text.1,ch_text.e1-ch_text.1,ch_flag_en
ch2 check_box1 10,30,ch_text.2,ch_text.e2-ch_text.2
ch3 check_box1 10,45,ch_text.3,ch_text.e3-ch_text.3
check_boxes_end:

ch_text:        ;сопровождающий текст для чек боксов
.1 db 'Check_Box #1' 
.e1:
.2 db 'Check_Box #2'
.e2:
.3 db 'Check_Box #3'
.e3:

hed db 'Checkbox [21.02.2007]',0        ;заголовок приложения
sc     system_colors
i_end:                ;конец кода