回 帖 发 新 帖 刷新版面

主题:[原创]鼠标的常用函数及过程(图形方式下)

这是改良后的鼠标函数及过程,如果什么BUG或者你想再加什么功能,请在这里回应.

说明:
启动QB时请使用 /l 参数启动
调用时在FILE菜单下先Load....选项装入mouse.bas文件
把文件前面的声明COPY到mouse.bi文件里面(包括类型定义)
在程序开头写上:  
'$include: 'mouse.bi'
这样在程序任何位置都可以调用mouse.bas中的函数和过程了

以下是源代码:

'================================================================
'以下是声明部分
'================================================================
DECLARE FUNCTION MouseDownL% ()
DECLARE FUNCTION MouseDownR% ()
DECLARE FUNCTION MouseX% ()
DECLARE FUNCTION MouseY% ()
DECLARE FUNCTION MouseDownLX% ()
DECLARE FUNCTION MouseDownLY% ()
DECLARE FUNCTION MouseDownRX% ()
DECLARE FUNCTION MouseDownRY% ()
DECLARE FUNCTION MouseUpLX% ()
DECLARE FUNCTION MouseUpLY% ()
DECLARE FUNCTION MouseUpRX% ()
DECLARE FUNCTION MouseUpRY% ()
DECLARE FUNCTION MouseIsMove% ()
DECLARE FUNCTION MouseType$ ()
DECLARE FUNCTION MousePort$ ()
DECLARE FUNCTION MouseGetHandLR% ()
DECLARE FUNCTION MouseRClick% ()
DECLARE FUNCTION MouseLClick% ()
DECLARE SUB MouseBorder (x1%, y1%, x2%, Y2%)
DECLARE SUB MouseSetHandLR (LR%)
DECLARE SUB MouseSetXY (X%, Y%)
DECLARE SUB MouseInt (ax%, bx%, cx%, dx%)
DECLARE SUB MouseShow ()
DECLARE SUB MouseHide ()
TYPE RegTypeX
     ax    AS INTEGER
     bx    AS INTEGER
     cx    AS INTEGER
     dx    AS INTEGER
     bp    AS INTEGER
     si    AS INTEGER
     di    AS INTEGER
     flags AS INTEGER
     ds    AS INTEGER
     es    AS INTEGER
END TYPE
DECLARE SUB InterruptX (IntNober%, regs AS RegTypeX, regs AS RegTypeX)

回复列表 (共1个回复)

沙发

'设置鼠标的移动范围
SUB MouseBorder (x1%, y1%, x2%, Y2%)
    MouseInt 7, 0, x1%, x2%
    MouseInt 8, 0, y1%, Y2%
END SUB

'返回是否按下左按钮
FUNCTION MouseDownL%
    MouseInt 3, Button%, 0, 0
    IF Button% AND 1 THEN MouseDownL% = -1
END FUNCTION
'返回最后按下左按钮时的X坐标
FUNCTION MouseDownLX%
    MouseInt 5, 0, X%, 0
    MouseDownLX% = X%
END FUNCTION
'返回最后按下左按钮时的Y坐标
FUNCTION MouseDownLY%
    MouseInt 5, 0, 0, Y%
    MouseDownLY% = Y%
END FUNCTION
''返回是否按下右按钮
FUNCTION MouseDownR%
    MouseInt 3, Button%, 0, 0
    IF Button% AND 2 THEN MouseDownR% = -1
END FUNCTION
'返回最后按下右按钮时的X坐标
FUNCTION MouseDownRX%
    MouseInt 5, 1, X%, 0
    MouseDownRX% = X%
END FUNCTION
'返回最后按下右按钮时的Y坐标
FUNCTION MouseDownRY%
    MouseInt 5, 1, 0, Y%
    MouseDownRY% = Y%
END FUNCTION
'获取鼠标习惯是右手还是左手 0左 255右
FUNCTION MouseGetHandLR%
    MouseInt &H216C, LR%, 0, 0
    MouseGetHandLR% = LR%
END FUNCTION
'隐藏鼠标光标
SUB MouseHide
    MouseInt 2, 0, 0, 0
END SUB
'鼠标中断,此过程可以测试鼠标是否有安装,调用返回时 ax=0 未安装 255已安装
SUB MouseInt (ax%, bx%, cx%, dx%) STATIC
    IF NotMouse% THEN EXIT SUB
    DIM reg AS RegTypeX

    IF Lc% = 0 THEN
           Lc% = 1: reg.ax = 0
           CALL InterruptX(51, reg, reg)
           IF reg.ax = 0 THEN
               NotMose% = 1: EXIT SUB
           END IF
    END IF
    
    reg.ax = ax%: reg.bx = bx%: reg.cx = cx%: reg.dx = dx%
    CALL InterruptX(51, reg, reg)
    ax% = Regax: bx% = reg.bx: cx% = reg.cx: dx% = reg.dx
END SUB
'返回鼠标是否有移动
FUNCTION MouseIsMove% STATIC
    X% = MouseX%: Y% = MouseY%
    IF OldX% <> X% OR OldY% <> Y% THEN MouseIsMove% = -1
    OldX% = X%: OldY% = Y%
END FUNCTION
'返回左按钮是否有单击动作(按下后放开)
FUNCTION MouseLClick% STATIC
    MouseInt 3, Button%, 0, 0
    IF Button% AND 1 THEN DownL% = 1
    IF DownL% = 1 AND (Button% AND 1) = 0 THEN
       DownL% = 0: MouseLClick% = -1
    END IF
END FUNCTION
'返回鼠标是使用哪一个端口
FUNCTION MousePort$
    ax% = 35
    MouseInt ax%, 0, cx%, 0
    IF ax% = &HFFFF THEN EXIT FUNCTION
    Port% = cx% MOD 256
    IF Port% = 0 THEN
            MousePort$ = "PS/2"
        ELSE
            MousePort$ = "IRQ" + LTRIM$(STR$(Port%))
    END IF
END FUNCTION
'返回右按钮是否有单击动作(按下后放开)
FUNCTION MouseRClick% STATIC
    MouseInt 3, Button%, 0, 0
    IF Button% AND 2 THEN DownR% = 1
    IF DownR% = 1 AND (Button% AND 2) = 0 THEN
       DownR% = 0: MouseRClick% = -1
    END IF
END FUNCTION
'设置鼠标习惯是右手还是左手 0左 255右
SUB MouseSetHandLR (LR%)
    MouseInt &H206C, LR%, 0, 0
END SUB
'强行鼠标移动到此位置(x,y)
SUB MouseSetXY (X%, Y%)
    MouseInt 4, 0, X%, Y%
END SUB
'显示鼠标光标
SUB MouseShow
    MouseInt 1, 0, 0, 0
END SUB
'获取鼠标的类型
FUNCTION MouseType$
    ax% = 35
    MouseInt ax%, bx%, cx%, 0
    IF ax% = &HFFFF THEN EXIT FUNCTION
    mType% = INT(cx% / 256)
    SELECT CASE mType%
        CASE 1: t$ = "Bus"
        CASE 2: t$ = "Serial"
        CASE 3: t$ = "InPort"
        CASE 4: t$ = "PS/2"
        CASE 5: t$ = "HP"
    END SELECT
    MouseType$ = t$
    PRINT bx%, cx%
END FUNCTION
'返回鼠标左按钮放开时的X坐标
FUNCTION MouseUpLX%
    MouseInt 6, 0, X%, 0
    MouseUpLX% = X%
END FUNCTION
'返回鼠标左按钮放开时的Y坐标
FUNCTION MouseUpLY%
    MouseInt 6, 0, 0, Y%
    MouseUpLY% = Y%
END FUNCTION
'返回鼠标右按钮放开时的X坐标
FUNCTION MouseUpRX%
    MouseInt 6, 1, X%, 0
    MouseUpRX% = X%
END FUNCTION
'返回鼠标右按钮放开时的Y坐标
FUNCTION MouseUpRY%
    MouseInt 6, 1, 0, Y%
    MouseUpRY% = Y%
END FUNCTION
'返回鼠标此时刻的X坐标
FUNCTION MouseX%
    MouseInt 3, 0, X%, 0
    MouseX% = X%
END FUNCTION
'返回鼠标此时刻的Y坐标
FUNCTION MouseY%
    MouseInt 3, 0, 0, Y%
    MouseY% = Y%
END FUNCTION

我来回复

您尚未登录,请登录后再回复。点此登录或注册