Subversion Repositories Kolibri OS

Rev

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