我有一个相对简单的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
1条答案
按热度按时间aamkag611#
并在鼠标右键单击时改变颜色。问题是如果你按住按钮,它会跳过一些颜色。
当程序检测到鼠标右键点击时,你可以开始运行一个紧循环,只要鼠标右键不再被按下就停止。然后旋转颜色并继续主程序循环。
第一个
显然,你还想在用户按空格键时旋转颜色。你应该删除上面我标记的两行。键盘函数00h已经检索到了键,并且由于程序运行得太快,不太可能有第二个键可用。第二次使用键盘函数01h将返回ZF=1,但它也可能破坏AL,这将使与32的比较毫无意义。