中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 调用鼠标、按钮、汉字的源程序
作者:
标题: 调用鼠标、按钮、汉字的源程序 上一主题 | 下一主题
qb45
高级用户




积分 677
发帖 194
注册 2003-9-13
状态 离线
『楼 主』:  调用鼠标、按钮、汉字的源程序

'启动 QB 时请用此格式! QB/L
'$INCLUDE: 'qb.bi'
DIM SHARED ok%(16, 16)  '读取“确定”这两个汉字的数据
    FOR i = 1 TO 2
    FOR j1 = 0 TO 12
        READ ok%(i, j1 + 1)
        ok%(i, 0) = -5
    NEXT j1
    NEXT i
    ok%(0, 0) = i
    ok%(0, 1) = 12
    ok%(0, 2) = 12
Mouse.Setrage 0, 40, 600, 400  '设置鼠标
start    '初始化
an 260, 150, "ok", 1  '显示按钮
mouse.show  '显示鼠标
'Demo  程序演示
LOCATE 1, 65: PRINT "Esc Key To Exit"  '按ESC键退出
DO
   LOCATE 1, 1: PRINT "Mouse Left  "; mouse.down(1), "Mouse X = "; Mouse.X
   LOCATE 2, 1: PRINT "Mouse Right "; mouse.down(2), "Mouse Y = "; Mouse.Y
   k$ = INKEY$: IF k$ = CHR$(27) THEN EXIT DO  '当按下ESC键时退出DO循环
   IF button.st(260, 150) THEN EXIT DO    '当鼠标按下确定键时退出DO循环
LOOP
END

DATA 256 ,-1568 , 8768 , 10224 , 17040 , 31376 ,-13328 , 19088 , 19440 , 31376 , 17552 , 2224 ,
DATA 1024 , 512 , 32736 , 16416 , 16320 , 512 , 4608 , 5056 , 4608 , 10752 , 17920 ,-31760 ,

SUB an (an.x, an.y, word$, an.state)
'显示按纽的子程序
Mouse.Hide '隐藏鼠标
an.word$ = word$
an.w = 65: an.h = 16
black = 0
white = 7
brwhite = 15
brwhite1 = 14
gray = 11
gray1 = 8
an.x1 = an.x + an.w: an.y1 = an.y + an.h
ank.x = an.x - 3: ank.y = an.y - 3
ank.x1 = an.x1 + 3: ank.y1 = an.y1 + 3
SELECT CASE an.state
    CASE 1   'xuan zhong 按纽释放状态
     'LINE (ank.x, ank.y)-(ank.x1, ank.y1), black, B
     hz an.x + 2, an.y + 1, an.word$, white
     hz an.x + 1, an.y, an.word$, black
    CASE 2   'an xia  按纽按下状态
     SWAP brwhite, black: SWAP brwhite1, gray1
     hz an.x + 1, an.y, an.word$, white '显示汉字
     hz an.x + 2, an.y + 1, an.word$, brwhite
END SELECT
'xuan ankey shang xian
LINE (ank.x + 1, ank.y + 1)-(ank.x1 - 1, ank.y1 - 1), brwhite, B
LINE (ank.x + 2, ank.y + 2)-(ank.x1 - 2, ank.y1 - 2), brwhite1, B
'xuan ankey xia xian
LINE (ank.x + 1, ank.y1 - 1)-STEP(an.w + 4, 0), black
LINE (ank.x1 - 1, ank.y + 1)-STEP(0, an.h + 4), black
LINE (an.x - 1, an.y1 + 1)-STEP(an.w + 2, 0), gray1
LINE (an.x1 + 1, an.y - 1)-STEP(0, an.h + 2), gray1
mouse.show '显示鼠标
END SUB

FUNCTION button.st (x1, y1)
'判断按纽是否被按下的子程序
    x = x1: y = y1: w$ = "ok"
    an.w = 65: an.h = 16
    button.st = 0
    IF mouse.down(1) THEN
       DO WHILE Mouse.InBox(x, y, an.w, an.h)
      an x, y, w$, 2
      DO
        IF mouse.down(1) = 0 THEN an x, y, w$, 1: button.st=-1: EXIT FUNCTION
        IF Mouse.InBox(x, y, an.w, an.h) THEN
        ELSE
           an x, y, w$, 1
           EXIT DO
        END IF
      LOOP
      LOOP
   END IF
END FUNCTION

SUB hz (hz.x, hz.y, hz.word$, hz.color)
'显示汉字的子程序
    hz.x = hz.x + 20
    hz.w = ok%(0, 2): hz.h = ok%(0, 1)
    FOR i1 = 1 TO ok%(0, 0)
    FOR i = 1 TO hz.h
        LINE (hz.x, hz.y + i)-STEP(hz.w, 0), hz.color, , ok%(i1, i)
    NEXT i
    hz.space = ok%(i1, 0)
    hz.x = hz.x + 16 + hz.space
    NEXT i1
END SUB

SUB kuang (x1, y1, x2, y2, mode)
'画方框的子程序
black = 0
white = 7
brwhite = 15
brwhite1 = 14
gray = 11
gray1 = 8
SELECT CASE mode
    CASE 0
     LINE (x1, y1)-(x2, y2), white, BF
    'xuan ankey shang xian
    LINE (x1 - 2, y1 - 2)-(x2 + 2, y2 + 2), brwhite, B
    LINE (x1 - 1, y1 - 1)-(x2 + 1, y2 + 1), brwhite1, B
    'xuan ankey xia xian
    LINE (x1 - 1, y2 + 1)-(x2 + 1, y2 + 1), black
    LINE (x2 + 1, y1 - 1)-(x2 + 1, y2), black
    LINE (x1 - 2, y2 + 2)-(x2 + 2, y2 + 2), gray1
    LINE (x2 + 2, y1 - 2)-(x2 + 2, y2 + 2), gray1
END SELECT
EXIT SUB

END SUB

SUB Mouse (m1%, m2%, m3%, m4%)
'鼠标调用的子程序
    DIM inreg  AS RegType, outreg AS RegType
    inreg.ax = m1%
    inreg.bx = m2%
    inreg.cx = m3%
    inreg.dx = m4%
    INTERRUPT &H33, inreg, outreg
    m1% = outreg.ax
    m2% = outreg.bx
    m3% = outreg.cx
    m4% = outreg.dx
END SUB

FUNCTION mouse.down (button%)
'判断鼠标是否按下的子程序
     Mouse 3, Mouse.button%, x%, y%
     mouse.down = 0
    IF button% = 1 THEN
       IF Mouse.button% = 1 THEN mouse.down = -1
    END IF
    IF button% = 2 THEN
       IF Mouse.button% = 2 THEN mouse.down = -1
    END IF
END FUNCTION

SUB Mouse.Hide
'隐藏鼠标
    Mouse 2, 0, 0, 0
END SUB

FUNCTION Mouse.InBox (box.x, box.y, box.w, box.h)
'判断鼠标是否在指定区域内的子程序
    box.x1 = box.x + box.w: box.y1 = box.y + box.h
    Mouse.InBox = 0
    IF Mouse.X > box.x AND Mouse.Y > box.y THEN
          IF Mouse.X < box.x1 AND Mouse.Y < box.y1 THEN
         Mouse.InBox = -1
          END IF
    END IF
END FUNCTION

SUB Mouse.Setrage (x%, y%, w%, H%)
'设置鼠标的移动范围
    Mouse 7, 0, x%, x% + w%
    Mouse 8, 0, y%, y% + H%
END SUB

SUB mouse.show
'显示鼠标
    Mouse 1, 0, 0, 0
END SUB

SUB Mouse.State (x%, y%, Mouse.button%)
'鼠标状态
    Mouse 3, Mouse.button%, x%, y%
END SUB

FUNCTION Mouse.X
'鼠标横坐标
    Mouse 3, Mouse.button%, x%, y%
    Mouse.X = x%

END FUNCTION

FUNCTION Mouse.Y
'鼠标竖坐标
    Mouse 3, Mouse.button%, x%, y%
    Mouse.Y = y%
END FUNCTION

SUB setcolor (color.num, red, green, blue)
'设置调色板
    PALETTE color.num, 65536 * red + 256 * green + blue
END SUB

SUB start
'初始化
SCREEN 12
setcolor 7, 48, 48, 48
setcolor 15, 63, 63, 63
setcolor 14, 55, 55, 55
setcolor 8, 32, 32, 32
setcolor 0, 0, 0, 0
setcolor 1, 42, 42, 0
setcolor 2, 42, 42, 0
LINE (0, 40)-(640, 480), 1, BF
kuang 200, 100, 400, 250, 0
END SUB




我(QB45)的照片与简历
http://www.programfan.com/club/showbbs.asp?id=197280
2003-10-22 00:00
查看资料  发送邮件  发短消息 网志  OICQ (406930019)  编辑帖子  回复  引用回复
lemonhall
高级用户

OS/2女孩


积分 639
发帖 183
注册 2003-6-14
状态 离线
『第 2 楼』:  

支持。



REM              喜欢DOS,因为它的简单
REM            喜欢OS/2,因为它不再矫饰
REM            喜欢BASIC,因为它并不幼稚
REM             喜欢GNU,因为它杂乱无章
2003-10-23 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (313813)  编辑帖子  回复  引用回复
warm
初级用户




积分 175
发帖 25
注册 2003-10-23
状态 离线
『第 3 楼』:  

正在学习。

2003-10-23 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
iceboy
银牌会员




积分 1681
发帖 512
注册 2003-8-2
状态 离线
『第 4 楼』:  

setcolor 好像是 RGB(64,64,64) 的,能不能改成大家更习惯的 256,256,256 呢?
似乎很简单。。。

注释:
setcolor()
1.修改背景颜色时就把 color.num = 0 就行了
2.无论怎样修改颜色, 记住, 在 screen 12 下, 屏幕上一共只能显示 16 色, 所以能用抖动效果产生的颜色就尽量不要耗费 color 的数量。
mouse
我不想多说了, 它是通过调用 mouse 驱动程序的中断实现的鼠标调用, 不过和 ctmouse 有微小的不兼容。比如:
mouseon
do
print "aaaaaaaaaaaaaaaaaaaaaaaaaa"
loop

如果你执行上面这个程序,然后不停地移动鼠标,在使用 ctmouse 1.9/2.0 的情况下, 很快就会出现 stacks overflow error,而 M$ 的 mouse.com 就不会。

另外, 希望 qb45 尽快写出一个调用比较方便的 VESA(即 SVGA 通用接口) 函数库。



Somehow somewhere I've got to choose.
No matter if it is win or lose.
2003-10-24 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
凌晨一点
初级用户




积分 255
发帖 54
注册 2003-10-24
状态 离线
『第 5 楼』:  

能用QB写出这些东东,真的满不错啊。
鼠标的光标用自己画的更个性点。
加油啊!

2003-10-24 00:00
查看资料  发送邮件  发短消息 网志  OICQ (285749694)  编辑帖子  回复  引用回复
liangkove
初级用户




积分 120
发帖 8
注册 2003-10-25
来自 广东
状态 离线
『第 6 楼』:  

有没有C的源程序呀??请问



kove
2003-10-25 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Bander
初级用户




积分 131
发帖 7
注册 2003-4-13
状态 离线
『第 7 楼』:  



  Quote:
以下是引用iceboy在2003-10-24 22:03:40的发言:
另外,&nbsp;希望&nbsp;qb45&nbsp;尽快写出一个调用比较方便的&nbsp;VESA(即&nbsp;SVGA&nbsp;通用接口)&nbsp;函数库。

已经有了,支持到1024×768×16M色的

2003-10-27 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qb45
高级用户




积分 677
发帖 194
注册 2003-9-13
状态 离线
『第 8 楼』:  

源程序在此,请随便修改使用!
我不会C!没发写函数,不过知道原理了用什么语言写都不难!
要改变鼠标的形状也是很简单的!MOUSE (M1%,M2%,M3%,M4%)是鼠标调用,M1%=9的时候就可以改变形状了!
你自己找找资料,试试看,并不难!做的时候有可能要用到以下语句,我告诉你用法!
OUT P,D   '功能I O通道的输出,P是地址,D是数据
INP (P)   '功能I O通道的输入,P是地址
POKE A,D  '功能写内存,A是偏移量,D是数据
PEEK(A)   '功能读内存
DEF SEG=A   '功能设置段址,A是段址
VARSEG(A$)    '功能,返回A$的段址
SADD(A$)      '功能,返回A$的偏移地址








我(QB45)的照片与简历
http://www.programfan.com/club/showbbs.asp?id=197280
2003-10-28 00:00
查看资料  发送邮件  发短消息 网志  OICQ (406930019)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: