f2dInputMouseImpl::f2dInputMouseImpl(f2dInputSysImpl* pSys, HWND Win, const GUID& pGUID, fBool bGlobalFocus) : m_pSys(pSys), m_pDev(NULL), m_DefaultListener(pSys), m_pListener(&m_DefaultListener), m_TotalOffsetX(0), m_TotalOffsetY(0), m_TotalOffsetZ(0) { IDirectInput8* pDev = pSys->GetHandle(); memset(m_BtnState, 0, sizeof(m_BtnState)); HRESULT tHR = pDev->CreateDevice(pGUID, &m_pDev, NULL); if(FAILED(tHR)) throw fcyWin32COMException("f2dInputMouseImpl::f2dInputMouseImpl", "CreateDevice Failed.", tHR); // 设置协作模式 fuInt tFlag = DISCL_NONEXCLUSIVE; if(bGlobalFocus) tFlag |= DISCL_BACKGROUND; else tFlag |= DISCL_FOREGROUND; tHR = m_pDev->SetCooperativeLevel(Win, tFlag); if(FAILED(tHR)) { FCYSAFEKILL(m_pDev); throw fcyWin32COMException("f2dInputMouseImpl::f2dInputMouseImpl", "SetCooperativeLevel Failed.", tHR); } // 设置数据格式 tHR = m_pDev->SetDataFormat(&DIDF_Mouse); if(FAILED(tHR)) { FCYSAFEKILL(m_pDev); throw fcyWin32COMException("f2dInputMouseImpl::f2dInputMouseImpl", "SetDataFormat Failed.", tHR); } // 设置缓冲区 DIPROPDWORD tBufferProperty; tBufferProperty.diph.dwSize = sizeof(DIPROPDWORD); tBufferProperty.diph.dwHeaderSize = sizeof(DIPROPHEADER); tBufferProperty.diph.dwObj = 0; tBufferProperty.diph.dwHow = DIPH_DEVICE; tBufferProperty.dwData = BufferSize; tHR = m_pDev->SetProperty(DIPROP_BUFFERSIZE, &tBufferProperty.diph); if(FAILED(tHR)) { FCYSAFEKILL(m_pDev); throw fcyWin32COMException("f2dInputMouseImpl::f2dInputMouseImpl", "SetProperty Failed.", tHR); } // 获得设备 tHR = m_pDev->Acquire(); // 注册 m_pSys->RegisterDevice(this); }
f2dSoundSysImpl::f2dSoundSysImpl(f2dEngineImpl* pEngine) : m_pEngine(pEngine) { // 使用默认回放设备创建DSound HRESULT tHR; tHR = m_API.DLLEntry_DirectSoundCreate8(NULL, &m_pDSound8, NULL); if(FAILED(tHR)) throw fcyWin32COMException("f2dSoundSysImpl::f2dSoundSysImpl", "DirectSoundCreate8 Failed", tHR); // 设置设备协作性 tHR = m_pDSound8->SetCooperativeLevel((HWND)pEngine->GetMainWindow()->GetHandle(), DSSCL_PRIORITY); if(FAILED(tHR)) throw fcyWin32COMException("f2dSoundSysImpl::f2dSoundSysImpl", "SetCooperativeLevel Failed.", tHR); }
fResult f2dSoundSysImpl::CreateSharedStaticBuffer(f2dSoundBuffer* pOrg, f2dSoundBuffer** pOut) { if(!pOrg || !pOut) return FCYERR_INVAILDPARAM; *pOut = NULL; if(pOrg->IsDynamic()) return FCYERR_ILLEGAL; IDirectSoundBuffer* tpOut = NULL; HRESULT tHR = m_pDSound8->DuplicateSoundBuffer(((f2dSoundBufferStatic*)pOrg)->m_pBuffer, &tpOut); if(FAILED(tHR)) { m_pEngine->ThrowException(fcyWin32COMException("f2dSoundSysImpl::CreateSharedStaticBuffer", "DuplicateSoundBuffer failed.", tHR)); return FCYERR_INTERNALERR; } f2dSoundBufferStatic* tRet = new f2dSoundBufferStatic(tpOut); *pOut = tRet; return FCYERR_OK; }
f2dInputJoystickImpl::f2dInputJoystickImpl(f2dInputSysImpl* pSys, HWND Win, const GUID& pGUID, bool bGlobalFocus) : m_pSys(pSys), m_pDev(NULL), m_DefaultListener(pSys), m_pListener(&m_DefaultListener), m_lXHalf(0), m_lXHalfLen(0), m_lYHalf(0), m_lYHalfLen(0), m_lZHalf(0), m_lZHalfLen(0), m_lRxHalf(0), m_lRxHalfLen(0), m_lRyHalf(0), m_lRyHalfLen(0), m_lRzHalf(0), m_lRzHalfLen(0), m_lX(0.f), m_lY(0.f), m_lZ(0.f), m_lRx(0.f), m_lRy(0.f), m_lRz(0.f) { IDirectInput8* pDev = pSys->GetHandle(); memset(m_ButtonDown, 0, sizeof(m_ButtonDown)); memset(m_Slider, 0, sizeof(m_Slider)); memset(m_POV, 0, sizeof(m_POV)); HRESULT tHR = pDev->CreateDevice(pGUID, &m_pDev, NULL); if(FAILED(tHR)) throw fcyWin32COMException("f2dInputJoystickImpl::f2dInputJoystickImpl", "CreateDevice Failed.", tHR); // ÉèÖÃÐ×÷ģʽ fuInt tFlag = DISCL_NONEXCLUSIVE; if(bGlobalFocus) tFlag |= DISCL_BACKGROUND; else tFlag |= DISCL_FOREGROUND; tHR = m_pDev->SetCooperativeLevel(Win, tFlag); if(FAILED(tHR)) { FCYSAFEKILL(m_pDev); throw fcyWin32COMException("f2dInputJoystickImpl::f2dInputJoystickImpl", "SetCooperativeLevel Failed.", tHR); } // ÉèÖÃÊý¾Ý¸ñʽ tHR = m_pDev->SetDataFormat(&DIDF_Joystick); if(FAILED(tHR)) { FCYSAFEKILL(m_pDev); throw fcyWin32COMException("f2dInputJoystickImpl::f2dInputJoystickImpl", "SetDataFormat Failed.", tHR); } // ÉèÖûº³åÇø DIPROPDWORD tBufferProperty; tBufferProperty.diph.dwSize = sizeof(DIPROPDWORD); tBufferProperty.diph.dwHeaderSize = sizeof(DIPROPHEADER); tBufferProperty.diph.dwObj = 0; tBufferProperty.diph.dwHow = DIPH_DEVICE; tBufferProperty.dwData = BufferSize; tHR = m_pDev->SetProperty(DIPROP_BUFFERSIZE, &tBufferProperty.diph); if(FAILED(tHR)) { FCYSAFEKILL(m_pDev); throw fcyWin32COMException("f2dInputJoystickImpl::f2dInputJoystickImpl", "SetProperty Failed.", tHR); } initStates(); // »ñµÃÉ豸 tHR = m_pDev->Acquire(); // ×¢²á m_pSys->RegisterDevice(this); }