Subversion Repositories Kolibri OS

Rev

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