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