Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Reloj analogico en wxWidgets Antonio Villanueva segura
- //g++ -Wall -static-libstdc++ -std=c++11 -Wunused-but-set-variable `wx-config --cxxflags` -o reloj *.cpp `wx-config --libs`
- //Declara la clase aplicacion
- #include <iostream>
- #include "wx/wx.h"
- #include <wx/popupwin.h>
- #include <wx/menu.h> //menu en el frame
- #include <wx/event.h>
- #include <wx/pen.h> //lapiz
- #include <wx/dcmemory.h>
- #include <wx/sizer.h>
- #include <wx/button.h>
- #include <wx/dc.h>
- #include <wx/dcbuffer.h>
- #include <wx/dcclient.h>
- #include <wx/font.h>
- #include <wx/timer.h>
- #include <wx/spinbutt.h> //spin button
- //using namespace std;
- #define PI 3.14159265
- #define RADIO 90
- //Declaraciones
- //Cada aplicacion wxWidget define una clase derivada de wxApp
- class MiApp:public wxApp
- {
- public:
- //Llamado al inicio startup, es como el main en c
- virtual bool OnInit();//main wxWidgets , mas abajo se implementa
- };
- //Declaracion de la clase frame principal
- //----------------------------------------------------------------------
- class MiFrame:public wxFrame
- {
- public:
- //Constructor de la clase
- MiFrame();
- private:
- wxTimer m_timer;//Variable temporizador
- void OnTimer(wxTimerEvent& event);//Timer
- void ActualizaTiempo (wxSpinEvent& event);//Actualiza setting ti hh:mm:ss
- void OnSet(wxCommandEvent& event);//Menu setting horario
- void OnAbout(wxCommandEvent& event);// Menu Acerca de
- void OnQuit(wxCommandEvent& event);// Menu Salir
- void AccionBoton(wxCommandEvent& event);////Accion para el evento de boton
- void DibujaReloj(wxDC& dc);
- void Numeros (wxDC& dc,int x,int y,int radio);//Dibuja numeros del Reloj
- void Aguja(wxDC& dc,int x,int y,int radio,int pos,bool hs);//Dibuja Agujas .
- float radian(float angulo);//Conversion de angulo a Radianes
- wxPanel* Panel1;
- int horas,minutos,segundos;//Control del tiemo
- int CentroX,CentroY;//Centro de la ventana
- wxSpinButton* heure;//Setting horas
- wxSpinButton* mins;//Setting minutos
- wxSpinButton* sec; //Setting segundos
- /*Macro para informar a wxWidgets de la gestion de eventos
- *Declara la tabla de eventos en esta clase ,mas abajo
- * la implemento entre BEGIN_ y END_EVENT_TABLE
- */
- DECLARE_EVENT_TABLE()
- };
- //----------------------------------------------------------------------
- /*Implementacion , MiApp
- *Cuando se crea el objeto MiApp se asigna a la variable global wxTheApp
- * pero mejor que hacer un CAST emplear el MACRO DECLARE_APP despues de
- * la declaracion de la clase , wxGetApp retorna una ref. al objeto MiApp
- */
- DECLARE_APP(MiApp)
- //Macro que Proporciona a wxWidgets los medios de crear el objeto MiApp
- IMPLEMENT_APP(MiApp)
- //----------------------------------------------------------------------
- //Implementacion OnInit,Inicializa la aplicacion
- bool MiApp::OnInit()
- {
- //Crea la ventana principal , una instancia de nuestra clase MiFrame
- //El titulo lo pasamos al constructor envuelto en el macro wxT
- //macro de conversion de strings y char al tipo apropiado
- MiFrame *frame=new MiFrame();
- //Mostrar la ventana
- frame->Show(true);
- //Arranca el bucle de eventos
- return true ;//Si false limpia sus estructuras y sale
- }
- //----------------------------------------------------------------------
- wxWindowIDRef ID_TEMPORIZADOR=wxWindow::NewControlId();
- wxWindowIDRef ID_SET=wxWindow::NewControlId();
- //Tabla de eventos para MiFrame DECLARE_EVENT_TABLE() en MiFrame
- //Deteccion de los clicks de raton con wxID_ABOUT y wxID_EXIT
- //Que se dirigen a MiFrame::OnAbout y OnQuit
- BEGIN_EVENT_TABLE ( MiFrame, wxFrame)
- EVT_TIMER(ID_TEMPORIZADOR, MiFrame::OnTimer)//Temporizador 1s
- EVT_MENU(ID_SET, MiFrame::OnSet)
- EVT_MENU(wxID_ABOUT, MiFrame::OnAbout)
- EVT_MENU(wxID_EXIT, MiFrame::OnQuit)
- EVT_SPIN(wxID_ANY, MiFrame::ActualizaTiempo)////Actualiza setting ti hh:mm:ss
- END_EVENT_TABLE()
- //----------------------------------------------------------------------
- //Constructor de MiFrame
- //No resizable wxDEFAULT_FRAME_STYLE & ~(wxRESIZE_BORDER | wxMAXIMIZE_BOX)
- MiFrame::MiFrame():wxFrame(NULL,wxID_ANY,"Reloj",wxDefaultPosition,wxSize(200,200)
- ,wxDEFAULT_FRAME_STYLE & ~(wxRESIZE_BORDER | wxMAXIMIZE_BOX)),
- m_timer(this,ID_TEMPORIZADOR),horas(12),minutos(1),segundos(1)
- {
- //Timer
- m_timer.Start(1000); // 1 second interval 1000
- //Barra de Menu en el parte superior del Frame
- wxMenuBar* BarraDeMenu=new wxMenuBar;
- //Ficheros del Menu
- wxMenu* FicherosMenu=new wxMenu;
- FicherosMenu->Append(ID_SET,wxT("&Set"),wxT("Ajusta hora"));
- FicherosMenu->AppendSeparator();
- FicherosMenu->Append(wxID_ABOUT,wxT("&Acerca de "),wxT("info about"));
- FicherosMenu->AppendSeparator();
- FicherosMenu->Append(wxID_EXIT,wxT("&SALIR "),wxT("salir y cerrar"));
- //Anade los Ficheros del Menu a la barra de Menu
- BarraDeMenu-> Append(FicherosMenu,"Opciones");
- //Anade esta barra al frame actual
- SetMenuBar(BarraDeMenu);
- //Crea un wxPanel
- //WxPanel1 = new wxPanel(this, ID_WXPANEL1, wxPoint(5,5), wxSize(299,288));
- Panel1=new wxPanel(this,wxID_ANY, wxDefaultPosition,wxSize (50,50) );
- //Sizer
- wxBoxSizer* horizontal = new wxBoxSizer(wxHORIZONTAL);//sizer Horizontal
- //Anade Sizer al wxPanel
- Panel1->SetSizer(horizontal);
- //Centro de la ventana
- CentroX=GetClientSize().x/2;
- CentroY=GetClientSize().y/2;
- }
- //----------------------------------------------------------------------
- void MiFrame::DibujaReloj(wxDC& dc){
- dc.SetPen(wxPen(*wxBLACK,5));//Lapiz color
- dc.SetBrush(wxBrush(*wxWHITE));//Fondo
- //Dibuja circulo externo
- dc.DrawCircle(CentroX,CentroY,RADIO);
- //Dibuja numeros
- Numeros(dc,CentroX-5,CentroY-5,RADIO-10);
- //Hora digital en el centro del reloj
- wxString tiempoDigital=wxString::Format ("%i",horas)+":";
- tiempoDigital+= wxString::Format ("%i",minutos)+":";
- tiempoDigital+= wxString::Format ("%i",segundos);
- dc.DrawText(tiempoDigital,wxPoint(CentroX-20,CentroY+10));
- }
- //----------------------------------------------------------------------
- void MiFrame::OnTimer(wxTimerEvent& event) //Cada segundo se ejecuta esto
- {
- wxClientDC dc(Panel1);//Pizarra de dibujo
- dc.Clear();//Limpia la pizarra
- DibujaReloj(dc);//Dibuja el reloj base,circulo,numeros
- //Aguja HORA
- dc.SetPen( wxPen (*wxBLUE,4));
- Aguja(dc,CentroX,CentroY,RADIO-20,horas,true);//wxClientDC,X1,Y1,Radio,hora
- //Aguja MINUTOS
- dc.SetPen( wxPen (*wxCYAN,3));
- Aguja(dc,CentroX,CentroY,RADIO-15,minutos,false);//wxClientDC,X1,Y1,Radio,minutos
- //Aguja SEGUNDO
- dc.SetPen( wxPen (*wxLIGHT_GREY,2));
- Aguja(dc,CentroX,CentroY,RADIO-10,segundos,false);//wxClientDC,X1,Y1,Radio,segundos
- //Control deL tiempo
- if (segundos++>60){//60 segundos un minuto
- segundos=1;
- minutos++;
- }
- if (minutos>60){minutos=1;horas++;}//60 minutos una hora
- if (horas>12){minutos=0;horas=0;}//12 horas
- }
- //----------------------------------------------------------------------
- void MiFrame::Numeros (wxDC& dc,int x,int y,int radio){//Dibujo los numeros del reloj
- int numero=3;
- wxFont fuente (10,wxFONTFAMILY_MODERN,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_BOLD);
- dc.SetFont(fuente);
- dc.SetBackgroundMode(wxTRANSPARENT);
- dc.SetTextForeground(*wxRED);
- dc.SetTextBackground(*wxWHITE);
- //Dibuja los numeros del reloj cada 30 grados
- for (int angulo=0;angulo <360;angulo+=30){
- dc.DrawText ( wxString::Format(wxT("%i"),numero), x+ radio*cos(radian(angulo)), y+radio*sin(radian(angulo)));
- numero++;//Numero hora
- if (numero>12){numero=1;} //A partir de las 12 comienza en 1
- }
- }
- //----------------------------------------------------------------------
- void MiFrame::Aguja(wxDC& dc,int x,int y,int radio,int pos,bool hs=true){//Dibuja Aguja Horas o Seg.
- int grados (hs?30:6);//Angulo HORAS o SEGUNDOS
- dc.DrawLine(x,y, x+ radio*cos(radian(pos*grados -90)), y+radio*sin(radian(pos*grados-90)));
- }
- //----------------------------------------------------------------------
- float MiFrame::radian(float angulo){return angulo *PI/180.0;}//Angulo a radianes
- //----------------------------------------------------------------------
- void MiFrame::OnAbout(wxCommandEvent& event){// Menu Acerca de
- wxMessageBox (wxT("Antonio Villanueva Segura"));
- }
- //----------------------------------------------------------------------
- void MiFrame::OnQuit(wxCommandEvent& event){Close();}// Menu Salir
- //----------------------------------------------------------------------
- void MiFrame::OnSet(wxCommandEvent& event){//Barra menu setting horario
- wxFrame *panel = new wxFrame(this,wxID_ANY,wxT("Settings"),wxDefaultPosition,wxSize(150,35),
- wxDEFAULT_FRAME_STYLE & ~(wxRESIZE_BORDER | wxMAXIMIZE_BOX));//fijo
- wxPanel* ventana=new wxPanel(panel,wxID_ANY,wxDefaultPosition,wxSize(150,35) );
- //Sizers vertical contiene el horizontal 1 y 2
- wxBoxSizer* vertical = new wxBoxSizer(wxVERTICAL);//sizer Vertical
- wxBoxSizer* hor1 = new wxBoxSizer(wxHORIZONTAL);//sizer Horizontal
- wxBoxSizer* hor2 = new wxBoxSizer(wxHORIZONTAL);//sizer Horizontal
- vertical->Add(hor2,wxEXPAND);//Anadimos al wxBoxSizer los horisontales
- vertical->Add(hor1,wxEXPAND);
- //wxSpinButton para ajustar Horas Minutos Segundos
- heure=new wxSpinButton(panel,wxID_ANY,wxDefaultPosition,wxSize(50,30),wxSP_VERTICAL);
- mins=new wxSpinButton(panel,wxID_ANY,wxDefaultPosition,wxSize(50,30),wxSP_VERTICAL);
- sec=new wxSpinButton(panel,wxID_ANY,wxDefaultPosition,wxSize(50,30),wxSP_VERTICAL);
- // Defino el rango de los wxSpinButton ..SetRange (int min, int max)
- heure->SetRange(1,12);
- mins->SetRange(1,60);
- sec->SetRange(1,60);
- //Recupero las variables HH:SS:MM y las copio en el wxSpinButto
- heure->SetValue(horas);//Copio horas en el wxSpinButton heure
- mins->SetValue(minutos);//Copio minutos en el wxSpinButton mins
- sec->SetValue(segundos);//Copio segundos en el wxSpinButton sec
- //Anado los wxSpinButton al wxBoxSizer Horizontal2 que va en el vertical
- hor2->Add(heure);
- hor2->Add(mins);
- hor2->Add(sec);
- //wxPanel utiliza el wxBoxSizer vertical
- ventana->SetSizer(vertical);//wxPanel utiliza el wxSizer horizontal
- panel->Show(true);
- }
- //----------------------------------------------------------------------
- void MiFrame::ActualizaTiempo (wxSpinEvent& event){//Actualiza setting ti hh:mm:ss
- horas=heure->GetValue();
- minutos=mins->GetValue();
- segundos=sec->GetValue();
- }
- //----------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement