📄 calcapp.cpp
字号:
// CalcApp.cpp//// Calculator using the wGui library////// Copyright (c) 2002 Rob Wiskow// rob-dev@boxedchaos.com//// This library is free software; you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public// License as published by the Free Software Foundation; either// version 2.1 of the License, or (at your option) any later version.//// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU// Lesser General Public License for more details.//// You should have received a copy of the GNU Lesser General Public// License along with this library; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA//#include "wgui.h"#include <iostream>#include <stdlib.h>using namespace std;class CCalcView : public wGui::CView{public: CCalcView(void); virtual bool HandleMessage(wGui::CMessage* pMessage);protected: void DoCalc(void); void UpdateDisplay(void); void Add(void); void Sub(void); void Clear(void); void Equal(void); wGui::CButton* m_pBtnNum[10]; wGui::CButton* m_pBtnClear; wGui::CButton* m_pBtnEquals; wGui::CButton* m_pBtnPlus; wGui::CButton* m_pBtnMinus; wGui::CEditBox* m_pDisplay; int m_iDisplay; int m_iRegister; bool m_fAltPressed; enum ECalcMode { MODE_NOP, MODE_ADD, MODE_SUB } m_eCalcMode;};class CCalcApp : public wGui::CApplication{public: CCalcApp(int argc, char **argv) : CApplication(argc, argv) { m_pCalcView = 0; } ~CCalcApp(void) { delete m_pCalcView; } virtual void Init(void) { CApplication::Init(); m_pCalcView = new CCalcView(); }protected: CCalcView* m_pCalcView;};CCalcView::CCalcView(void) : wGui::CView(wGui::CRect(0, 0, 170, 210), "wGui Calculator", false), m_iDisplay(0), m_iRegister(0), m_eCalcMode(MODE_NOP){ SetWindowText(std::string("wGui Calculator - wGui version ") + wGui::CwgStringResourceHandle(wGui::WGRES_VERSION_STRING).String()); wGui::CMessageServer::Instance().RegisterMessageClient(this, wGui::CMessage::CTRL_LCLICK); wGui::CMessageServer::Instance().RegisterMessageClient(this, wGui::CMessage::KEYBOARD_KEYDOWN); wGui::CMessageServer::Instance().RegisterMessageClient(this, wGui::CMessage::KEYBOARD_KEYUP); m_pDisplay = new wGui::CEditBox(wGui::CRect(10, 10, 150, 30), this); m_pDisplay->SetWindowText("0"); m_pDisplay->SetReadOnly(true); m_pBtnNum[7] = new wGui::CButton(wGui::CRect(10, 50, 40, 80), this, "7"); m_pBtnNum[8] = new wGui::CButton(wGui::CRect(50, 50, 80, 80), this, "8"); m_pBtnNum[9] = new wGui::CButton(wGui::CRect(90, 50, 120, 80), this, "9"); m_pBtnClear = new wGui::CButton(wGui::CRect(130, 50, 160, 80), this, "C"); m_pBtnNum[4] = new wGui::CButton(wGui::CRect(10, 90, 40, 120), this, "4"); m_pBtnNum[5] = new wGui::CButton(wGui::CRect(50, 90, 80, 120), this, "5"); m_pBtnNum[6] = new wGui::CButton(wGui::CRect(90, 90, 120, 120), this, "6"); m_pBtnPlus = new wGui::CButton(wGui::CRect(130, 90, 160, 120), this, "+"); m_pBtnNum[1] = new wGui::CButton(wGui::CRect(10, 130, 40, 160), this, "1"); m_pBtnNum[2] = new wGui::CButton(wGui::CRect(50, 130, 80, 160), this, "2"); m_pBtnNum[3] = new wGui::CButton(wGui::CRect(90, 130, 120, 160), this, "3"); m_pBtnMinus = new wGui::CButton(wGui::CRect(130, 130, 160, 160), this, "-"); m_pBtnNum[0] = new wGui::CButton(wGui::CRect(10, 170, 40, 200), this, "0"); m_pBtnEquals = new wGui::CButton(wGui::CRect(50, 170, 120, 200), this, "="); m_fAltPressed = false;}bool CCalcView::HandleMessage(wGui::CMessage* pMessage){ bool bHandled = false; if (pMessage) { switch (pMessage->MessageType()) { case wGui::CMessage::CTRL_LCLICK: if (pMessage->Destination() == this) { bHandled = true; const wGui::CMessageClient* pSource = pMessage->Source(); if (pSource == m_pBtnClear) { Clear(); } else if (pSource == m_pBtnPlus) { Add(); } else if (pSource == m_pBtnMinus) { Sub(); } else if (pSource == m_pBtnEquals) { Equal(); } else if (pSource != 0) { bHandled = false; for (int i = 0; i <= 9; ++i) { if (pSource == m_pBtnNum[i]) { m_iDisplay = m_iDisplay * 10 + i; bHandled = true; break; //exit for loop } } } UpdateDisplay(); } break; case wGui::CMessage::KEYBOARD_KEYDOWN: { wGui::CKeyboardMessage* pKeyboardMessage = dynamic_cast<wGui::CKeyboardMessage*>(pMessage); if (pKeyboardMessage) { switch (pKeyboardMessage->Key) { case SDLK_KP0: case SDLK_0: m_pBtnNum[0]->SetButtonState(wGui::CButton::DOWN); m_iDisplay = m_iDisplay * 10; break; case SDLK_KP1: case SDLK_1: m_pBtnNum[1]->SetButtonState(wGui::CButton::DOWN); m_iDisplay = m_iDisplay * 10 + 1; break; case SDLK_KP2: case SDLK_2: m_pBtnNum[2]->SetButtonState(wGui::CButton::DOWN); m_iDisplay = m_iDisplay * 10 + 2; break; case SDLK_KP3: case SDLK_3: m_pBtnNum[3]->SetButtonState(wGui::CButton::DOWN); m_iDisplay = m_iDisplay * 10 + 3; break; case SDLK_KP4: case SDLK_4: m_pBtnNum[4]->SetButtonState(wGui::CButton::DOWN); m_iDisplay = m_iDisplay * 10 + 4; break; case SDLK_KP5: case SDLK_5: m_pBtnNum[5]->SetButtonState(wGui::CButton::DOWN); m_iDisplay = m_iDisplay * 10 + 5; break; case SDLK_KP6: case SDLK_6: m_pBtnNum[6]->SetButtonState(wGui::CButton::DOWN); m_iDisplay = m_iDisplay * 10 + 6; break; case SDLK_KP7: case SDLK_7: m_pBtnNum[7]->SetButtonState(wGui::CButton::DOWN); m_iDisplay = m_iDisplay * 10 + 7; break; case SDLK_KP8: case SDLK_8: m_pBtnNum[8]->SetButtonState(wGui::CButton::DOWN); m_iDisplay = m_iDisplay * 10 + 8; break; case SDLK_KP9: case SDLK_9: m_pBtnNum[9]->SetButtonState(wGui::CButton::DOWN); m_iDisplay = m_iDisplay * 10 + 9; break; case SDLK_KP_PLUS: m_pBtnPlus->SetButtonState(wGui::CButton::DOWN); Add(); break; case SDLK_KP_MINUS: m_pBtnMinus->SetButtonState(wGui::CButton::DOWN); Sub(); break; case SDLK_KP_ENTER: m_pBtnEquals->SetButtonState(wGui::CButton::DOWN); Equal(); break; case SDLK_ESCAPE: m_pBtnClear->SetButtonState(wGui::CButton::DOWN); Clear(); break; case SDLK_BACKSPACE: m_iDisplay = m_iDisplay / 10; break; case SDLK_LALT: case SDLK_RALT: m_fAltPressed = true; break; default: break; } //Don't set bHandled to true, someone else might want to do something with this message UpdateDisplay(); } break; } case wGui::CMessage::KEYBOARD_KEYUP: { wGui::CKeyboardMessage* pKeyboardMessage = dynamic_cast<wGui::CKeyboardMessage*>(pMessage); if (pKeyboardMessage) { switch (pKeyboardMessage->Key) { case SDLK_KP0: case SDLK_0: m_pBtnNum[0]->SetButtonState(wGui::CButton::UP); break; case SDLK_KP1: case SDLK_1: m_pBtnNum[1]->SetButtonState(wGui::CButton::UP); break; case SDLK_KP2: case SDLK_2: m_pBtnNum[2]->SetButtonState(wGui::CButton::UP); break; case SDLK_KP3: case SDLK_3: m_pBtnNum[3]->SetButtonState(wGui::CButton::UP); break; case SDLK_KP4: case SDLK_4: m_pBtnNum[4]->SetButtonState(wGui::CButton::UP); break; case SDLK_KP5: case SDLK_5: m_pBtnNum[5]->SetButtonState(wGui::CButton::UP); break; case SDLK_KP6: case SDLK_6: m_pBtnNum[6]->SetButtonState(wGui::CButton::UP); break; case SDLK_KP7: case SDLK_7: m_pBtnNum[7]->SetButtonState(wGui::CButton::UP); break; case SDLK_KP8: case SDLK_8: m_pBtnNum[8]->SetButtonState(wGui::CButton::UP); break; case SDLK_KP9: case SDLK_9: m_pBtnNum[9]->SetButtonState(wGui::CButton::UP); break; case SDLK_KP_PLUS: m_pBtnPlus->SetButtonState(wGui::CButton::UP); break; case SDLK_KP_MINUS: m_pBtnMinus->SetButtonState(wGui::CButton::UP); break; case SDLK_KP_ENTER: m_pBtnEquals->SetButtonState(wGui::CButton::UP); break; case SDLK_ESCAPE: m_pBtnClear->SetButtonState(wGui::CButton::UP); break; case SDLK_LALT: case SDLK_RALT: m_fAltPressed = false; case SDLK_F4: // This is never going to work until we can get multiple // messages at one time... // // Not sure how we should handle that one... if (m_fAltPressed == true) exit(0); //exit if alt is pressed, thus, Alt+F4 break; default: break; } } break; } default: bHandled = CView::HandleMessage(pMessage); break; } } return bHandled;}void CCalcView::DoCalc(void){ switch (m_eCalcMode) { case MODE_ADD: m_iDisplay = m_iRegister + m_iDisplay; break; case MODE_SUB: m_iDisplay = m_iRegister - m_iDisplay; break; default: break; }}void CCalcView::Add(void){ DoCalc(); m_iRegister = m_iDisplay; m_iDisplay = 0; m_eCalcMode = MODE_ADD;}void CCalcView::Clear(void){ m_iDisplay = 0; m_iRegister = 0; m_eCalcMode = MODE_NOP;}void CCalcView::Equal(void){ DoCalc(); m_iRegister = 0; m_eCalcMode = MODE_NOP;}void CCalcView::Sub(void){ DoCalc(); m_iRegister = m_iDisplay; m_iDisplay = 0; m_eCalcMode = MODE_SUB;}void CCalcView::UpdateDisplay(void){ char cMode = m_eCalcMode == MODE_ADD ? '+' : m_eCalcMode == MODE_SUB ? '-' : ' '; char buffer[100]; sprintf(buffer, "%i %c", m_iDisplay, cMode); m_pDisplay->SetWindowText(buffer);}int main(int argc, char **argv){ int iExitCode = EXIT_FAILURE; try { CCalcApp CalcApp(argc, argv); CalcApp.Init(); CalcApp.Exec(); iExitCode = CalcApp.ExitCode(); } catch (wGui::Wg_Ex_Base& e) { cerr << "Unhandled wGui exception : " << e.std_what() << endl; exit(EXIT_FAILURE); } catch (exception& e) { cerr << "Unhandled std exception : " << e.what() << endl; exit(EXIT_FAILURE); } catch (...) { cerr << "Unhandled exception." << endl; exit(EXIT_FAILURE); } exit (iExitCode);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -