Subversion Repositories Kolibri OS

Rev

Rev 360 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
144 Lrz 1
;Эффективное программирование в KOLIBRI
2
;Оптимизированный компонент CheckBox (Исходный вариант от Maxxxx32)
3
;Оптимизирован вывод строки, надписи для CheckBox'a + теперь при проверке не ;происходит подсчет кол-ва символов в строке
4
;Оптимизация команд.
5
;22.08.2006 произведена оптимизация команд, приняты во внимание замечания DIAMOND'а.
6
;  - Теплов Алексей  www.test-kolibri.narod.ru
7
 
8
;заголовок приложения
9
use32		; транслятор, использующий 32 разрядных команды
10
    org 0x0		; базовый адрес кода, всегда 0x0
11
    db 'MENUET01'	; идентификатор исполняемого файла (8 байт)
12
    dd 0x1		; версия формата заголовка исполняемого файла
13
    dd start		; адрес, на который система передаёт управление
14
	                ; после загрузки приложения в память
15
    dd i_end		; размер приложения
16
    dd (i_end+0x100) and not 3	; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
17
    dd (i_end+0x100) and not 3	; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
18
    dd 0x0,0x0		; указатель на строку с параметрами.
19
                 ;    если после запуска неравно нулю, приложение было
20
                 ;    запущено с параметрами из командной строки
21
 
22
		 ;    указатель на строку, в которую записан путь,
23
                 ;    откуда запущено приложение
24
 
25
 
26
;------------------
27
	include 'check.inc'	;включить файл check.inc
28
	use_check_box		;используя макросы внести процедуры для рисования чек бокса
29
;Область кода
30
start:				;Точка входа в программу
31
	mov	eax,40		;установить маску для ожидаемых событий
32
	mov 	ebx,0x25        ;система будет реагировать только на сообщение о перерисовке,нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении)
33
        int	0x40
34
red_win:
35
    call draw_window 		;первоначально необходимо нарисовать окно
36
still:				;основной обработчик
37
     mov  eax,10 		;Ожидать события
38
     int  0x40      		;ожидать событие в течение 2 миллисекунд
39
 
40
    cmp al,0x1    ;если изменилось положение окна
41
    jz red_win
42
    cmp al,0x3    ;если нажата кнопка то перейти
43
    jz button
44
     mouse_check_boxes check_boxes,check_boxes_end  ;проверка чек бокса
45
	jmp still    ;если ничего из перечисленного то снова в цикл
46
button:
47
    mov eax,17		;получить идентификатор нажатой клавиши
48
    int 0x40
49
    test ah,ah		;если в ah 0, то перейти на обработчик событий still
50
    jz  still
51
    or eax,-1       ;в eax,-1 - 5 ,байтов у нас же только 3  выйти
52
    int 0x40 ;далее выполняется выход из программы
53
 
54
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
55
draw_window:		;рисование окна приложения
56
    mov eax,12		;в регистр внести значение = 12
57
    mov ebx,1 		;присвоить 1
58
    int 0x40
59
 
60
    xor eax,eax		;обнулить eax
61
    mov ebx,50*65536+180	;[координата по оси x]*65536 + [размер по оси x]
62
    mov ecx,30*65536+100	;[координата по оси y]*65536 + [размер по оси y]
63
    mov edx,0x03AABBCC		;0xXYRRGGBB  Y =3 - вывод рамки, используя скрин
64
    mov esi,0x805080DD		;0xXYRRGGBB - цвет заголовка
65
    mov edi,0x005080DD		;0x00RRGGBB - цвет рамки
66
    int 0x40			;нарисовать окно приложения
67
 
68
    add eax,4  ;если предполагается использовать скалярный процессор, то можно использовать данню инструкцию
69
    mov ebx,8*65536+8		; [координата по оси x]*65536 + [координата по оси y]  mov ecx,0x10DDEEFF		; 0xX0RRGGBB, где RR, GG, BB задают цвет текста
70
    mov edx,hed			; указатель на начало строки
71
    mov esi,i_end - hed	; длина строки, должна быть не больше 255
72
    int 0x40			;вывести текст
73
 
74
	draw_check_boxes check_boxes,check_boxes_end ;рисование чекбоксов
75
 
76
    add eax,8 			;Функция 12 - начать/закончить перерисовку окна.
77
    mov ebx,2			;Подфункция 2 - закончить перерисовку окна.
78
    int 0x40
79
    ret
80
 
81
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
82
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
83
;DATA данные
84
;Формат данных чек бокса:
85
;10 - координата чек бокса по х
86
;30 - координата чек бокса по у
87
;0xffffff - цвет внутри чек бокса
88
;0 - цвет рамки чек бокса
89
;0 - цвет текста надписи
90
;ch_text.1 - указатель на начало строки
91
;ch_text.e1-ch_text.1 - длина строки
92
;
93
check_boxes:
94
ch1 check_box 10,30,0xffffff,0,0,ch_text.1,ch_text.e1-ch_text.1
95
ch2 check_box 10,45,0xffffff,0,0,ch_text.2,ch_text.e2-ch_text.2
96
ch3 check_box 10,60,0xffffff,0,0,ch_text.3,ch_text.e3-ch_text.3
97
check_boxes_end:
98
 
99
ch_text:		; Сопровождающий текст для чек боксов
100
.1 db 'Check_Box #1'
101
.e1:
102
.2 db 'Check_Box #2'
103
.e2:
104
.3 db 'Check_Box #3'
105
.e3:
106
 
107
hed db 'Checkbox [22.08.2006]'	;заголовок приложения
108
i_end:			;конец кода