Files
Work/common/WINTIMER.CPP
2024-08-07 09:09:36 -04:00

149 lines
2.9 KiB
C++
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include <common/wintimer.hpp>
#include <common/except.hpp>
char WinTimer::smszClassName[]="WINTIMER";
char WinTimer::smszMenuName[]="";
WinTimer::WinTimer(HINSTANCE hProcessInstance)
: mTimerHandler(this,&WinTimer::timerHandler),
mIsOkay(FALSE), mTimerID(InvalidID), mhInstance(hProcessInstance)
{
initWinTimer();
}
WinTimer::WinTimer(const Window &someWindow)
: mTimerHandler(this,&WinTimer::timerHandler),
mIsOkay(FALSE), mTimerID(InvalidID), mhInstance(someWindow.processInstance())
{
initWinTimer();
}
void WinTimer::initWinTimer(void)
{
Window::insertHandler(VectorHandler::TimerHandler,&mTimerHandler);
registerClass();
createWindow();
mIsOkay=TRUE;
}
WinTimer::~WinTimer()
{
if((HWND)*this){stopTimer();destroy();}
Window::removeHandler(VectorHandler::TimerHandler,&mTimerHandler);
}
void WinTimer::registerClass(void)
{
WNDCLASS wndClass;
if(::GetClassInfo(mhInstance,smszClassName,(WNDCLASS FAR*)&wndClass))return;
wndClass.style =CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
wndClass.lpfnWndProc =(WNDPROC)Window::WndProc;
wndClass.cbClsExtra =0;
wndClass.cbWndExtra =sizeof(WinTimer*);
wndClass.hInstance =mhInstance;
wndClass.hIcon =::LoadIcon(NULL,IDI_APPLICATION);
wndClass.hCursor =::LoadCursor(NULL,IDC_ARROW);
wndClass.hbrBackground =(HBRUSH)::GetStockObject(BLACK_BRUSH);
wndClass.lpszMenuName =smszMenuName;
wndClass.lpszClassName =smszClassName;
::RegisterClass(&wndClass);
if(0==::GetClassInfo(mhInstance,smszClassName,(WNDCLASS FAR*)&wndClass))throw(NullError());
}
void WinTimer::createWindow(void)
{
::CreateWindow(smszClassName,smszMenuName,
WS_OVERLAPPED,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,mhInstance,(LPSTR)this);
show(SW_HIDE);
update();
}
WORD WinTimer::startTimer(UINT delayTime)
{
if(!(HWND)*this)return FALSE;
if(TimerID==mTimerID)return FALSE;
return setTimer(mTimerID=TimerID,delayTime);
}
WORD WinTimer::stopTimer(void)
{
WORD returnCode(FALSE);
if(!(HWND)*this)return returnCode;
if(InvalidID==mTimerID)return returnCode;
returnCode=killTimer(mTimerID);
mTimerID=InvalidID;
return returnCode;
}
CallbackData::ReturnType WinTimer::timerHandler(CallbackData &someCallbackData)
{
size_t size(mCallbackVector.size());
for(int vectorIndex=0;vectorIndex<size;vectorIndex++)
mCallbackVector[vectorIndex].callback(someCallbackData);
return (CallbackData::ReturnType)FALSE;
}
WORD WinTimer::insertHandler(PureCallback *lpCallback)
{
mCallbackVector.insert(&CallbackPointer(lpCallback));
return mCallbackVector.size();
}
void WinTimer::removeHandler(PureCallback *lpCallback)
{
size_t size((size_t)mCallbackVector.size());
for(int vectorIndex=0;vectorIndex<size;vectorIndex++)
{
if(mCallbackVector[vectorIndex]==lpCallback)
{
mCallbackVector.remove(vectorIndex);
size=(size_t)mCallbackVector.size();
vectorIndex=-1;
}
}
}