青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

【ZT】DirectInput 鼠標編程入門

作者:樊一鵬

前回同大家簡單介紹了如何用 DirectInput 來進行鍵盤編程,本回所要講述的就該是關于如何使用 DirectInput 來對另一個非常重要的輸入設備----鼠標的編程問題。

鼠標的編程同鍵盤編程的過程是非常相似的,有了上次的基礎,你很快就能看出兩者在形式上其實完全是大同小異的。

DIRECTINPUT 的初始化

同前面講鍵盤編程的過程一樣,我們還是先從 DIRECTINPUT 的初始化開始吧:

#include <dinput.h>

#define DINPUT_BUFFERSIZE 16

LPDIRECTINPUT           lpDirectInput;  
// DirectInput object
LPDIRECTINPUTDEVICE     lpMouse;        // DirectInput device

BOOL InitDInput(HWND hWnd)
{
    HRESULT hr;

    
// 創建一個 DIRECTINPUT 對象
    hr = DirectInputCreate(hInstanceCopy, DIRECTINPUT_VERSION, &lpDirectInput, NULL);

    
if FAILED(hr)
    {
        
// 失敗
        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);
    property.diph.dwHeaderSize 
= sizeof(DIPROPHEADER);
    property.diph.dwObj 
= 0;
    property.diph.dwHow 
= DIPH_DEVICE;
    property.dwData 
= DINPUT_BUFFERSIZE;

    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 而不是 GUID_SysKeyboard,我們以此來指明了建立的是鼠標對象。相應的,在用 SetDataFormat 來設定返回數據的格式時,我們用的參數是 &c_dfDIMouse 而不是 &c_dfDIKeyboard。

還有要特別注意的是,前面講到的鍵盤,在設置協作方式時,是只能按非獨占方式工作的,而鼠標即可以按非獨占方式工作,也可以按獨占方式工作。

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 == 0break;      // 緩沖區讀空
        }
    }

    
return S_OK;
}

  這段代碼注釋得非常詳細,相信你很快就能看懂。

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;
    }
}

 

posted on 2007-05-06 19:34 lovedday 閱讀(717) 評論(0)  編輯 收藏 引用 所屬分類: ■ DirectX 9 Program

公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美日韩爽爽影院| 国产精品久久9| 久久天天躁夜夜躁狠狠躁2022| 国产亚洲欧美另类中文| 欧美精品午夜视频| 欧美精品videossex性护士| 欧美1区2区| 欧美日本一区二区高清播放视频| 欧美电影在线| 国产精品啊啊啊| 国产色视频一区| 亚洲经典在线| 亚洲网站在线播放| 久久久久久久高潮| 亚洲国产精品福利| 欧美1区2区| 亚洲国内自拍| 亚洲一区国产精品| 久久天天躁狠狠躁夜夜爽蜜月| 免费成人高清| 国产精品网站在线播放| 亚洲激情一区| 久久精品国产清自在天天线| 久久久久在线| 99re成人精品视频| 亚洲午夜精品17c| 亚洲一区免费| 亚洲第一区色| 亚洲国产日韩一级| av不卡免费看| 久久久久99| 欧美日韩精品一区二区在线播放| 欧美日韩免费看| 国内精品久久久久久久果冻传媒 | 国产欧美日韩综合一区在线观看 | 99国产一区| 久久久欧美一区二区| 美日韩精品视频| 亚洲一区欧美| 欧美午夜大胆人体| 亚洲黑丝一区二区| 亚洲一区二区三区免费在线观看| 欧美在线观看视频一区二区三区| 男人的天堂亚洲在线| 日韩视频永久免费| 欧美成年人视频网站| 久久久久久久一区二区三区| 亚洲特级毛片| 欧美国产综合| 亚洲福利国产| 欧美一区二区三区在线| 亚洲精品久久久久中文字幕欢迎你 | 午夜精品久久久99热福利| 女人天堂亚洲aⅴ在线观看| 欧美性片在线观看| 免费国产一区二区| 国产婷婷色一区二区三区在线| 国产在线拍揄自揄视频不卡99| 亚洲特级毛片| 亚洲色图在线视频| 国产欧美日韩一区二区三区在线观看| 亚洲精品九九| 久久久久久久91| 欲香欲色天天天综合和网| 久久久久9999亚洲精品| 亚洲伊人伊色伊影伊综合网| 狠狠操狠狠色综合网| 欧美激情小视频| 欧美日韩精品国产| 欧美一区精品| 看欧美日韩国产| 最近中文字幕日韩精品 | 欧美日韩亚洲一区二区三区在线| 日韩视频二区| 久久精品国产亚洲aⅴ| 国产精品99久久久久久人| 日韩午夜在线播放| 国产精品一二三| 久久精品国产亚洲a| 欧美大片在线观看一区| 久久久久久9| 欧美精品国产精品| 亚洲另类一区二区| 亚洲一区区二区| 艳女tv在线观看国产一区| 亚洲视频大全| 99这里只有久久精品视频| 亚洲影视综合| 亚洲国产黄色| 国产精品久久久久久久久久尿| 最新国产の精品合集bt伙计| 国产精品亚洲第一区在线暖暖韩国| 久久久久久网址| 欧美日韩国产另类不卡| 牛牛影视久久网| 狠狠色狠狠色综合| 亚洲国产精品视频一区| 国产在线乱码一区二区三区| 午夜亚洲伦理| 久久久精品2019中文字幕神马| 国产精品天天看| 亚洲国产毛片完整版| 国产精品一区二区三区四区| 久久久综合网| 91久久精品日日躁夜夜躁欧美| 日韩视频永久免费观看| 欧美日本国产精品| 亚洲欧美中文在线视频| 免费高清在线一区| aa级大片欧美| 黄色成人精品网站| 欧美xxxx在线观看| 亚洲自拍偷拍网址| 亚洲国产黄色片| 翔田千里一区二区| 亚洲日本中文字幕区| 99国产精品| 精品成人a区在线观看| 国产精品久久久久久久久动漫| 亚洲午夜一区| 日韩一级大片| 亚洲在线观看免费| 国产色综合网| 欧美视频中文字幕在线| 午夜伦理片一区| 亚洲国产日韩欧美| 欧美日韩第一区日日骚| 欧美一级欧美一级在线播放| 欧美激情小视频| 免费亚洲电影在线| 久久综合给合| 欧美一区二区视频97| 亚洲女人天堂av| 久久精品99无色码中文字幕| 黑人一区二区三区四区五区| 国产精品久久久久久久午夜片| 欧美日韩理论| 欧美人与禽性xxxxx杂性| 美女在线一区二区| 免费日韩av片| 免费观看不卡av| 欧美国产日韩二区| 久久久久国内| 亚洲在线一区| 久久激情综合| 亚洲国产综合91精品麻豆| 99精品久久久| 欧美在线影院| 亚洲精品久久久久久久久久久久久 | 亚洲主播在线观看| 午夜精品999| 亚洲黄色一区| 久久久www成人免费无遮挡大片 | 国产在线观看一区| 亚洲精品韩国| 欧美一区2区三区4区公司二百| 久久蜜臀精品av| 亚洲精品欧美精品| 久久久久久高潮国产精品视| 欧美大尺度在线| 亚洲欧美在线高清| 国产精品久久久91| 国产毛片精品视频| 99热这里只有成人精品国产| 午夜精品久久久99热福利| 亚洲国产三级网| 欧美精品色一区二区三区| 伊人成人在线| 麻豆av一区二区三区久久| 亚洲午夜日本在线观看| 欧美日韩精品中文字幕| 日韩一区二区精品| 亚洲看片免费| 国产精品成人一区二区| 久久久久久久久久久久久9999| 亚洲综合色在线| 欧美日韩裸体免费视频| 国产欧美日韩一区二区三区在线| 在线不卡中文字幕| 亚洲综合三区| 亚洲高清自拍| 久久一区欧美| 韩国一区二区三区在线观看| 欧美一区二区三区免费观看视频 | 久久不射电影网| 亚洲图片欧洲图片av| 久久伊人一区二区| 久久久美女艺术照精彩视频福利播放| 亚洲无亚洲人成网站77777 | 在线观看日韩www视频免费| 日韩视频精品在线| 久久精品99久久香蕉国产色戒| 亚洲欧洲另类国产综合| 欧美成人午夜| 亚洲国产第一| 亚洲午夜电影| 久久精品道一区二区三区| 国产精品日韩久久久久| 黑人一区二区三区四区五区| 免费成人毛片|