检查是否在程序集中单击了鼠标右键,然后"取消单击"



我有一个相对简单的TASM程序,需要使用鼠标左键绘制,显示光标坐标并在鼠标右键单击时更改颜色。问题是,如果你按住这个按钮,它会跳过一些颜色。所以我需要检测我们是否点击了鼠标然后又取消了点击。尝试添加一个功能来检查此行为,但右键单击它会崩溃程序或仅制作1像素或根本不做任何事情。我现在正在处理的代码是这个

.model small
.stack 256
.data
.386
stat db ?
col  dw ?
row  dw ?
color db 3
flag db 1
rezult db '000$'
mult10 db 10
mesx db 'x =$'
mesy db 'y =$'
mes_er db 'мышь не установлена',13,10,'$'
mes    db 'пpогpамма завеpшена',13,10,'$'
mask_m dw 16 dup(0ffffh)
dw 07c0h,0c60h,1830h,3018h
dw 6ccch,6ccch,600ch,600ch
dw 644ch,3398h,1860h,0c60h
dw 07c0h,0000h,0000h,0000h
.code
cursor_on proc near
mov ax,01
int 33h
ret
cursor_on endp
cursor_off proc near
mov ax,2
int 33h
ret
cursor_off endp
mouse_stat proc near
mov ax,3
int 33h
ret
mouse_stat endp
pixel   proc near
call cursor_off
mov ah,0Ch
mov al,color
mov bh,0
int 10h
call cursor_on
ret
pixel   endp
speed proc near
mov ax,000fh
mov cx,64
mov dx,64
int 33h
mov ax,0013h
mov dx,64
int 33h
ret
speed endp
text_curc proc near
mov ax,000AH
mov bx,01
int 33h
ret
text_curc endp
write   proc near
mov bx,3
cicle:
idiv mult10
add ah,30h
mov [si+bx-1],ah
mov ah,0
dec bx
jnz cicle
mov ah,09
mov dx,offset rezult
int 21h
ret
write   endp
go:  mov ax,@data
mov ds,ax
mov ax,0
int 33h
cmp ax,0
jne ner
jmp er
ner:
mov ax,10h
int 10h
mov ax,9
xor bx,bx
xor cx,cx
push ds
pop es
lea dx,mask_m
int 33h
call speed
call cursor_on
call mouse_stat
mov col,cx
mov row,dx
mov ah,02
mov bh,00
mov dx,0000h
int 10h
mov ah,9
lea dx,mesx
int 21h  
mov ah,02
mov bh,00
mov dx,0009h
int 10h
mov ah,9
lea dx,mesy
int 21h  
next:
mov ah,02
mov bh,00
mov dx,0004h
int 10h
mov ax,col
lea si,rezult
call write
mov ah,02
mov bh,0
mov dx,000Dh
int 10h
mov ax,row
call write
mov dx,row
mov cx,col
mov ah,1
int 16h
jz nosym    
mov ah,0
int 16h
cmp al,27
je ex

mov ah,1
int 16h
cmp al,32
je nextc
nosym:
mov flag,0
call mouse_stat
mov stat,bl
cmp col,cx
je  rov_lab
mov col, cx
mov flag ,1
rov_lab:
cmp row,dx
je pix
mov row ,dx
mov flag,1
pix:
mov bl,stat
and bl,2
cmp bl,2
;je nextc is what was in the original program instead of 'je check'
je check
mov bl,stat
and bl,1
cmp bl,1
jne next
cmp flag,0
je next
call pixel
jmp next
check: ; tried to write it myself but it doesn't work the way it needs to
mov ax, 06h
mov bx, 01h
int 33h
cmp ax, 02h
je nextc

ex:
call cursor_off
lea dx,mes
jmp exit
nextc:
inc color
jmp next
er:
lea dx,mes_er
exit:
mov ax,3
int 10h
mov ah,9
int 21h
mov ax,4c00h
int 21h
End go

鼠标右键更改颜色。问题是,如果你按住按钮,它会跳过一些颜色。

当程序检测到鼠标右键时,您可以通过运行一个紧循环开始,该循环在鼠标右键不再按下时立即停止。然后旋转颜色并继续主程序循环。

mouseNextColor:
call mouse_stat     ; -> BX CX DX
test bl, 2
jnz  mouseNextColor ; Right button is still down
inc  color
jmp  next

mov ah,1
int 16h
jz nosym 
mov ah,0
int 16h       ; -> AX
cmp al,27
je ex
mov ah,1        <<<< ???
int 16h         <<<< ???
cmp al,32
je nextc
nosym:

显然,您还希望能够在用户按空格键时旋转颜色。你应该删除我上面标记的两行。键盘函数00h已经检索到键,由于程序运行得如此之快,不太可能有第二个键可用。第二次使用键盘函数01h将返回ZF=1,但它也可能破坏AL,这将使比较32变得毫无意义。

mov  ah, 01h
int  16h            ; -> AX ZF
jz   nosym    
mov  ah, 00h
int  16h            ; -> AX
cmp  al, 27         ; <ESC>
je   ex
cmp  al, 32         ; <SPC>
je   keybNextColor
nosym:
...
pix:
test stat, 2        ; Right button ?
jnz  mouseNextColor ; Yes
test stat, 1        ; Left button ?
jz   next           ; No
cmp  flag, 0
je   next
call pixel
jmp  next
ex:
call cursor_off
lea  dx,mes
jmp  exit
mouseNextColor:
call mouse_stat     ; -> BX CX DX
test bl, 2
jnz  mouseNextColor ; Right button is still down
keybNextColor:
inc  color
jmp  next

最新更新