标题:求助:DOS环境下SVGA图形模式下,实现监测并显示鼠标的移动的问题?
只看楼主
c51uart
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-8-3
 问题点数:0 回复次数:1 
求助:DOS环境下SVGA图形模式下,实现监测并显示鼠标的移动的问题?
我的基本思路是调用BIOS中断监测鼠标的移动,还原旧位置,在新位置上画鼠标,可是ShowMouse()执行结果是:
鼠标可以移动一次,然后程序卡住,只能强行关闭dosbox模拟器.
程序代码:
#define MOUSEX 200
#define MOUSEY 200
int MouseInit() // 检查鼠标驱动是否安装
{
    int retcode;
    asm{
        mov AX,0
        INT 33h
        mov retcode,AX
    }

    if(retcode==0) // 鼠标安装失败
        return 0;
    
    return retcode;
}

void SetXY() // 设置鼠标移动范围
{
    asm{
        mov AX,7
        mov CX,0
        mov DX,639 // 水平范围0-639
        INT 33h
        mov AX,8
        mov CX,0
        mov DX,479 // 垂直范围0-479
        INT 33h 
    }
}

void setmouse(INT16 x,INT16 y) // 设置鼠标显示位置
{
    asm{
        MOV CX,x
        MOV DX,y
        MOV AX,4
        INT 33H
    }
    xpos = x;
    ypos = y;
}
/*
INT33h 功能0CH
功能描述:为鼠标事件设置处理程序
入口参数:AX=0CH
CX=中断掩码 
位0=1——鼠标指针位置发送变化
位1=1——按下左按钮
位2=1——释放左按钮
位3=1——按下右按钮
位4=1——释放右按钮
位5=1——按下中间按钮
位6=1——释放中间按钮
位7~15=0——保留
ES:DX=中断处理程序的地址

在进入中断处理程序时,有关寄存器的值含义:
  AX=中断掩码
  BX=按键状态
  CX=鼠标指针的水平位置
  DX=鼠标指针的垂直位置
  SI=水平位置的变化量
  DI=垂直位置的变化量
出口参数:无*/
void interrupt mousehandler()
{
    int newevent,newxpos,newypos;
    int i,j;
    asm{
        MOV newevent,AX
        MOV newxpos,CX
        MOV newypos,DX
    }
    switch(_AX){
        case 0x01:
            ConcealMouse(xpos,ypos,origin); //清除前一个鼠标图案
            xpos=newxpos;ypos=newypos; // 获取新位置
            for(i=0;i<16;i++) // 保留新位置原始图案
               for(j=0;j<16;j++)
                   origin[i*16+j]= GetPixel(xpos+j,ypos+i);
            DrawMouse(xpos,ypos); // 在新位置显示鼠标
    }
    
}
void installtask(INT16 mask)
{
    asm{
        MOV AX,0CH
        MOV CX,mask
        MOV BX,SEG mousehandler
        MOV ES,BX
        LEA DX,mousehandler
        INT 33H
    }
}

void ShowMouse()
{
    int i,j;
    
    if(MouseInit()==0){
        SetSVGAMode(3);
        printf("no mouse available!\n");
        exit(1);
    }
   SetXY(); 
   setmouse(MOUSEX,MOUSEY);
   
   for(i=0;i<16;i++)    // 保存鼠标将要显示的区域的图片信息到全局数组
       for(j=0;j<16;j++)
           origin[i*16+j]= GetPixel(xpos+j,ypos+i);
   DrawMouse(xpos,ypos); // 在给定位置画鼠标
   installtask(0x007f);  // 打开中断
}


可以确定我画鼠标和还原鼠标位置原来图像的函数在单独测试时都是正确的,请问以上代码不能成功的原因?
我的显示模式为SVGA640*480,是中断函数的使用错误吗?
请高手指点,谢谢!
搜索更多相关主题的帖子: 模拟器 
2015-08-13 10:40
zhulei1978
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
得分:0 
DrawMouse(xpos,ypos)函数没有列出来么

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-04-10 09:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-456335-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.376280 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved