Subversion Repositories Kolibri OS

Rev

Rev 1214 | 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
6
ch_flag_en=10b
7
 
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] ;гЄ § вҐ«м ­  ­ з «® ⥪бв®ў®© бва®ЄЁ
16
ch_text_length  equ [edi+28]
17
ch_flags equ [edi+32]      ;д« ЈЁ
18
 
19
macro check_boxes_set_sys_color start,end,color_table
20
{
21
ch_left equ [edi]    ;Є®®а¤Ё­ в  ­ з «  аЁб®ў ­Ёп Ї® е
22
ch_top equ [edi+2]   ;Є®®а¤Ё­ в  ­ з «  аЁб®ў ­Ёп Ї® г
23
ch_text_margin equ [edi+4]      ;=4 а ббв®п­ЁҐ ®в Їаאַ㣮«м­ЁЄ  祪 Ў®Єб  ¤® ­ ¤ЇЁбЁ
24
ch_size equ [edi+8]             ;12 а §¬Ґа Єў ¤а в  祪 Ў®Єб 
25
ch_color equ [edi+12]           ;梥⠢­гваЁ checkbox
26
ch_border_color equ [edi+16] ; or [edi+4] ;梥в а ¬ЄЁ checkbox ҐҐ ¬®¦­® § ¤ вм б ¬®бв®п⥫쭮
27
ch_text_color equ   [edi+20];[edi+4]  ;梥в ⥪бв 
28
ch_text_ptr equ [edi+24]    ;гЄ § вҐ«м ­  ­ з «® ⥪бв®ў®© бва®ЄЁ
29
ch_text_length equ [edi+28]
30
ch_flags equ [edi+32]       ;д« ЈЁ
31
 
32
        mov     edi,start
33
        mov     ecx,((end-start)/ch_struc_size)
34
        mov     esi,color_table
35
@@:
36
        push    dword [esi+32]
37
        pop     dword ch_text_color
38
        push    dword [esi+36]
39
        pop     dword ch_border_color
40
        add     edi,ch_struc_size
41
        loop    @b
42
}
43
struc check_box left,top,ch_text_margin,ch_size,color,border_color,text_color,text,ch_text_length,flags
44
{        ;бвагЄвга  Ї а ¬Ґва®ў ¤«п 祪 Ў®Єб 
45
ch_flag_en=10b
46
.left: dw left      ;+0        ;Ї®«®¦Ґ­ЁҐ Ї® е
47
.top: dw top        ;Ї®«®¦Ґ­ЁҐ Ї® г
48
.ch_text_margin:  dd ch_text_margin ;а ббв®п­ЁҐ ®в Їаאַ㣮«м­ЁЄ  祪 Ў®Єб  ¤® ­ ¤ЇЁбЁ
49
.ch_size: dd ch_size ;а §¬Ґа Єў ¤а в  祪 Ў®Єб , ¤«п ЇаЁ¬Ґа  12
50
.color: dd color    ;梥⠢­гвਠ祪Ў®Єб 
51
.border_color: dd border_color ;梥в а ¬ЄЁ
52
.text_color: dd text_color     ;梥⠭ ¤ЇЁбЁ
53
.text: dd text                 ; ¤аҐб ў Є®¤Ґ Їа®Ја ¬¬л Ј¤Ґ а бЇ®«®¦Ґ­ ⥪бв
54
.ch_text_length: dd ch_text_length ;¤«Ё­­  бва®ЄЁ б бЁ¬ў®« ¬Ё
55
.flags: dd flags+0   ; д« ЈЁ
56
}
57
 
1032 Lrz 58
macro use_checkbox_draw
59
{
60
check_box_draw:
61
       pusha   ;сохраним все регистры
62
       mov     edi,dword [esp+36]
63
       mov eax,13
64
       movzx ebx,word ch_left
65
       shl ebx,16
66
       add ebx,ch_size
67
       mov ecx,ch_top
68
       shl ecx,16
69
       add ecx,dword ch_size
70
       mov edx,dword ch_border_color
71
       mcall ;рисуем рамку
72
 
73
       mov edx,dword ch_color
74
       add ebx,1 shl 16 - 2
75
       add ecx,1 shl 16 - 2
76
       mcall ;закрашиваем внутренности чекбокса
77
 
78
       test dword ch_flags,2  ;достать значение бита из переменной и поместить в  флаг CF
79
       jz   @f                ;в если CF=1, то выполним следующую процедуру иначе перейти на нижнюю @@
80
       call check_box_draw_ch  ;нарисовать включенный чек бокс
81
@@:
82
;----------------------------
83
;расчет куда будет произведен вывод текста
84
;----------------------------
85
        movzx ebx,word ch_left        ;загрузить значение х для чек бокса
86
        add   ebx,dword ch_size
87
        add   ebx,dword ch_text_margin;добавить размер стороны и расстояние на котором начнется вывод текста
88
        shl   ebx,16                ;сдвинем на 16 разрядов в лево (умножим на 65536)
89
        mov   bx,word ch_top        ;загрузим значение по y
90
        add   ebx,ch_size
91
        mov   ecx,dword ch_text_color        ;загрузим цвет надписи + flags
92
        sub   ebx,7        ;добавим значение длины стороны -9+2
93
 
94
        mov   edx,dword ch_text_ptr                ;укажем адрес от куда нужно выводить строку
95
        mov   esi,dword ch_text_length
96
        ;внесем в eax значение вывода надписи на канву
97
        mov   eax,4
98
        mcall                  ;Вывод
99
popa                              ;восстановить значения регистров из стека
100
ret 4                             ;выйдем из процедуры
101
 
102
check_box_clear_ch:                        ;очистка чек бокса
103
        mov   edx,dword ch_color   ;цвет внутри чек бокса
104
        jmp   @f             ;безусловный прыжок на нижнюю метку @@
105
check_box_draw_ch:            ;нарисовать включенный чек бокс
106
        mov   edx,dword ch_border_color        ;загрузить цвет
107
@@:
108
        movzx ebx,word ch_left  ;загрузить координату по х
109
        mov   eax,dword ch_size
1099 Lrz 110
        mov   bp,ax
111
        shr   eax,2
1032 Lrz 112
        push  ax
1099 Lrz 113
 
114
        push  ax
115
        add   ebx,eax
1032 Lrz 116
        shl   ebx,16            ;сдвинем на 16 разрядов в лево (умножим на 65536)
1099 Lrz 117
        pop   ax
118
        lea   eax,[eax*2]
119
        sub   bp,ax             ;сохраним регистр bx в регистре указателя базы
120
        mov   bx,bp
1032 Lrz 121
 
122
        movzx ecx,word ch_top ;загрузить координату по у
1099 Lrz 123
        pop   ax
124
        add   cx,ax
1032 Lrz 125
        shl   ecx,16          ;сдвинем на 16 разрядов в лево (умножим на 65536)
126
        mov   cx,bp           ;загрузим значения регистра указателя базы в cx
127
        mov   eax,13          ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс
128
        mcall            ;вывод
129
ret                                ;выйти из процедуры
130
}
131
 
132
 
133
macro use_checkbox_mouse
134
{
135
 
136
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
137
;Обработчик mouse
138
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
139
check_box_mouse:      ;обработка мыши
140
pusha
141
        mov     edi,dword [esp+36]
142
        mov     eax,37           ;будем что то делать если у нас что - нить нажато
143
        mov     ebx,2            ;внести в регистр значение 2
144
        mcall             ;проверка не нажал ли пользователь кнопку мышки
145
        test    eax,eax   ;проверка если у нас в eax=0, то установим флаг и выйдем
146
        jnz     @f         ;перейти на нижнюю метку @@
147
        btr     dword ch_flags,2  ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое.
148
        jmp     check_box_mouse_end
149
 
150
@@:
151
        bts  dword ch_flags,2   ;проверка флага т.е. перенос в cf значение бита и установка бита в состояние включено
152
        jc   check_box_mouse_end         ;если CF=1 то перейти  в конец т.е. это выход
153
        mov  esi,dword ch_text_length ;загрузить кол-во символов в текстовой строке
154
        ;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea
1214 Lrz 155
        lea esi,[eax*3]
156
        shl esi,1
157
;        imul esi,6             ; или можно и так умножить на 6
1032 Lrz 158
        add  esi,dword ch_text_margin ;добавить 3 - расстояние от чек бокса до надписи
159
 
160
        mov  eax,37             ;получим координаты мышки
161
        mov  ebx,1              ;добавить 1
162
        mcall               ;получить координаты курсора относительно окна
163
 
164
        movzx ebx,word ch_top  ;загрузить в bx значение координаты у
165
        cmp   ax,bx              ;сравнить с с координатой курсора
166
        jl   check_box_mouse_end          ;SF <> OF если меньше
167
        add   ebx,dword ch_size        ;добавить размер
168
        cmp   ax,bx              ;сравнить
169
        jg   check_box_mouse_end          ;ZF = 0 и SF = OF если больше
170
 
171
        shr   eax,16              ;разделим на 65536 или просто сдвинем биты на 16 значений
172
        movzx ebx,word ch_left  ;произведем аналогичное сравнение
173
        cmp   ax,bx            ;сравнить регистры
174
        jl   check_box_mouse_end        ;если меньше
175
        add   ebx,dword ch_size      ;добавить длину стороны прямоугольника
176
        add   ebx,esi          ;Учесть в значении по х еще и длину надписи к чекбоксу
177
        cmp   ax,bx            ;стравнить регистры
178
        jg   check_box_mouse_end        ;если больше
179
 
180
        bts  dword ch_flags,1  ;извлечение значения заданного бита в флаг cf и изменение его значения на 1.
181
        jc   @f                ;CF=1 то перейти на нижнюю @@
182
 
183
        call check_box_draw_ch        ;отобразить включенный чек бокс
184
;        mov   dword [esp+24],1 ;дальнейшая проверка чек боксов бесмыслена, по этому в стек, где располагается ecx поместитм 0
185
        jmp  check_box_mouse_end       ;выйти
186
@@:
187
        btr   word ch_flags,1  ;извлечение значения заданного бита в флаг cf и изменение его значения на нулевое.
188
        call check_box_clear_ch         ;выключить чек бокс т.е. на месте закрашенного прямоугольника отобразить цвет фона.
189
check_box_mouse_end:
190
popa                                ;восстановить регистры из стека
191
ret  4                              ;выйти
192
}