在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();