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); }
f2dInputMouseImpl::~f2dInputMouseImpl() { if(m_pDev) m_pDev->Unacquire(); // 释放 m_pSys->UnregisterDevice(this); FCYSAFEKILL(m_pDev); }
f2dInputJoystickImpl::~f2dInputJoystickImpl() { if(m_pDev) m_pDev->Unacquire(); // È¡Ïû×¢²á m_pSys->UnregisterDevice(this); FCYSAFEKILL(m_pDev); }
fResult f2dFontRendererImpl::SetFontProvider(f2dFontProvider* pProvider) { if(m_pProvider == pProvider) return FCYERR_OK; FCYSAFEKILL(m_pProvider); m_pProvider = pProvider; if (m_pProvider) m_pProvider->AddRef(); return FCYERR_OK; }
f2dSoundSysImpl::~f2dSoundSysImpl() { FCYSAFEKILL(m_pDSound8); }
f2dFontRendererImpl::~f2dFontRendererImpl() { FCYSAFEKILL(m_pProvider); }
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); }
ffDrawerImpl::~ffDrawerImpl() { FCYSAFEKILL(m_pGeometryRenderer); FCYSAFEKILL(m_pFont); s_pSingleton = NULL; }