上一篇:WebClass入门(1) >>
DirectInput鼠标编程入门
前回同大家简单介绍了如何用 DirectInput 来进行键盘编程,本回所要讲述的就该是关于如何使用DirectInp
ut 来对另一个非常重要的输入设备----鼠标的编程问题。
鼠标的编程同键盘编程的过程是非常相似的,有了上次的基础,你很快就能看出两者在形式上其实完全是大同
小异的.
1、DIRECTINPUT 的初始化
同前面讲键盘编程的过程一样,我们还是先从 DIRECTINPUT 的初始化开始吧:
#include <dinput.h>
#define DINPUT_BUFFERSIZE 16
LPDIRECTINPUT lpDirectInput; // DirectInput object
LPDIRECTINPUTDEVICE lpMouse; // DirectInput // 失败
return FALSE;
}
// 创建一个 DIRECTINPUTDEVICE 界面
hr = lpDirectInput->CreateDevice(GUID_SysMouse, &lpMouse, NULL);
if FAILED(hr)
{
// 失败
return FALSE;
}
// 设定查询鼠标状态的返回数据格式
hr = lpMouse->SetDataFormat(&c_dfDIMouse);
if FAILED(hr)
{
// 失败
return FALSE;
}
// 设定协作模式
hr = lpMouse->SetCooperativeLevel(hWnd,
DISCL_EXCLUSIVE | DISCL_FOREGROUND);
if FAILED(hr)
{
// 失败
return FALSE;
}
// 设定缓冲区大小
// 如果不设定,缓冲区大小默认值为 0,程序就只能按立即模式工作
// 如果要用缓冲模式工作,必须使缓冲区大小超过 0
DIPROPDWORD property;
property.diph.dwSize = sizeof(DIPROPDWORD
hr = lpMouse->SetProperty(DIPROP_BUFFERSIZE, &property.diph);
if FAILED(hr)
{
// 失败
return FALSE;
}
hr = lpMouse->Acquire();
if FAILED(hr)
{
// 失败
return FALSE;
}
return TRUE;
}
除了少数几处改动以外,这段代码同前面讲的键盘编程的代码基本上完全一样。
注意调用 CreateDevice 来建立一个 DIRECTINPUTDEVICE 界面时,我们用的参数是 GUID_SysMouse 而不是 G
UID_SysKeyboard,我们以此来指明了建立的是鼠标对象。相应的,在用 SetDataFormat 来设定返回数据的格式时
,我们用的参数是 &c_dfDIMouse 而不是 &c_dfDIKeyboard。
还有要特别注意的是,前面讲到的键盘,在设置协作方式时,是只能按非独占方式工作的,而鼠标即可以按非
独占方式工作,也可以按独占方式工作。
2、DIRECTINPUT 的数据查询
在作 DIRECTINPUT 的鼠标数据查询时, 我一般都是使用的缓冲模式而不是立即模式。原因很简单,因为鼠标
移动事件的频率很高, 按立即模式去处理就很难保证不丢失数据。至于 DIRECTX SDK 里的例程使用立即模式读取
数据则是因为它们用了一个多媒体计时器来保证以每秒三十次的频率处理接受鼠标数据。
明白这一点后, 下面我们就来看看相应的代码。由于 DIRECTX SDK 里的例程有立即模式的代码,我就偷点懒
,下面只给出了一段缓冲模式下的代码:
HRESULT UpdateInputState(void)
{
DWORD i;
if(lpMouse != NULL)
{
DIDEVICEOBJECTDATA didod; // Receives buffered data
DWORD dwElements;
HRESULT hr;
while(TRUE)
{
dwElements = 1; // 每次从缓冲区中读一个数据
hr = lpMouse->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),&didod,&dwElements,0);
if FAILED(hr)
{
// 发生了一个错误
if(hr == DIERR_INPUTLOST)
{
hr = lpMouse->Acquire(); // 试图重新取回设备
if FAILED(hr)
{
return S_FALSE; // 失败
}
}
}
else
if(elements == 1)
{
switch(didod.dwOfs)
{
case DIMOFS_X: // X 轴偏移量
// didod.dwData 里是具体偏移相对值,单位为像素
break;
case DIMOFS_Y: // Y 轴偏移量
// didod.dwData 里是具体偏移相对值,单位为像素
break;
case DIMOFS_BUTTON0: // 0 号键(左键)状态
// didod.dwData 里是具体状态值
// 低字节最高位为 1 则表示按下
// 低字节最高位为 0 表示未按下
break;
case DIMOFS_BUTTON1: // 1 号键(右键)状态
// 同上
break;
case DIMOFS_BUTTON2: // 2 号键(中键)状态
// 同上
break;
case DIMOFS_BUTTON3: // 3 号键状态
// 同上
break;
}
}
else if (elements == 0) break; // 缓冲区读空
}
}
return S_OK;
}
这段代码注释得非常详细,相信你很快就能看懂。
3、DIRECTINPUT 的结束处理
还记得当程序结束时必须要进行的释放处理吧,其代码如下:
void ReleaseDInput(void)
{
if (lpDirectInput)
{
if(lpMouse)
{
// Always unacquire the device before calling Release().
lpMouse->Unacquire();
lpMouse->Release();
lpMouse = NULL;
}
lpDirectInput->Release();
lpDirectInput = NULL;
}
}
下一篇:ASP的技术特点与使用方法 >>
相关文章:
- · ASP.NET连SQL7接口源代码
- · 关于图片与文本同存在数据库中的具体思路
- · 一个图片数据的存和取的示例
- · ASP中使用SQL时的数据类型转换
- · T-SQL排序规则的优先顺序
- · T-SQL数据类型的优先顺序
- · SQLSELECT语句
- · 不通过dsn访问sqlserver
- · 袖珍数据库连接查询手册
- · SQLServer存储过程编程经验技巧
- · 在服务器端控制网页
- · ASP.NET中在线用户统计
- · 用ASP.NET和XML做的新闻系统
- · ASP.NET中自定义DataGrid分页设置的实现
- · ASP.NET中Cookie编程简明参考
- · 简单快捷实现ASP在线发邮件功能
- · 纯ASP代码生成图表函数1——柱状图调用示例
- · asp中随机生成文件名的函数
- · 18位身份证标准的详细规定,包括校验位的计算…
- · 加速ASP程序的显示速度
- · ASP提速技巧五则
- · ASP网页模板的应用
- · 风格模板初级不完全修改教程
- · len(),lift(),right()不能正常识别中文的解决…
- · 判断Cookies是否处于开启状态
- · 无组件图片与文本同步存入数据库的最简单的办…
- · 将SAX加入我们的ASP应用中(2)
- · 将SAX加入我们的ASP应用中(1)
- · Asp中Global.asa的应用(二)
- · Asp中Global.asa的应用(-)
- · 将SAX加入我们的ASP应用中
- · 限制同一表单被多次提交
- · 禁用浏览器后退按钮
- · 一个简单的投票程序
- · 微软IIS5.0自带组件之漏洞(不认识IE6.0B2)
- · ActiveServerPages的安全问题
- · 畸形URL能导致IIS5.0和exchange2000停止服务
- · 维护ASP应用程序的安全
