Advertisement
AntonioVillanueva

Reloj Analogico Digital centesimas wxWidgets

Jul 13th, 2018
319
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.04 KB | None | 0 0
  1. //Reloj analogico centesimas en  wxWidgets Antonio Villanueva segura
  2. //g++ -Wall -static-libstdc++ -std=c++11 -Wunused-but-set-variable `wx-config --cxxflags` -o reloj *.cpp `wx-config --libs`
  3. //Declara la clase aplicacion
  4.  
  5. #include <iostream>
  6. #include "wx/wx.h"
  7. #include <wx/popupwin.h>
  8. #include <wx/menu.h> //menu en el frame
  9. #include <wx/event.h>
  10. #include <wx/pen.h> //lapiz
  11. #include <wx/dcmemory.h>
  12. #include <wx/sizer.h>
  13. #include <wx/button.h>
  14. #include <wx/dc.h>
  15. #include <wx/dcbuffer.h>
  16. #include <wx/dcclient.h>
  17. #include <wx/font.h>
  18. #include <wx/timer.h>
  19.  
  20. #include <wx/spinbutt.h> //spin button
  21. //using namespace std;
  22. #define PI 3.14159265
  23. #define RADIO 90
  24.  
  25. enum tiempos {HORAS,MINUTOS,SEGUNDOS,CENTESIMAS};
  26.  
  27. //Declaraciones
  28.  //Cada aplicacion wxWidget define una clase derivada de wxApp
  29. class MiApp:public wxApp
  30. {
  31.     public:
  32.     //Llamado al inicio startup, es como el main en c
  33.     virtual bool OnInit();//main wxWidgets , mas abajo se implementa
  34.    
  35. };
  36.  
  37. //Declaracion de la clase frame principal
  38.  
  39. //----------------------------------------------------------------------
  40.  
  41. class MiFrame:public wxFrame
  42. {
  43.     public:
  44.     //Constructor de la clase
  45.     MiFrame();
  46.    
  47.     private:
  48.     wxTimer m_timer;//Variable temporizador
  49.     void OnTimer(wxTimerEvent& event);//Timer    
  50.     void ActualizaTiempo (wxSpinEvent& event);//Actualiza setting ti hh:mm:ss
  51.     void OnSet(wxCommandEvent& event);//Menu setting horario    
  52.     void OnAbout(wxCommandEvent& event);// Menu Acerca de
  53.     void OnQuit(wxCommandEvent& event);// Menu Salir    
  54.     void AccionBoton(wxCommandEvent& event);////Accion para el evento de boton    
  55.     void DibujaReloj(wxDC& dc);//Esfera Reloj,numeros,hora digital
  56.     void Numeros (wxDC& dc,int x,int y,int radio);//Dibuja numeros del Reloj
  57.     void Aguja(wxDC& dc,int x,int y,int radio,int pos,tiempos t);//Dibuja Agujas .
  58.     float radian(float angulo);//Conversion de angulo a Radianes
  59.     wxPanel* Panel1;
  60.     int horas,minutos,segundos,centesimas;//Control del tiemo
  61.     int CentroX,CentroY;//Centro de la ventana
  62.     wxSpinButton* heure;//Setting horas
  63.     wxSpinButton* mins;//Setting minutos
  64.     wxSpinButton* sec; //Setting segundos  
  65.     /*Macro para informar a wxWidgets de la gestion de eventos
  66.     *Declara la tabla de eventos en esta clase ,mas abajo
  67.     * la implemento entre BEGIN_ y END_EVENT_TABLE
  68.     */
  69.     DECLARE_EVENT_TABLE()
  70. };
  71.  
  72. //----------------------------------------------------------------------
  73.  
  74. /*Implementacion , MiApp
  75. *Cuando se crea el objeto MiApp se asigna a la variable global wxTheApp
  76. * pero mejor que hacer un CAST emplear el MACRO  DECLARE_APP despues de
  77. * la declaracion de la clase , wxGetApp retorna una ref. al objeto MiApp
  78. */
  79. DECLARE_APP(MiApp)
  80.  
  81. //Macro que Proporciona a wxWidgets los medios de crear el objeto MiApp
  82. IMPLEMENT_APP(MiApp)
  83.  
  84. //----------------------------------------------------------------------
  85.  
  86. //Implementacion OnInit,Inicializa la aplicacion
  87.  
  88. bool MiApp::OnInit()
  89. {
  90.     //Crea la ventana principal , una instancia de nuestra clase MiFrame
  91.     //El titulo lo pasamos al constructor envuelto en el macro wxT
  92.     //macro de conversion de strings y char al tipo apropiado
  93.     MiFrame *frame=new MiFrame();
  94.    
  95.     //Mostrar la ventana
  96.     frame->Show(true);
  97.    
  98.     //Arranca el bucle de eventos
  99.     return true ;//Si false limpia sus estructuras y sale
  100. }
  101.  
  102. //----------------------------------------------------------------------
  103. wxWindowIDRef ID_TEMPORIZADOR=wxWindow::NewControlId();
  104. wxWindowIDRef ID_SET=wxWindow::NewControlId();
  105. //Tabla de eventos para MiFrame DECLARE_EVENT_TABLE() en MiFrame
  106. //Deteccion de los clicks de raton con wxID_ABOUT y wxID_EXIT
  107. //Que se dirigen a MiFrame::OnAbout y OnQuit
  108. BEGIN_EVENT_TABLE ( MiFrame, wxFrame)
  109.     EVT_TIMER(ID_TEMPORIZADOR, MiFrame::OnTimer)//Temporizador 1s
  110.     EVT_MENU(ID_SET,    MiFrame::OnSet)//Setting HH MM SS
  111.     EVT_MENU(wxID_ABOUT,    MiFrame::OnAbout) //Acerca de ...
  112.     EVT_MENU(wxID_EXIT,     MiFrame::OnQuit)//Salir
  113.     EVT_SPIN(wxID_ANY, MiFrame::ActualizaTiempo)////Actualiza setting ti hh:mm:ss  
  114. END_EVENT_TABLE()
  115.  
  116. //----------------------------------------------------------------------
  117. //Constructor de MiFrame
  118. //No resizable wxDEFAULT_FRAME_STYLE & ~(wxRESIZE_BORDER | wxMAXIMIZE_BOX)
  119. MiFrame::MiFrame():wxFrame(NULL,wxID_ANY,"Reloj",wxDefaultPosition,wxSize(200,200)
  120.     ,wxDEFAULT_FRAME_STYLE & ~(wxRESIZE_BORDER | wxMAXIMIZE_BOX)),
  121.     m_timer(this,ID_TEMPORIZADOR),horas(12),minutos(1),segundos(1)
  122. {
  123.     //Timer
  124.      m_timer.Start(10); // 1 second interval 1000 , cenesimas 100
  125.      
  126.     //Barra de Menu en el parte superior del Frame
  127.     wxMenuBar* BarraDeMenu=new wxMenuBar;
  128.    
  129.     //Ficheros del Menu
  130.     wxMenu* FicherosMenu=new wxMenu;
  131.    
  132.     FicherosMenu->Append(ID_SET,wxT("&Set"),wxT("Ajusta hora"));
  133.     FicherosMenu->AppendSeparator();
  134.     FicherosMenu->Append(wxID_ABOUT,wxT("&Acerca de "),wxT("info about"));
  135.     FicherosMenu->AppendSeparator();
  136.     FicherosMenu->Append(wxID_EXIT,wxT("&SALIR "),wxT("salir y cerrar"));  
  137.    
  138.     //Anade los Ficheros del Menu a la barra de Menu
  139.     BarraDeMenu-> Append(FicherosMenu,"Opciones");
  140.    
  141.     //Anade esta barra al frame actual
  142.     SetMenuBar(BarraDeMenu);
  143.          
  144.     //Crea un wxPanel
  145.     //WxPanel1 = new wxPanel(this, ID_WXPANEL1, wxPoint(5,5), wxSize(299,288));
  146.     Panel1=new wxPanel(this,wxID_ANY, wxDefaultPosition,wxSize (50,50) );
  147.    
  148.     //Sizer  
  149.     wxBoxSizer* horizontal = new wxBoxSizer(wxHORIZONTAL);//sizer Horizontal
  150.    
  151.     //Anade Sizer al wxPanel
  152.     Panel1->SetSizer(horizontal);
  153.    
  154.     //Centro de la ventana
  155.     CentroX=GetClientSize().x/2;
  156.     CentroY=GetClientSize().y/2;   
  157. }
  158. //----------------------------------------------------------------------
  159. void MiFrame::DibujaReloj(wxDC& dc){//Esfera Reloj,numeros,hora digital
  160.      
  161.     dc.SetPen(wxPen(*wxBLACK,5));//Lapiz color 
  162.     dc.SetBrush(wxBrush(*wxWHITE));//Fondo
  163.    
  164.     //Dibuja circulo externo
  165.     dc.DrawCircle(CentroX,CentroY,RADIO);
  166.  
  167.     //Dibuja numeros
  168.     Numeros(dc,CentroX-5,CentroY-5,RADIO-10);
  169.    
  170.     //Hora digital en el centro del reloj
  171.     wxString tiempoDigital=wxString::Format ("%i",horas)+":";
  172.     tiempoDigital+= wxString::Format ("%i",minutos)+":";
  173.     tiempoDigital+= wxString::Format ("%i",segundos);
  174.    
  175.     dc.DrawText(tiempoDigital,wxPoint(CentroX-20,CentroY+10)); 
  176. }
  177. //----------------------------------------------------------------------
  178. void MiFrame::OnTimer(wxTimerEvent& event) //Cada segundo se ejecuta esto
  179. {      
  180.     wxClientDC dc(Panel1);//Pizarra de dibujo
  181.    
  182.     dc.Clear();//Limpia la pizarra
  183.    
  184.     DibujaReloj(dc);//Dibuja el reloj base,circulo,numeros  
  185.    
  186.     //Aguja HORA
  187.     dc.SetPen( wxPen (*wxBLUE,4));
  188.     Aguja(dc,CentroX,CentroY,RADIO-20,horas,HORAS);//wxClientDC,X1,Y1,Radio,hora
  189.    
  190.     //Aguja MINUTOS
  191.     dc.SetPen( wxPen (*wxCYAN,3));
  192.     Aguja(dc,CentroX,CentroY,RADIO-15,minutos,MINUTOS);//wxClientDC,X1,Y1,Radio,minutos
  193.    
  194.     //Aguja SEGUNDO
  195.     dc.SetPen( wxPen (*wxLIGHT_GREY,2));
  196.     Aguja(dc,CentroX,CentroY,RADIO-10,segundos,SEGUNDOS);//wxClientDC,X1,Y1,Radio,segundos
  197.    
  198.     //Aguja CENTESIMAS 
  199.     dc.SetPen( wxPen (*wxRED,1));
  200.     Aguja(dc,CentroX,CentroY,RADIO-5,centesimas,CENTESIMAS);//wxClientDC,X1,Y1,Radio,segundos  
  201.    
  202.     //Control deL tiempo
  203.     if (centesimas++>100){centesimas=1;segundos++;}
  204.     if (segundos>60){segundos=1;minutos++;}
  205.     if (minutos>60){minutos=1;horas++;}//60 minutos una hora
  206.     if (horas>12){minutos=0;horas=0;}//12 horas
  207.    
  208. }
  209. //----------------------------------------------------------------------
  210. void MiFrame::Numeros (wxDC& dc,int x,int y,int radio){//Dibujo los numeros del reloj
  211.     int numero=3;
  212.    
  213.     wxFont fuente (10,wxFONTFAMILY_MODERN,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_BOLD);
  214.     dc.SetFont(fuente);
  215.    
  216.     dc.SetBackgroundMode(wxTRANSPARENT);
  217.     dc.SetTextForeground(*wxRED);
  218.     dc.SetTextBackground(*wxWHITE);
  219.    
  220.     //Dibuja los numeros del reloj cada 30 grados
  221.     for (int angulo=0;angulo <360;angulo+=30){
  222.         dc.DrawText ( wxString::Format(wxT("%i"),numero), x+ radio*cos(radian(angulo)), y+radio*sin(radian(angulo)));
  223.         numero++;//Numero hora
  224.         if (numero>12){numero=1;} //A partir de las 12 comienza en 1
  225.     }
  226. }
  227. //----------------------------------------------------------------------
  228. void MiFrame::Aguja(wxDC& dc,int x,int y,int radio,int pos,tiempos t){//Dibuja Aguja Horas o Seg.
  229.     float grados;
  230.     switch (t){
  231.         case HORAS:grados=30;break;
  232.         case MINUTOS:grados=6;break;
  233.         case SEGUNDOS:grados=6;break;
  234.         case CENTESIMAS:grados=3.6;break;
  235.     }
  236.    
  237.     //int grados (hs?30:6);//Angulo HORAS o SEGUNDOS
  238.     dc.DrawLine(x,y,  x+ radio*cos(radian(pos*grados -90)), y+radio*sin(radian(pos*grados-90)));
  239. }
  240. //----------------------------------------------------------------------
  241. float MiFrame::radian(float angulo){return angulo *PI/180.0;}//Angulo a radianes
  242. //----------------------------------------------------------------------
  243. void MiFrame::OnAbout(wxCommandEvent& event){// Menu Acerca de
  244.      wxMessageBox (wxT("Antonio Villanueva Segura"));
  245. }
  246. //----------------------------------------------------------------------
  247. void MiFrame::OnQuit(wxCommandEvent& event){Close();}// Menu Salir
  248. //----------------------------------------------------------------------
  249. void MiFrame::OnSet(wxCommandEvent& event){//Barra menu setting horario
  250.      wxFrame *panel = new wxFrame(this,wxID_ANY,wxT("Settings"),wxDefaultPosition,wxSize(150,35),
  251.      wxDEFAULT_FRAME_STYLE & ~(wxRESIZE_BORDER | wxMAXIMIZE_BOX));//fijo    
  252.      
  253.      wxPanel* ventana=new wxPanel(panel,wxID_ANY,wxDefaultPosition,wxSize(150,35) );
  254.      
  255.      //Sizers vertical contiene el horizontal 1 y 2
  256.      wxBoxSizer* vertical = new wxBoxSizer(wxVERTICAL);//sizer Vertical
  257.      wxBoxSizer* hor1 = new wxBoxSizer(wxHORIZONTAL);//sizer Horizontal  
  258.      wxBoxSizer* hor2 = new wxBoxSizer(wxHORIZONTAL);//sizer Horizontal  
  259.      vertical->Add(hor2,wxEXPAND);//Anadimos al wxBoxSizer los horisontales
  260.      vertical->Add(hor1,wxEXPAND);
  261.    
  262.     //wxSpinButton para ajustar Horas Minutos Segundos
  263.      heure=new wxSpinButton(panel,wxID_ANY,wxDefaultPosition,wxSize(50,30),wxSP_VERTICAL);
  264.      mins=new wxSpinButton(panel,wxID_ANY,wxDefaultPosition,wxSize(50,30),wxSP_VERTICAL);
  265.      sec=new wxSpinButton(panel,wxID_ANY,wxDefaultPosition,wxSize(50,30),wxSP_VERTICAL);
  266.      
  267.      // Defino el rango de los wxSpinButton ..SetRange (int min, int max)    
  268.      heure->SetRange(1,12);
  269.      mins->SetRange(1,60);
  270.      sec->SetRange(1,60);    
  271.      
  272.      //Recupero las variables HH:SS:MM y las copio en el wxSpinButto
  273.      heure->SetValue(horas);//Copio horas en el wxSpinButton heure
  274.      mins->SetValue(minutos);//Copio minutos en el wxSpinButton mins
  275.      sec->SetValue(segundos);//Copio segundos en el wxSpinButton sec         
  276.      
  277.     //Anado los wxSpinButton al wxBoxSizer Horizontal2 que va en el vertical
  278.     hor2->Add(heure);
  279.     hor2->Add(mins);
  280.     hor2->Add(sec);                        
  281.    
  282.     //wxPanel utiliza el wxBoxSizer vertical
  283.     ventana->SetSizer(vertical);//wxPanel utiliza el wxSizer horizontal          
  284.      
  285.     panel->Show(true);
  286. }
  287. //----------------------------------------------------------------------
  288. void MiFrame::ActualizaTiempo (wxSpinEvent& event){//Actualiza setting ti hh:mm:ss
  289.     horas=heure->GetValue();
  290.     minutos=mins->GetValue();
  291.     segundos=sec->GetValue();      
  292. }
  293. //----------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement