Subversion Repositories Kolibri OS

Rev

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