⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calcapp.cpp

📁 一个小巧的嵌入式图形系统wGUI, 可以用VC编译
💻 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 + -