Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1639 Lrz 1
;Последная модификация 03.10.2010
2
;файл создан 13.02.2009  На код применена GPL2 лицензия
3
;Макрос для системной библиотеки box_lib.obj
4
;Checkbox
5
 
6
macro use_checkbox_draw
7
{
8
check_box_draw:
9
       pusha   ;сохраним все регистры
10
;       mov	edi,dword [esp+36]
11
;	mov 	ebx,ch_left_s
12
;	mov 	ecx,ch_top_s
13
;	mov 	edx,dword ch_border_color
14
;	mov	eax,13
15
;	mcall 	;рисуем рамку
16
	mcall	13,ch_left_s,ch_top_s,ch_border_color
17
 
18
	mov 	edx,dword ch_color
19
	add 	ebx,1 shl 16 - 2
20
	add 	ecx,1 shl 16 - 2
21
	mcall 	;закрашиваем внутренности чекбокса
22
 
23
       test dword ch_flags,2  ;достать значение бита из переменной и поместить в  флаг CF
24
       jz   @f                ;в если CF=1, то выполним следующую процедуру иначе перейти на нижнюю @@
25
       call check_box_draw_ch ;нарисовать включенный чек бокс
26
@@:
27
;----------------------------
28
;расчет куда будет произведен вывод текста
29
;----------------------------
30
        mov 	ebx,ch_left        	;загрузить значение х для чек бокса
31
        add	ebx,dword ch_size
32
        add	ebx,dword ch_text_margin	;добавить размер стороны и расстояние на котором начнется вывод текста
33
        shl	ebx,16				;сдвинем на 16 разрядов в лево (умножим на 65536)
34
        mov	bx,word ch_top			;загрузим значение по y
35
        add	ebx,ch_size
36
        mov	ecx,dword ch_text_color		;загрузим цвет надписи + flags
37
        sub	ebx,7				;добавим значение длины стороны -9+2
38
 
39
        mov	edx,dword ch_text_ptr		;укажем адрес от куда нужно выводить строку
40
        mov	esi,dword ch_text_length
41
        mov	eax,4				;внесем в eax значение вывода надписи на канву
42
        mcall					;Вывод
43
	popa					;восстановить значения регистров из стека
44
	ret 4					;выйдем из процедуры
45
 
46
check_box_clear_ch:                        ;очистка чек бокса
47
        mov   edx,dword ch_color   ;цвет внутри чек бокса
48
        jmp   @f             ;безусловный прыжок на нижнюю метку @@
49
check_box_draw_ch:            ;нарисовать включенный чек бокс
50
        mov   edx,dword ch_border_color        ;загрузить цвет
51
@@:
52
        movzx ebx,word ch_left  ;загрузить координату по х
53
        mov   eax,dword ch_size
54
        mov   di,ax
55
        shr   eax,2
56
        push  ax
57
 
58
        push  ax
59
        add   ebx,eax
60
        shl   ebx,16            ;сдвинем на 16 разрядов в лево (умножим на 65536)
61
        pop   ax
62
        lea   eax,[eax*2]
63
        sub   bp,ax             ;сохраним регистр bx в регистре указателя базы
64
        mov   bx,bp
65
 
66
        movzx ecx,word ch_top ;загрузить координату по у
67
        pop   ax
68
        add   cx,ax
69
        shl   ecx,16          ;сдвинем на 16 разрядов в лево (умножим на 65536)
70
        mov   cx,bp           ;загрузим значения регистра указателя базы в cx
71
        mov   eax,13          ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс
72
        mcall            ;вывод
73
ret                                ;выйти из процедуры
74
}
75
 
76
 
77
macro use_checkbox_mouse
78
{
79
 
80
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
81
;Обработчик mouse
82
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
83
check_box_mouse:      ;обработка мыши
84
pusha
85
        mov     edi,dword [esp+36]
86
        mov     eax,37           ;будем что то делать если у нас что - нить нажато
87
        mov     ebx,2            ;внести в регистр значение 2
88
        mcall             ;проверка не нажал ли пользователь кнопку мышки
89
        test    eax,eax   ;проверка если у нас в eax=0, то установим флаг и выйдем
90
        jnz     @f         ;перейти на нижнюю метку @@
91
        btr     dword ch_flags,2  ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое.
92
        jmp     check_box_mouse_end
93
 
94
@@:
95
        bts  dword ch_flags,2   ;проверка флага т.е. перенос в cf значение бита и установка бита в состояние включено
96
        jc   check_box_mouse_end         ;если CF=1 то перейти  в конец т.е. это выход
97
        mov  esi,dword ch_text_length ;загрузить кол-во символов в текстовой строке
98
        ;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea
99
        lea esi,[eax*3]
100
        shl esi,1
101
;        imul esi,6             ; или можно и так умножить на 6
102
        add  esi,dword ch_text_margin ;добавить 3 - расстояние от чек бокса до надписи
103
 
104
        mov  eax,37             ;получим координаты мышки
105
        mov  ebx,1              ;добавить 1
106
        mcall               ;получить координаты курсора относительно окна
107
 
108
        movzx ebx,word ch_top  ;загрузить в bx значение координаты у
109
        cmp   ax,bx              ;сравнить с с координатой курсора
110
        jl   check_box_mouse_end          ;SF <> OF если меньше
111
        add   ebx,dword ch_size        ;добавить размер
112
        cmp   ax,bx              ;сравнить
113
        jg   check_box_mouse_end          ;ZF = 0 и SF = OF если больше
114
 
115
        shr   eax,16              ;разделим на 65536 или просто сдвинем биты на 16 значений
116
        movzx ebx,word ch_left  ;произведем аналогичное сравнение
117
        cmp   ax,bx            ;сравнить регистры
118
        jl   check_box_mouse_end        ;если меньше
119
        add   ebx,dword ch_size      ;добавить длину стороны прямоугольника
120
        add   ebx,esi          ;Учесть в значении по х еще и длину надписи к чекбоксу
121
        cmp   ax,bx            ;стравнить регистры
122
        jg   check_box_mouse_end        ;если больше
123
 
124
        bts  dword ch_flags,1  ;извлечение значения заданного бита в флаг cf и изменение его значения на 1.
125
        jc   @f                ;CF=1 то перейти на нижнюю @@
126
 
127
        call check_box_draw_ch        ;отобразить включенный чек бокс
128
;        mov   dword [esp+24],1 ;дальнейшая проверка чек боксов бесмыслена, по этому в стек, где располагается ecx поместитм 0
129
        jmp  check_box_mouse_end       ;выйти
130
@@:
131
        btr   word ch_flags,1  ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое.
132
        call check_box_clear_ch         ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона.
133
check_box_mouse_end:
134
popa                                ;восстановить регистры из стека
135
ret  4                              ;выйти
136
}