#ifndef _UEVTTMR_H #define _UEVTTMR_H #include "dpa.h" typedef struct { HWND hWnd; UINT uCallbackMessage; ULONG uUserEventTimerID; UINT uTimerElapse; UINT uIntervalCountdown; IUserEventTimerCallback * pUserEventTimerCallback; BOOL bFirstTime; } USEREVENTINFO; #define MIN_TIMER_THRESHOLD 0.1 #define MAX_TIMER_THRESHOLD 0.01 class CUserEventTimer : public IUserEventTimer { public: // *** IUnknown *** STDMETHODIMP QueryInterface(REFIID riid, void ** ppvObj); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); // *** IUserEventTimer *** STDMETHODIMP SetUserEventTimer( HWND hWnd, UINT uCallbackMessage, UINT uTimerElapse, IUserEventTimerCallback * pUserEventTimerCallback, ULONG * puUserEventTimerID); STDMETHODIMP KillUserEventTimer(HWND hWnd, ULONG uUserEventTimerID); STDMETHODIMP GetUserEventTimerElapsed(HWND hWnd, ULONG uUserEventTimerID, UINT * puTimerElapsed); STDMETHODIMP InitTimerTickInterval(UINT uTimerTickIntervalMs); CUserEventTimer(); virtual ~CUserEventTimer(); HRESULT Init(); static STDMETHODIMP_(int) s_DeleteCB(LPVOID pData1, LPVOID pData2); LRESULT v_WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam); protected: static const UINT_PTR TIMER_ID = 1000; static const UINT TIMER_ELAPSE = 5000; // 5 seconds static const ULONG MIN_TIMER_ID = 0x00001000; static const ULONG MAX_TIMER_ID = 0xDDDD1000; // static const DWORD MIN_TIMER_LENGTH = 4500; // 4.5 seconds // static const DWORD MAX_TIMER_LENGTH = 5002; // 5 seconds + 2 milliseconds static LRESULT CALLBACK s_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL _CreateWindow(); void _Destroy(); void _OnTimer(); void _KillIntervalTimer(); int _GetTimerDetailsIndex(HWND hWnd, ULONG uUserEventTimerID); HRESULT _SetUserEventTimer( HWND hWnd, UINT uCallbackMessage, UINT uNumIntervals, IUserEventTimerCallback * pUserEventTimerCallback, ULONG * puUserEventTimerID); HRESULT _ResetUserEventTimer(HWND hWnd, UINT uCallbackMessage, UINT uNumIntervals, int nIndex); ULONG _GetNextInternalTimerID(HWND hWnd); inline BOOL _IsAssignedTimerID(HWND hWnd, ULONG uUserEventTimerID) { return (_GetTimerDetailsIndex(hWnd, uUserEventTimerID) >= 0); } inline UINT _CalcNumIntervals(UINT uTimerElapse) { return (UINT)(uTimerElapse/m_uTimerTickInterval); } inline UINT _CalcMilliSeconds(UINT uIntervalCountdown) { return (UINT) (uIntervalCountdown*m_uTimerTickInterval); } LONG m_cRef; CDPA _dpaUserEventInfo; UINT_PTR _uUserTimerID; HWND m_hWnd; DWORD m_dwUserStartTime; UINT m_uTimerTickInterval; }; #endif // _UEVTTMR_H