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

天行健 君子當自強而不息

【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>
            免费成人网www| 亚洲欧洲在线播放| 久久av资源网站| 亚洲国产美女久久久久| 欧美在线中文字幕| 国产精品免费一区豆花| 亚洲视频一区在线| 亚洲精品日韩精品| 欧美国产日产韩国视频| 亚洲福利视频专区| 噜噜噜91成人网| 久久久99国产精品免费| 国内视频精品| 久久综合五月天婷婷伊人| 欧美一区二区三区四区在线观看地址 | 久久一区二区三区四区五区| 国产午夜精品一区二区三区视频| 欧美一区二区在线播放| 亚洲欧美精品在线观看| 国产视频在线观看一区二区| 久久精品99无色码中文字幕| 久久精品视频免费播放| 国产一区二区三区在线观看免费视频 | 欧美在线亚洲在线| 精品成人乱色一区二区| 狂野欧美一区| 免费一级欧美在线大片| 亚洲精品视频免费观看| 亚洲精品在线三区| 亚洲国产精品一区二区www| 久久久av毛片精品| 亚洲精品日本| 亚洲性感美女99在线| 国产午夜精品久久久久久久| 久久婷婷久久| 欧美伦理在线观看| 欧美一级成年大片在线观看| 久久久国产成人精品| 亚洲三级色网| 午夜精品视频网站| 亚洲激情视频在线播放| 亚洲午夜一区二区| 曰本成人黄色| 亚洲午夜激情网站| 亚洲二区视频在线| 一区二区三区精品久久久| 国产自产女人91一区在线观看| 亚洲国产精品福利| 国产欧美日韩综合一区在线播放| 欧美成人精品在线播放| 国产精品实拍| 亚洲伦理在线免费看| 狠狠色丁香婷综合久久| 99精品国产高清一区二区| 影音先锋成人资源站| 一本色道久久综合亚洲精品婷婷 | 午夜精品亚洲| 欧美精品一区二区三区在线播放 | 精品二区视频| 洋洋av久久久久久久一区| 伊人影院久久| 午夜精品久久久久久久久久久久久| 亚洲三级色网| 久久男人资源视频| 久久久久久久久久久久久女国产乱 | 久久一二三区| 久久精品国产免费| 欧美性大战久久久久久久| 欧美激情视频在线免费观看 欧美视频免费一| 欧美三区视频| 亚洲精品美女久久7777777| 永久久久久久| 久久成人免费电影| 国产精品影视天天线| 99ri日韩精品视频| 亚洲人成在线观看网站高清| 亚洲电影欧美电影有声小说| 狠狠色2019综合网| 一本久久a久久精品亚洲| 在线亚洲电影| 亚洲宅男天堂在线观看无病毒| 亚洲男女自偷自拍| 欧美在线视频一区二区三区| 久久先锋资源| 欧美日韩 国产精品| 国产精品乱子久久久久| 国产视频久久网| 亚洲精品一二三| 欧美一级播放| 亚洲国语精品自产拍在线观看| 欧美国产先锋| 亚洲欧美在线一区| 麻豆国产精品777777在线| 欧美吻胸吃奶大尺度电影| 极品少妇一区二区三区精品视频| 亚洲免费大片| 久久综合中文| 午夜一区不卡| 国产精品家庭影院| 亚洲理论电影网| 欧美 日韩 国产精品免费观看| 亚洲午夜激情免费视频| 欧美韩国日本综合| 亚洲国产精品久久91精品| 午夜伦理片一区| 亚洲一区二区高清视频| 久久av一区| 先锋资源久久| 国产精品一区二区在线| 性欧美长视频| 午夜精品久久久久久99热软件| 国产精品av久久久久久麻豆网| 亚洲精品免费一二三区| 亚洲国产成人精品女人久久久 | 国产精品乱码人人做人人爱| 在线视频一区观看| 日韩一区二区精品葵司在线| 欧美电影在线观看完整版| 亚洲精品欧美激情| 亚洲精品中文字幕在线| 国产精品高潮粉嫩av| 亚洲欧美日韩视频一区| 亚洲视频久久| 狠狠色狠狠色综合日日tαg| 麻豆国产va免费精品高清在线| 久久亚洲午夜电影| 在线中文字幕一区| 亚洲欧美日本国产专区一区| 国产亚洲精品资源在线26u| 久久成人国产精品| 欧美激情视频一区二区三区在线播放| 亚洲日本欧美| 亚洲女性裸体视频| 亚洲国产mv| 亚洲手机成人高清视频| 永久免费精品影视网站| 亚洲日韩成人| 韩国一区二区三区美女美女秀| 亚洲国产1区| 黄色精品免费| 亚洲午夜在线视频| 亚洲美女电影在线| 欧美在线免费观看视频| 一区二区免费看| 久久久亚洲一区| 欧美一区1区三区3区公司| 欧美久久在线| 亚洲大胆在线| 99re这里只有精品6| 最新69国产成人精品视频免费| 欧美一区二区在线看| 亚洲一区二区三区中文字幕| 欧美精品激情在线观看| 亚洲国产欧美日韩| 欧美一区二区三区另类| 欧美亚洲在线| 国产午夜久久久久| 欧美亚洲三区| 麻豆91精品91久久久的内涵| 在线看日韩av| 欧美成人免费小视频| 亚洲欧洲精品成人久久奇米网| 日韩视频―中文字幕| 欧美视频在线观看免费| 亚洲一区www| 免费日韩av| 99国产精品久久久久久久久久 | 狠狠久久亚洲欧美专区| 久久最新视频| 久久婷婷人人澡人人喊人人爽| 亚洲一级在线观看| 亚洲国产一区二区三区a毛片| 国产精品亚洲综合一区在线观看| 欧美日本一区二区三区| 欧美日韩你懂的| 欧美日韩在线亚洲一区蜜芽| 欧美天天在线| 国语自产精品视频在线看抢先版结局| 国产精品人人爽人人做我的可爱| 老牛影视一区二区三区| 欧美中文字幕在线视频| 亚洲欧美一区二区三区极速播放| 亚洲国产成人在线| 久久亚洲影院| 久久婷婷蜜乳一本欲蜜臀| 午夜一级久久| 欧美在线亚洲在线| 久久国产精品久久精品国产| 欧美一区二区日韩| 久久噜噜噜精品国产亚洲综合| 午夜久久久久久| 久久精品国产亚洲一区二区三区| 欧美一区二区三区在线观看| 性8sex亚洲区入口| 久久精品国产亚洲高清剧情介绍| 欧美亚洲视频在线观看| 久久久久久久999精品视频| 蜜乳av另类精品一区二区| 亚洲国产人成综合网站| 亚洲视频在线观看免费|