DirectInput之查詢滑鼠

DirectInput之查詢滑鼠

在windows你可以通過WM_MOUSEMOVE被動(消息驅動)接受滑鼠當前位置.但若在遊戲中若想得到滑鼠『偏移量』和『按扭』(是否按下)DirectInput則可以幫助你你重新獲得滑鼠每次『偏移量』和『按扭』信息(主動讀取).然後讓你可以重新繪畫新『指標』. 而無需Windows自帶『指標』.若你有多個滑鼠.則所有『偏移量』合併到單一設備中.

滑鼠移動演示程式:下載

演示代碼.在Init()中調用

1.調用DirectInputCreate()生成IDirectInput接口

IDirectInput * direct_input;

DirectInputCreate(GetModuleHandle(NULL),DIRECTINPUT_VERSION, &direct_input,NULL);

2.獲取滑鼠GUID_SysMouse為全域主滑鼠設備ID碼

direct_input->CreateDevice(GUID_SysMouse, &direct_mouse, NULL);

3.設置滑鼠協作等級(前臺) 非獨占訪問,訪問滑鼠時不會干涉其它應用程序訪問該滑鼠.當應用程序在前臺和後臺時都能時用該滑鼠.

direct_mouse->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE |                                             DISCL_BACKGROUND);

4.設置數據格式. c_dfDIMouse為DirectInput通用滑鼠全域常量

direct_mouse->SetDataFormat(&c_dfDIMouse);

5.從DirectInput獲取滑鼠

direct_mouse->Acquire();

6.載入滑鼠紋理,並且背景透明

mouse->texture.IsAlpha = true;

Load_File_Texture(&mouse->texture, hInstance, filename);

7.綁定紋理

Bind_Image_Texture(&mouse->texture,GL_REPEAT, GL_REPEAT,GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR,GL_REPLACE);

8.滑鼠尺寸

mouse_size = 20;

9.現在你可以從滑鼠中獲取輸入.在你Update()更新中獲取滑鼠狀態.若你失去設備鍵盤,需要重新從DirectInput獲取鍵盤.

DIMOUSESTATE  state;

while (direct_mouse->GetDeviceState(sizeof(DIMOUSESTATE), &state) == DIERR_INPUTLOST)//

{         // 已失去設備,重新從DirectInput獲取鍵盤

if (direct_mouse->Acquire()==S_OK)

return false;

}

10.定義鼠標結構

typedef struct DIMOUSE_TYP{

int x, y;// 滑鼠座標

int screen_width, screen_height;// 窗口寬和高

float size;// 鼠標尺寸

bool button_left, button_right, button_middle; // 滑鼠按鈕,若true則為按下

TEXTURE texture;// 指標紋理

}DIMOUSE, *DIMOUSE_PTR;

DIMOUSE mouse;

11.重新計算滑鼠位置

mouse->x = mouse->x + state.lX;

mouse->y = mouse->y + state.lY;

12.判斷是否超出窗口邊界

if (mouse->x < 0)

mouse->x = 0;

if (mouse->x >= screen_width)

mouse->x = screen_width-1;

if (mouse->y < 0)

mouse->y = 0;

if (mouse->y >= screen_height)

mouse->y = screen_height – 1;

13.提取滑鼠按鈕

mouse->button_left = state.rgbButtons[0] & 0x80; //滑鼠左鍵

mouse->button_right = state.rgbButtons[1] & 0x80; // 滑鼠右鍵

mouse->button_middle = state.rgbButtons[2] & 0x80;// 滑鼠中鍵

14.當你退出遊戲時.需要釋放滑鼠和DirectInput對像

direct_mouse->Release();

direct_input->Release();

 

評論