在VESA编程中如何调用鼠标

TBBT 2000-02-17 08:11:00
各位大侠:
小弟在DOS下用BC++3。1编写VESA程序时,发现无法在640X480X256(或更高分辨率)下无法调用鼠标。用INT33调用可返回X,Y坐标,但与屏幕大小不符,且无法显示
鼠标。
请问如何解决之?
...全文
139 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Philip 2000-02-25
  • 打赏
  • 举报
回复
我也曾经遇到过这样的问题,换用新版本的微软通用鼠标驱动程序就正常了。
  • 打赏
  • 举报
回复
用鼠标中断的这个功能监视鼠标的状态,不让系统画鼠标,知道鼠标的位置了需要自己画才能正确。
因为鼠标驱动程序一般不处理SVGA的显示模式,包括256色以上所有模式,甚至返回的坐标都是错误的,必须用这个方法:

INT33H的这个功能是安装一个鼠标监视子程序,ES:DX是这个子程序的地址,CX是在什么情况INT33H需要调用这个子程序,AX是功能号。
INT 33H:
AX = 000Ch
CX = call mask (在什么情况相应要安装的子程序)
bit 0 call if mouse moves (移动)
bit 1 call if left button pressed (左按钮按下)
bit 2 call if left button released (左按钮抬起)
bit 3 call if right button pressed (右按钮按下)
bit 4 call if right button released (右按钮抬起)
bit 5 call if middle button pressed (Mouse Systems/Logitech
mouse)
bit 6 call if middle button released (Mouse Sys/Logitech mouse)
ES:DX -> FAR routine

调用这个中断后,在由CX规定的情况下响应这个中断,并调用这个监视子程序,在SVGA编程一定要截获鼠标移动,其他可以选。

Notes: when the subroutine is called, it is passed the following values(监视程序的参数):
AX = condition mask (same bit assignments as call mask 与调用INT33时的CX相同)
BX = button state (按钮状态)
CX = cursor column (X坐标,在SVGA模式数值不正确)
DX = cursor row (Y坐标,在SVGA模式数值不正确)
SI = horizontal mickey count (与上次调用在X方向移动的距离,在SVGA模式非常有用)
DI = vertical mickey count (与上次调用在Y方向移动的距离,在SVGA模式非常有用)

一般安装这个监视程序在第一次响应这个程序时保存所有状态,不作任何处理,以后每响应一次都与上次比较,得出新的鼠标位置,而鼠标的初始位置随你的喜好,比如在屏幕中心。

一般都是在程序循环里面检查鼠标位置变化了就在擦掉老位置的鼠标,在新位置重新画上,才能正确。

注意:在监视程序里面的SI和DI值表示你的鼠标在桌子上移动的距离,并不理会在屏幕上的位置,即使超出屏幕之外。这就是很多程序在鼠标移到屏幕边缘再继续移动就能滚屏,并且滚屏由鼠标在桌子上的移动决定的道理。

在程序改变显示模式或结束之前一定要调用INT33H的0号功能再初始化一遍鼠标,清掉你的监视程序,否则会死机的。

参考程序:
void _saveregs far MouseSubHandler(void) //必须是 _saveregs far 类型的函数
{
int Bn;
int Nmx, Nmy;
int Xcnt,Ycnt;

asm mov Bn, ax; //按钮状态
asm mov Nmx, cx; //标准VGA显示模式的鼠标X坐标
asm mov Nmy, dx; //标准VGA显示模式的鼠标Y坐标
asm mov Xcnt,si; //x方向移动的距离
asm mov Ycnt,di; //y方向移动的距离

if(Bn&1)
//mouse moved
if(Bn&2)
//left button pressed
if(Bn&4)
//left button released
if(Bn&8)
//right button pressed
if(Bn&16)
//right button pressed
if(Bn&32)
//mid button pressed
if(Bn&64)
//mid button released
}

void far SetNewMouseSubHandler(void)
{
REGS r;
SREGS sr;

r.x.ax = 0x000c;
r.x.cx = 0x007f; //007FH = 01111111B
r.x.dx = FP_OFF(MouseSubHandler);
sr.es = FP_SEG(MouseSubHandler);
int86x(0x33, &r, &r, &sr);
}

这个方法在任何显示模式下都可以使用。
Eros 2000-02-17
  • 打赏
  • 举报
回复
不知道你用的是哪个BGI,部分的BGI有BUG,需要专门的BGI来支持鼠标,原因可能是显存分页的原因,且在不同的显卡,不同的环境(WINDOWS窗口,纯DOS中)表现也不一样,原因可能是鼠标驱动的问题。目前,有S3,TVGA,和单独VESA的许多版本的BGI可以找到,并且都有对应的支持鼠标的BGI。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧