Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;ôàéë ñîçäàí 13.02.2009 <Lrz> Íà êîä ïðèìåíåíà 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. }