www.pudn.com > GameEngine_src.rar > CDInput.cpp
// CDInput.cpp: implementation of the CDInput class. // ////////////////////////////////////////////////////////////////////// #include "CDInput.h" #include "normal.h" #include#pragma comment( lib, "dinput8.lib" ) const BYTE KEY_DOWN = 1; const BYTE KEY_UP = 0; const int ITEMS_NUM = 16; LPDIRECTINPUT8 CDInput::g_lpDI = NULL; int CDInput::g_iRef = NULL; ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// CDInput::CDInput() { } CDInput::~CDInput() { } ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// bool CDInput::InitDInput( HINSTANCE hInstance ) { if ( g_lpDI == NULL ) { if ( DirectInput8Create( hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_lpDI, NULL ) != DI_OK ) { return false; } ++g_iRef; } else ++g_iRef; return true; } ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// void CDInput::FreeDInput() { --g_iRef; if ( g_iRef == 0 && g_lpDI != NULL ) { g_lpDI->Release(); g_lpDI = NULL; } } //***************************************健盘类实现************************************************ ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// CDIKeyBoard::CDIKeyBoard() { m_lpKeyBoardDevice = NULL; m_KeyStateBuffer = NULL; m_KeyBuffer = NULL; } ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// CDIKeyBoard::~CDIKeyBoard() { } ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// bool CDIKeyBoard::Init( HWND hwnd, HINSTANCE hInstance ) { if ( InitDInput( hInstance ) == false ) return false; //获取键盘设备: if ( g_lpDI->CreateDevice( GUID_SysKeyboard, &m_lpKeyBoardDevice, NULL ) != DI_OK ) { return false; } if ( m_lpKeyBoardDevice->SetDataFormat( &c_dfDIKeyboard ) != DI_OK ) { return false; } if ( m_lpKeyBoardDevice->SetCooperativeLevel( hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE ) != DI_OK ) { return false; } if ( m_lpKeyBoardDevice->Acquire() != DI_OK ) { return false; } m_KeyStateBuffer = new BYTE[256]; if ( m_KeyStateBuffer == NULL ) return false; m_KeyBuffer = new BYTE[256]; if ( m_KeyBuffer == NULL ) return false; memset( m_KeyStateBuffer, 0, 256 ); memset( m_KeyBuffer, 0, 256 ); return true; } ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// void CDIKeyBoard::Free() { if ( g_lpDI != NULL ) { if ( m_lpKeyBoardDevice != NULL ) { SafeDeleteArray( m_KeyStateBuffer ); SafeDeleteArray( m_KeyBuffer ); m_lpKeyBoardDevice->Unacquire(); m_lpKeyBoardDevice->Release(); m_lpKeyBoardDevice = NULL; } FreeDInput(); } } ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// void CDIKeyBoard::UpdateKeyBoard() { if ( m_lpKeyBoardDevice->GetDeviceState( 256, (void*)&m_KeyBuffer[0] ) != DI_OK ) { //MessageBox( NULL, "failed", NULL, NULL ); m_lpKeyBoardDevice->Acquire(); } } ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// bool CDIKeyBoard::IsKeyRelease( int key_id ) { bool re = false; if ( m_KeyBuffer[ key_id ] & 0x80 ) { m_KeyStateBuffer[key_id] = KEY_DOWN; } else { if ( m_KeyStateBuffer[key_id] == KEY_DOWN ) re = true; m_KeyStateBuffer[key_id] = KEY_UP; } return re; } ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// bool CDIKeyBoard::IsKeyPress( int key_id ) { bool re = false; if ( m_KeyBuffer[ key_id ] & 0x80 ) { if ( m_KeyStateBuffer[key_id] == KEY_UP ) re = true; m_KeyStateBuffer[key_id] = KEY_DOWN; } else { m_KeyStateBuffer[key_id] = KEY_UP; } return re; } //******************************************鼠标类实现********************************************** ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// CDIMouse::CDIMouse() { m_lpDIMouse = NULL; m_IsLBDown = false; m_IsRBDown = false; m_bLBState = false; m_bRBState = false; } ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// CDIMouse::~CDIMouse() { } ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// bool CDIMouse::Init( HWND hwnd, HINSTANCE hInstance ) { if ( InitDInput( hInstance ) == false ) return false; //获取鼠标设备: if ( g_lpDI->CreateDevice( GUID_SysMouse, &m_lpDIMouse, NULL ) != DI_OK ) { return false; } //设置数据格式 if ( m_lpDIMouse->SetDataFormat( &c_dfDIMouse ) != DI_OK ) { return false; } //设置协调级别 if ( m_lpDIMouse->SetCooperativeLevel( hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE ) != DI_OK ) { return false; } m_hMouseEvent = CreateEvent( NULL, false, false, NULL ); if ( m_hMouseEvent == NULL ) { return false; } if ( m_lpDIMouse->SetEventNotification( m_hMouseEvent ) != DI_OK ) { return false; } //设置鼠标设备属性 DIPROPDWORD dip; dip.diph.dwSize = sizeof( DIPROPDWORD ); dip.diph.dwHeaderSize = sizeof( DIPROPHEADER ); dip.diph.dwObj = 0; dip.diph.dwHow = DIPH_DEVICE; dip.dwData = ITEMS_NUM; if ( m_lpDIMouse->SetProperty( DIPROP_BUFFERSIZE, &dip.diph ) != DI_OK ) { return false; } if ( m_lpDIMouse->Acquire() != DI_OK ) { return false; } return true; } ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// void CDIMouse::Free() { if ( g_lpDI != NULL ) { if ( m_lpDIMouse != NULL ) { m_lpDIMouse->Unacquire(); m_lpDIMouse->Release(); m_lpDIMouse = NULL; } FreeDInput(); } } ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// void CDIMouse::Reset() { m_IsLBDown = false; m_IsRBDown = false; m_bLBState = false; m_bRBState = false; } ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// void CDIMouse::UpdateMouse( HWND hwnd ) { HRESULT hr; DIDEVICEOBJECTDATA data; DWORD dwReadNum = 1; GetCursorPos( &m_MousePoint ); ScreenToClient( hwnd, &m_MousePoint ); m_IsMoving = false; while ( 1 ) { hr = m_lpDIMouse->GetDeviceData(sizeof(data), &data, &dwReadNum, 0); if FAILED(hr) { if(hr == DIERR_INPUTLOST) { m_lpDIMouse->Acquire(); break; } else break; //别少了 } else { if( dwReadNum == 1 ) { if ( data.dwOfs == DIMOFS_BUTTON0 ) { if ( data.dwData & 0x80 ) m_IsLBDown = true; //处理鼠标左键 else m_IsLBDown = false; break; } else if ( data.dwOfs == DIMOFS_BUTTON1 ) { if ( data.dwData & 0x80 ) m_IsRBDown = true; //处理鼠标右键 else m_IsRBDown = false; break; } else if ( data.dwOfs == DIMOFS_X || data.dwOfs == DIMOFS_Y ) m_IsMoving = true; } else if ( dwReadNum == 0 ) break; } } m_IsLRelease = false; m_IsLPress = false; if ( m_IsLBDown ) { if ( !m_bLBState ) m_IsLPress = true; m_bLBState = true; } else { if ( m_bLBState ) m_IsLRelease = true; m_bLBState = false; } m_IsRRelease = false; m_IsRPress = false; if ( m_IsRBDown ) { if ( !m_bRBState ) m_IsRPress = true; m_bRBState = true; } else { if ( m_bRBState ) m_IsRRelease = true; m_bRBState = false; } }