3,16 → 3,35 |
;Ìàêðîñ äëÿ ñèñòåìíîé áèáëèîòåêè box_lib.obj |
;Checkbox |
|
;Èíèöèàëèçàöèÿ checkbox |
macro _init_checkbox |
{ |
init_checkbox: |
;ïîäñ÷èòàåì êîë-âî ñèìâîëîâ â äëèííå âûâîäèìîé ñòðîêè. |
pushad |
mov ebp,dword [esp+36] ;çàãðóæàåì óêàçàòåëü íà ñòðóêòóðó, óêàçàòåëü ìû ïåðåäàåì â ñòåêå |
mov ebx,dword ch_text_margin ;eax=0 |
mov esi,dword ch_text_ptr ;óêàçàòåëü íà ñòðî÷êó |
lodsb ;â al ïåðâûé ñèìâîë èç ñòðîêè |
test al,al |
jz .ex_loop |
@@: |
add ebx,6 ;øèðèíà ñèìâîëà |
lodsb |
test al,al |
jnz @b |
.ex_loop: |
|
mov dword ch_sz_str,ebx ;çàïèøèì äëèííó ñòðîêè ñ ó÷åòîì îòñòóïà îò êâàäðàòèêà |
popad |
ret 4 |
} |
|
macro use_checkbox_draw |
{ |
check_box_draw: |
pushad ;ñîõðàíèì âñå ðåãèñòðû |
mov ebp,dword [esp+36] ;çàãðóæàåì óêàçàòåëü íà ñòðóêòóðó, óêàçàòåëü ìû ïåðåäàåì â ñòåêå |
; mov ebx,ch_left_s |
; mov ecx,ch_top_s |
; mov edx,dword ch_border_color |
; mov eax,13 |
; mcall ;ðèñóåì ðàìêó |
mcall 13,ch_left_s,ch_top_s,ch_border_color ;ðèñóåì ðàìêó ÷åê áîêñà, ôàêòè÷åñêè ðèñóåì ïðÿìîóãîëüíèê è çàêðàøèâàåì ôîí âíóòðè öâåòîì ðàìêè áîêñà |
|
mov edx,dword ch_color ;çàãðóæàåì öâåò ôîíà |
33,24 → 52,24 |
; add ebx,dword ch_left_s ;cêîððåêòèðóåì ïîçèöèþ Õ. Ò.å. ñåé÷àñ â âåðõíåé ÷àñòè ebx ó íàñ òî÷êà íà÷àëà âûâîäà òåêñòà ïî Õ |
|
; mov eax,word ch_top_s ;çàãðóçèì çíà÷åíèå ïî (y shl 16 + äëèííà) äëÿ ÷åê áîêñà |
; shl eax,16 ;ñäâèíåì íà 16 ðàçðÿäîâ â ëåâî (óìíîæèì íà 65536) |
; shr eax,16 ;ñäâèíåì íà 16 ðàçðÿäîâ â ëåâî (óìíîæèì íà 65536) |
; add eax,dword ch_top_s ;cêîððåêòèðóåì ïîçèöèþ Õ. Ò.å. ñåé÷àñ â âåðõíåé ÷àñòè ebx ó íàñ òî÷êà íà÷àëà âûâîäà òåêñòà ïî Y |
|
; Îïòèìèçàöèÿ äëÿ ÖÏ |
mov ebx,dword ch_left_s ;çàãðóçèòü çíà÷åíèå (õ shl 16 + äëèííà) äëÿ ÷åê áîêñà |
mov eax,dword ch_top_s ;çàãðóçèì çíà÷åíèå ïî (y shl 16 + äëèííà) äëÿ ÷åê áîêñà |
add ebx,dword ch_text_margin ;äîáàâèì ðàçìåð ñòîðîíû è ðàññòîÿíèå íà êîòîðîì íà÷íåòñÿ âûâîä òåêñòà |
shl eax,16 ;ñäâèíåì íà 16 ðàçðÿäîâ â ëåâî (óìíîæèì íà 65536) |
shl ebx,16 ;ñäâèíåì íà 16 ðàçðÿäîâ â ëåâî (óìíîæèì íà 65536) |
add eax,dword ch_top_s ;cêîððåêòèðóåì ïîçèöèþ Õ. Ò.å. ñåé÷àñ â âåðõíåé ÷àñòè ebx ó íàñ òî÷êà íà÷àëà âûâîäà òåêñòà ïî Y |
add ebx,dword ch_left_s ;cêîððåêòèðóåì ïîçèöèþ Õ. Ò.å. ñåé÷àñ â âåðõíåé ÷àñòè ebx ó íàñ òî÷êà íà÷àëà âûâîäà òåêñòà ïî Õ |
shr eax,16 ;äëÿ y ïîìåñòèì â ìëàäøóþ ÷àñòü |
mov bx,ax ;âíåñåì ñìåùåíèå äëÿ y |
mov eax,dword ch_top_s ;çàãðóçèì çíà÷åíèå ïî (y shl 16 + äëèííà) äëÿ ÷åê áîêñà |
add ebx,dword ch_text_margin ;äîáàâèì ðàçìåð ñòîðîíû è ðàññòîÿíèå íà êîòîðîì íà÷íåòñÿ âûâîä òåêñòà |
shr eax,16 ;ñäâèíåì íà 16 ðàçðÿäîâ â ëåâî (óìíîæèì íà 65536) |
shl ebx,16 ;ñäâèíåì íà 16 ðàçðÿäîâ â ëåâî (óìíîæèì íà 65536) |
add eax,dword ch_top_s ;cêîððåêòèðóåì ïîçèöèþ Õ. Ò.å. ñåé÷àñ â âåðõíåé ÷àñòè ebx ó íàñ òî÷êà íà÷àëà âûâîäà òåêñòà ïî Y |
add ebx,dword ch_left_s ;cêîððåêòèðóåì ïîçèöèþ Õ. Ò.å. ñåé÷àñ â âåðõíåé ÷àñòè ebx ó íàñ òî÷êà íà÷àëà âûâîäà òåêñòà ïî Õ |
sub ax,7 ;âíåñåì ñìåùåíèå äëÿ y |
mov bx,ax |
;ebx õ shl 16 +y êîîðäèíàòû âûâîäà ñòðî÷êè |
|
mov ecx,dword ch_text_color ;çàãðóçèì öâåò íàäïèñè + flags |
mov edx,dword ch_text_ptr ;óêàæåì àäðåñ îò êóäà íóæíî âûâîäèòü ñòðîêó |
mov eax,4 ;âíåñåì â eax çíà÷åíèå âûâîäà íàäïèñè íà êàíâó |
mcall ;Âûâîä |
mcall 4 ;Âûâîä |
popad ;âîññòàíîâèòü çíà÷åíèÿ ðåãèñòðîâ èç ñòåêà |
ret 4 ;âûéäåì èç ïðîöåäóðû è óäàëèì èç ñòåêà óêàçàòåëü íà ñòðóêòóðó (4 áàéòà) |
|
60,33 → 79,12 |
check_box_draw_ch: ;íàðèñîâàòü âêëþ÷åííûé ÷åê áîêñ |
mov edx,dword ch_border_color ;çàãðóçèòü öâåò |
@@: |
; movzx ebx,word ch_left ;çàãðóçèòü êîîðäèíàòó ïî õ |
; mov eax,dword ch_size |
; mov di,ax |
; shr eax,2 |
; push ax |
; |
; push ax |
; add ebx,eax |
; shl ebx,16 ;ñäâèíåì íà 16 ðàçðÿäîâ â ëåâî (óìíîæèì íà 65536) |
; pop ax |
; lea eax,[eax*2] |
; sub bp,ax ;ñîõðàíèì ðåãèñòð bx â ðåãèñòðå óêàçàòåëÿ áàçû |
; mov bx,bp |
|
; movzx ecx,word ch_top ;çàãðóçèòü êîîðäèíàòó ïî ó |
; pop ax |
; add cx,ax |
; shl ecx,16 ;ñäâèíåì íà 16 ðàçðÿäîâ â ëåâî (óìíîæèì íà 65536) |
; mov cx,bp ;çàãðóçèì çíà÷åíèÿ ðåãèñòðà óêàçàòåëÿ áàçû â cx |
; mov eax,13 ;â eax - çíà÷åíèÿ ôóíêöèè äëÿ âûâîäà ïîëîñû ò.å. ïî ñóòè ïðÿìîóãîëüíèêà, êîòîðûé îòîáðàæàåò âêëþ÷åííûé êîìïîíåíò ÷åê áîêñ |
; mcall ;âûâîä |
|
mov ebx,dword ch_left_s |
mov ecx,dword ch_top_s |
add ebx,1 shl 16 - 4 |
add ecx,1 shl 16 - 4 |
mcall 13 |
;Îòîáðàçèòü âêëþ÷åíûé checkbox |
mov ebx,dword ch_left_s ;çàãðóæàåì õ shl 16 + äëèííà ïî Õ |
mov ecx,dword ch_top_s ;çàãðóæàåì Y shl 16 + äëèííà ïî Y |
add ebx,2 shl 16 - 4 ;ïîñëå ýòèõ èçìåíåíèé (X+2) shl 16 +äëèííà ïî (Õ-2) |
add ecx,2 shl 16 - 4 ;ïîñëå ýòèõ èçìåíåíèé (Y+2) shl 16 +äëèííà ïî (Y-2) |
mcall 13 ;îòîáðàçèòü êâàäðàò âíóòðè checkbox |
ret |
} |
|
96,16 → 94,14 |
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;Îáðàáîò÷èê mouse |
; Ïðè ïîïàäàíèè ìûøêè + íàæàòà êëàâèøà â îáëàñòü checkbox ñîñòîÿíèå áîêñà äîëæíî ìåíÿòñÿ àêòèâíûé - íå àêòèâíûé. |
;Ïðè ïîïàäàíèè ìûøêè + íàæàòà êëàâèøà â îáëàñòü checkbox ñîñòîÿíèå áîêñà äîëæíî ìåíÿòñÿ àêòèâíûé - íå àêòèâíûé. |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
check_box_mouse: ;îáðàáîòêà ìûøè |
pushad |
mov ebp,dword [esp+36] ;çàãðóæàåì óêàçàòåëü íà ñòðóêòóðó, óêàçàòåëü ìû ïåðåäàåì â ñòåêå |
mcall 37,2 ;ïðîâåðÿåì ñîñòîÿíèå êëàâèø ìûøêè. Áûëî ëè ñîáûòèå íàæàòàÿ êëàâèøà íà ìûøêå. |
test eax,eax ;ïðîâåðêà åñëè ó íàñ â eax=0, òî óñòàíîâèì ôëàã è âûéäåì |
jnz @f ;ïåðåéòè íà íèæíþþ ìåòêó @@, åñëè â eax íå 0. |
; and dword ch_flags,eax ;èçâëå÷åíèå çíà÷åíèÿ çàäàííîãî áèòà â ôëàã cf è èçìåíåíèå åãî çíà÷åíèÿ íà íóëåâîå. |
jmp .check_box_mouse_end ;îáðàáîòêà çàêîí÷èëàñü |
test eax,eax ;ïðîâåðêà åñëè ó íàñ â eax=0, âûéäåì |
jz .check_box_mouse_end ;îáðàáîòêà çàêîí÷èëàñü |
; Äà ñîáûòèå: íàæàòèå êëàâèøè ìûøêè ïðîèçîøëî. |
@@: |
mcall 37,1 ;ïîëó÷èòü êîîðäèíàòû êóðñîðà îòíîñèòåëüíî îêíà |
120,6 → 116,8 |
add cx,bx ;ñëîæèì äëèííó ïî y è êîîðäèíàòó âåðõíåé òî÷êè ïî y ïîëè÷èì êîîðäèíàòó íèæíåé òî÷êè ïî Y |
cmp ax,cx |
ja .check_box_mouse_end ;óêàçàòåëü ìûøêè áîëüøå êîíå÷íîé êîîðäèíàòû ïî y ÷åì êîîðäèíàòà ïî Y ó áîêñà |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
shr eax,16 ;ñìåñòèì êîîðäèíàòó ïî Õ â íèæíóþ ÷àñòü ðåãèñòðà ò.å. â ax |
;ñðàâíåíèå ïî íà÷àëüíîé òî÷êå Õ |
mov ecx,dword ch_left_s ;çàãðóçèòü çíà÷åíèå (õ shl 16 + äëèííà) äëÿ ÷åê áîêñà |
mov ebx,ecx |
127,74 → 125,19 |
cmp ax,bx |
jb .check_box_mouse_end ;óêàçàòåëü ìûøêè ìåíüøå íà÷àëüíîé êîîðäèíàòû ïî X ÷åì êîîðäèíàòà ïî X ó áîêñà |
;ñðàâíåíèå êîíå÷íîé òî÷êè ïî X |
add bx,cx ;ñëîæèì äëèííó ïî y è êîîðäèíàòó âåðõíåé òî÷êè ïî y ïîëè÷èì êîîðäèíàòó íèæíåé òî÷êè ïî Y |
add ebx,dword ch_text_margin ;äîáàâèì ðàçìåð ñòîðîíû è ðàññòîÿíèå íà êîòîðîì íà÷íåòñÿ âûâîä òåêñòà |
mov ecx,dword ch_text_ptr ;óêàæåì àäðåñ ñòðîêè ñ òåðìèíèðóåùèì 0 |
push eax |
|
;ïîäñ÷åò äëèííû ñòðîêè è óâåëè÷åíèå ïðÿìîãîëüíèêà â êîòîðîì ñðàáàòûâàåò ùåë÷îê ìûøêè |
lodsb |
test al,al |
jz .ex_loop |
@@: |
add bx,6 ;øèðèíà ñèìâîëà |
lodsb |
test al,al |
jnz @b |
.ex_loop: |
pop eax |
add bx,cx ;ñëîæèì äëèííó ïî x è êîîðäèíàòó òî÷êè ïî õ ïîëó÷èì êîîðäèíàòó êîíå÷íîé òî÷êè ïî Õ |
add bx,word ch_sz_str ;äîáàâèì äëèííó ñòðîêè òåêñòà ñ îòñòóïîì ïðåäâàðòèåëüíî çàïèñàâ èõ â ìîìåíò èíèöèàëèçàöèè |
cmp ax,bx |
ja .check_box_mouse_end ;óêàçàòåëü ìûøêè áîëüøå êîíå÷íîé êîîðäèíàòû ïî y ÷åì êîîðäèíàòà ïî Y ó áîêñà |
ja .check_box_mouse_end ;óêàçàòåëü ìûøêè áîëüøå êîíå÷íîé êîîðäèíàòû ïî õ ÷åì êîîðäèíàòà ïî Õ ó áîêñà |
;åñëè âñå ïðîâåðêè áûëè óñïåøíî ïðîéäåíû ìû îáÿçàíû ïîìåíÿòü ñîñòîÿíèå áîêñà |
btc dword ch_flags,2 ;ïåðåíîñ 2-ãî áèòà â cf è èíâåðñèÿ åãî |
jc .enable_box ;åñëè CF=1 òî îòîáðàçèì âêëþ÷åííûé áîêñ è âûéäåì |
push dword .check_box_mouse_end ;ôîêóñ -ïîêóñ, âåðíåìñÿ ïîñëå âûçîâà check_box_clear_ch íà ìåòêó check_box_mouse_end |
jmp check_box_clear_ch ;âûêëþ÷èòü ÷åê áîêñ ò.å. íà ìåñòå çàêðàøåííîãî ïðÿìîóãîëüíèêà îòîáðàçèòü öâåò ôîíà. |
jmp check_box_clear_ch ;âûêëþ÷èòü ÷åê áîêñ ò.å. íà ìåñòå çàêðàøåííîãî ïðÿìîóãîëüíèêà îòîáðàçèòü öâåò ôîíà. |
|
.enable_box: |
call check_box_draw_ch ;îòîáðàçèòü âêëþ÷åííûé ÷åê áîêñ |
|
|
|
; bts dword ch_flags,2 ;ïðîâåðêà ôëàãà ò.å. ïåðåíîñ â cf çíà÷åíèå áèòà è óñòàíîâêà áèòà â ñîñòîÿíèå âêëþ÷åíî |
; jc check_box_mouse_end ;åñëè CF=1 òî ïåðåéòè â êîíåö ò.å. ýòî âûõîä |
; mov esi,dword ch_text_length ;çàãðóçèòü êîë-âî ñèìâîëîâ â òåêñòîâîé ñòðîêå |
;Óìíîæåíèå íà 6 Áûñòðîå óìíîæåíèå ìîæíî âîñïîëüçîâàòüñÿ ëþáûì ìç ìåòîäîâ, íî íà ñòàðûõ Ïðîöåññîðàõ (386,486,P1)áûñòðåå áóäåò ñ èíñòðóêöèåé Lea |
; lea esi,[eax*3] |
; shl esi,1 |
; imul esi,6 ; èëè ìîæíî è òàê óìíîæèòü íà 6 |
; add esi,dword ch_text_margin ;äîáàâèòü 3 - ðàññòîÿíèå îò ÷åê áîêñà äî íàäïèñè |
|
; mov eax,37 ;ïîëó÷èì êîîðäèíàòû ìûøêè |
; mov ebx,1 ;äîáàâèòü 1 |
; mcall ;ïîëó÷èòü êîîðäèíàòû êóðñîðà îòíîñèòåëüíî îêíà |
|
; movzx ebx,word ch_top ;çàãðóçèòü â bx çíà÷åíèå êîîðäèíàòû ó |
; cmp ax,bx ;ñðàâíèòü ñ ñ êîîðäèíàòîé êóðñîðà |
; jl check_box_mouse_end ;SF <> OF åñëè ìåíüøå |
; add ebx,dword ch_size ;äîáàâèòü ðàçìåð |
; cmp ax,bx ;ñðàâíèòü |
; jg check_box_mouse_end ;ZF = 0 è SF = OF åñëè áîëüøå |
|
; shr eax,16 ;ðàçäåëèì íà 65536 èëè ïðîñòî ñäâèíåì áèòû íà 16 çíà÷åíèé |
; movzx ebx,word ch_left ;ïðîèçâåäåì àíàëîãè÷íîå ñðàâíåíèå |
; cmp ax,bx ;ñðàâíèòü ðåãèñòðû |
; jl check_box_mouse_end ;åñëè ìåíüøå |
; add ebx,dword ch_size ;äîáàâèòü äëèíó ñòîðîíû ïðÿìîóãîëüíèêà |
; add ebx,esi ;Ó÷åñòü â çíà÷åíèè ïî õ åùå è äëèíó íàäïèñè ê ÷åêáîêñó |
; cmp ax,bx ;ñòðàâíèòü ðåãèñòðû |
; jg check_box_mouse_end ;åñëè áîëüøå |
|
; bts dword ch_flags,1 ;èçâëå÷åíèå çíà÷åíèÿ çàäàííîãî áèòà â ôëàã cf è èçìåíåíèå åãî çíà÷åíèÿ íà 1. |
; jc @f ;CF=1 òî ïåðåéòè íà íèæíþþ @@ |
|
; call check_box_draw_ch ;îòîáðàçèòü âêëþ÷åííûé ÷åê áîêñ |
; mov dword [esp+24],1 ;äàëüíåéøàÿ ïðîâåðêà ÷åê áîêñîâ áåñìûñëåíà, ïî ýòîìó â ñòåê, ãäå ðàñïîëàãàåòñÿ ecx ïîìåñòèòì 0 |
; jmp check_box_mouse_end ;âûéòè |
;@@: |
; btr word ch_flags,1 ;èçâëå÷åíèå çíà÷åíèÿ çàäàííîãî áèòà â ôëàã cf è èçìåíåíèå åãî çíà÷åíèÿ íà íóëåâîå. |
; call check_box_clear_ch ;âûêëþ÷èòü ÷åê áîêñ ò.å. íà ìåñòå çàêðàøåííîãî ïðÿìîóãîëüíèêà îòîáðàçèòü öâåò ôîíà. |
call check_box_draw_ch ;îòîáðàçèòü âêëþ÷åííûé ÷åê áîêñ |
.check_box_mouse_end: |
popad ;âîññòàíîâèòü ðåãèñòðû èç ñòåêà |
ret 4 ;âûéòè |
popad ;âîññòàíîâèòü ðåãèñòðû èç ñòåêà |
ret 4 ;âûéòè è âîññòàíîâèì ñòåê |
} |