#include #include StatusBar::StatusBar(Window &mainWindow) : mDisplayWindow(mainWindow), mLastCapLockState(FALSE), mLastNumLockState(FALSE), mLastItemID(-1), mCapLockString("CAPS"), mNumLockString("NUM"), mBlankString(" "), mKeyDownState(FALSE), StatusBarMenu(mainWindow), mLastDisplayString(mBlankString) { mPaintCallback.setCallback(this,&StatusBar::paintHandler); mSetFocusCallback.setCallback(this,&StatusBar::setFocusHandler); mKeyUpCallback.setCallback(this,&StatusBar::keyUpHandler); mKeyDownCallback.setCallback(this,&StatusBar::keyDownHandler); mSizeCallback.setCallback(this,&StatusBar::sizeHandler); mMinMaxCallback.setCallback(this,&StatusBar::minMaxHandler); mMenuSelectCallback.setCallback(this,&StatusBar::menuSelectHandler); mDestroyCallback.setCallback(this,&StatusBar::destroyHandler); mDisplayWindow.insertHandler(VectorHandler::PaintHandler,&mPaintCallback,VectorHandler::FirstHandler); mDisplayWindow.insertHandler(VectorHandler::SetFocusHandler,&mSetFocusCallback); mDisplayWindow.insertHandler(VectorHandler::KeyUpHandler,&mKeyUpCallback); mDisplayWindow.insertHandler(VectorHandler::KeyDownHandler,&mKeyDownCallback); mDisplayWindow.insertHandler(VectorHandler::SizeHandler,&mSizeCallback); mDisplayWindow.insertHandler(VectorHandler::MinMaxHandler,&mMinMaxCallback); mDisplayWindow.insertHandler(VectorHandler::MenuSelectHandler,&mMenuSelectCallback); mDisplayWindow.insertHandler(VectorHandler::DestroyHandler,&mDestroyCallback); ::InvalidateRect(mainWindow,0,TRUE); } StatusBar::StatusBar(GUIWindow &guiWindow) : mDisplayWindow(guiWindow), mLastCapLockState(FALSE), mLastNumLockState(FALSE), mLastItemID(-1), mCapLockString("CAPS"), mNumLockString("NUM"), mBlankString(" "), mKeyDownState(FALSE), mLastDisplayString(mBlankString) { mSetFocusCallback.setCallback(this,&StatusBar::setFocusHandler); mKeyUpCallback.setCallback(this,&StatusBar::keyUpHandler); mKeyDownCallback.setCallback(this,&StatusBar::keyDownHandler); mSizeCallback.setCallback(this,&StatusBar::sizeHandler); mMinMaxCallback.setCallback(this,&StatusBar::minMaxHandler); mMenuSelectCallback.setCallback(this,&StatusBar::menuSelectHandler); mDestroyCallback.setCallback(this,&StatusBar::destroyHandler); mPaintCallback.setCallback(this,&StatusBar::paintHandler); mDisplayWindow.insertHandler(VectorHandler::PaintHandler,&mPaintCallback,VectorHandler::FirstHandler); mDisplayWindow.insertHandler(VectorHandler::SetFocusHandler,&mSetFocusCallback); mDisplayWindow.insertHandler(VectorHandler::KeyUpHandler,&mKeyUpCallback); mDisplayWindow.insertHandler(VectorHandler::KeyDownHandler,&mKeyDownCallback); mDisplayWindow.insertHandler(VectorHandler::SizeHandler,&mSizeCallback); mDisplayWindow.insertHandler(VectorHandler::MinMaxHandler,&mMinMaxCallback); mDisplayWindow.insertHandler(VectorHandler::MenuSelectHandler,&mMenuSelectCallback); mDisplayWindow.insertHandler(VectorHandler::DestroyHandler,&mDestroyCallback); ::InvalidateRect(guiWindow,0,TRUE); } StatusBar::~StatusBar() { removeHandlers(); } CallbackData::ReturnType StatusBar::keyUpHandler(CallbackData &/*someCallbackData*/) { mKeyDownState=FALSE; return (CallbackData::ReturnType)0; } CallbackData::ReturnType StatusBar::keyDownHandler(CallbackData &someCallbackData) { if(!mKeyDownState) { if(VK_CAPITAL==someCallbackData.wParam())setCapLockText(); else if(VK_NUMLOCK==someCallbackData.wParam())setNumLockText(); mKeyDownState=TRUE; } return (CallbackData::ReturnType)0; } CallbackData::ReturnType StatusBar::setFocusHandler(CallbackData &/*someCallbackData*/) { setCapLockText(); setNumLockText(); return (CallbackData::ReturnType)0; } CallbackData::ReturnType StatusBar::destroyHandler(CallbackData &/*someCallbackData*/) { removeHandlers(); return (CallbackData::ReturnType)0; } void StatusBar::removeHandlers(void) { mDisplayWindow.removeHandler(VectorHandler::PaintHandler,&mPaintCallback); mDisplayWindow.removeHandler(VectorHandler::SetFocusHandler,&mSetFocusCallback); mDisplayWindow.removeHandler(VectorHandler::KeyUpHandler,&mKeyUpCallback); mDisplayWindow.removeHandler(VectorHandler::KeyDownHandler,&mKeyDownCallback); mDisplayWindow.removeHandler(VectorHandler::SizeHandler,&mSizeCallback); mDisplayWindow.removeHandler(VectorHandler::MinMaxHandler,&mMinMaxCallback); mDisplayWindow.removeHandler(VectorHandler::MenuSelectHandler,&mMenuSelectCallback); mDisplayWindow.removeHandler(VectorHandler::DestroyHandler,&mDestroyCallback); } void StatusBar::setCapLockText(void) { RECT clientRect; RECT tempRectOne; RECT tempRectTwo; HFONT hOldFont; String tempString; PureDevice windowDevice; WORD capLockLeft; if(::GetKeyState(VK_CAPITAL)&0x0001) { if(TRUE==mLastCapLockState)return; mLastCapLockState=TRUE; tempString=mCapLockString; } else { if(FALSE==mLastCapLockState)return; mLastCapLockState=FALSE; tempString=mBlankString; } windowDevice=mDisplayWindow; ::GetClientRect(mDisplayWindow,(RECT FAR*)&clientRect); clientRect.top=clientRect.bottom-statusBarHeight(); capLockLeft=clientRect.left+systemBorderDeltaTimesNine()+statusInfoWidth(); hOldFont=(HFONT)::SelectObject((HDC)windowDevice,statusFont()); ::SetTextColor((HDC)windowDevice,::GetSysColor(COLOR_BTNTEXT)); ::SetBkColor((HDC)windowDevice,::GetSysColor(COLOR_BTNFACE)); tempRectOne.top=clientRect.top+systemBorderDelta()*4; tempRectOne.bottom=clientRect.bottom-systemBorderDeltaTimesThree(); tempRectOne.left=capLockLeft+systemBorderDeltaTimesNine(); tempRectOne.right=tempRectOne.left+stateInfoWidth()-systemBorderDelta(); tempRectTwo=tempRectOne; ::ExtTextOut((HDC)windowDevice,tempRectOne.left+systemBorderDeltaTimesTwo(),tempRectOne.top, ETO_OPAQUE|ETO_CLIPPED,&tempRectTwo,(LPSTR)tempString,tempString.length(),0); ::SelectObject((HDC)windowDevice,hOldFont); } void StatusBar::setNumLockText(void) { RECT clientRect; RECT tempRectOne; RECT tempRectTwo; HFONT hOldFont; WORD numLockLeft; WORD capLockLeft; PureDevice windowDevice; String tempString; if(::GetKeyState(VK_NUMLOCK)&0x0001) { if(TRUE==mLastNumLockState)return; mLastNumLockState=TRUE; tempString=mNumLockString; } else { if(FALSE==mLastNumLockState)return; mLastNumLockState=FALSE; tempString=mBlankString; } windowDevice=mDisplayWindow; ::GetClientRect(mDisplayWindow,(RECT FAR*)&clientRect); clientRect.top=clientRect.bottom-statusBarHeight(); capLockLeft=clientRect.left+systemBorderDeltaTimesNine()+statusInfoWidth(); numLockLeft=capLockLeft+systemBorderDeltaTimesNine()+stateInfoWidth(); hOldFont=(HFONT)::SelectObject((HDC)windowDevice,statusFont()); ::SetTextColor((HDC)windowDevice,::GetSysColor(COLOR_BTNTEXT)); ::SetBkColor((HDC)windowDevice,::GetSysColor(COLOR_BTNFACE)); tempRectOne.top=clientRect.top+systemBorderDelta()*4; tempRectOne.bottom=clientRect.bottom-systemBorderDeltaTimesThree(); tempRectOne.left=numLockLeft+systemBorderDeltaTimesNine(); tempRectOne.right=tempRectOne.left+stateInfoWidth()-systemBorderDelta(); tempRectTwo=tempRectOne; ::ExtTextOut((HDC)windowDevice,tempRectOne.left+systemBorderDeltaTimesTwo(), tempRectOne.top,ETO_OPAQUE | ETO_CLIPPED,&tempRectTwo,(LPSTR)tempString,tempString.length(),0); ::SelectObject(windowDevice,hOldFont); } CallbackData::ReturnType StatusBar::sizeHandler(CallbackData &/*someCallbackData*/) { RECT clientRect; ::GetClientRect(mDisplayWindow,(RECT FAR*)&clientRect); clientRect.top=clientRect.bottom-statusBarHeight(); if(clientRect.top menuLabels; for(int itemIndex=0;itemIndex