📄 cdinput.cpp
字号:
// CDInput.cpp: implementation of the CDInput class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CDInput.h"
#include "normal.h"
#include <memory>
#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;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -