Subversion Repositories Kolibri OS

Rev

Rev 1373 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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