Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Reloj Eliptico

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Reloj Eliptico Responder citando

Hola.
He estado un rato buscando la manera de dibujar un reloj por ahí. Como no he encontrado nada, lo he hecho yo mismo.
Lo pongo aquí por que me parece que ilustra como usar el Canvas->Pie y Canvas-Ellipse. Como es un pelín lioso, pues igual le sirve a alguien.

Código:

//-----------------------------------------------------------------------------
// El Timage es por que hay que pintarlo en algún sitio y lo que vayamos a pintar
// se adaptará a esa TImage
// Fondo: color de la elipse
// Tinta: color de la elipse
// Grosor: de la pluma
// Porciento: De 1 a 100, donde 0 serán las 12.
// Porciento2: un porcentaje para cada aguja. Así puedes asignar minutos o
//             segundos o lo que quieras a cada aguja
// Sentido: Si true el tiempo avanza, si false retrocede...
//          Hummmmm... ten cuidado, no todos los tiempos pasados son mejores...
// Se usa un TRect en vez de X,Y,etc por que queda más legible, pero se podría
// haber hecho igual con X,Y,X2,Y2
//-----------------------------------------------------------------------------
void __fastcall TEspere::Reloj(TImage * Imagen,TColor FondoImagen,
      TColor Fondo,TColor Tinta,int Grosor,
      int Porciento,int Porciento2,bool Sentido)
{
TRect rect;
int centroX, centroY,ancho, alto;
double angulo,angulo2;

//La elipse se "adapta" al image que la contiene
rect.left = 0;
rect.top = 0;
rect.right = Imagen->Width;
rect.bottom = Imagen->Height;

//se pinta todo el rect
Imagen->Canvas->Brush->Color = FondoImagen;
Imagen->Canvas->FillRect(rect);

Imagen->Canvas->Brush->Color = Fondo;
Imagen->Canvas->Pen->Color = Tinta;
Imagen->Canvas->Pen->Width = Grosor;

//Y ahora se repinta la ellipse teniendo en cuenta el grosor de la pluma
rect.left = Grosor;
rect.top = Grosor;
rect.right = Imagen->Width-Grosor;
rect.bottom = Imagen->Height-Grosor;
Imagen->Canvas->Ellipse(rect);

ancho = rect.Right - rect.Left;
alto = rect.Bottom - rect.Top;
centroX = rect.Left+(ancho / 2);
centroY = rect.Top+(alto / 2);

angulo = (Pi * ((Porciento/ 50.0) + 0.5));
//Si el segundo porcentaje es cero sólo tendrá una aguja
if(Porciento2 != 0) angulo2 = (Pi * ((Porciento2/ 50.0) + 0.5));
else angulo2 = angulo;

//El reloj va para atrás
if(!Sentido)
  {
  angulo = -angulo;
  angulo2 = -angulo2;
  }

//Se pinta una porción
Imagen->Canvas->Pie(rect.Left,rect.Top,rect.Right, rect.Bottom,
        floor(centroX * (1 - cos(angulo))),
        floor(centroY * (1 - sin(angulo))),
        floor(centroX * (1 - cos(angulo2))),
        floor(centroY * (1 - sin(angulo2))));
//Y sino se refresca la imagen primero hará los calculos y luego pintará
Imagen->Refresh();
}


Para llamarlo, yo lo hago con un Timer:

Código:

//-----------------------------------------------------------------------------
void __fastcall TEspere::Timer2Timer(TObject *Sender)
{
TR1 = GetTickCount();
if((TR1 - IN1) > 10)
  {
  Cen++;
  IN1 = TR1;
  Reloj(Centesimas,clWhite,clRed,clBlack,10,Cen,0,true);
  if(Cen > 100) Cen = 1;
  Label2->Caption = AnsiString(AnsiString(Cen));
  }
TR2 = GetTickCount();
if((TR2-IN2) > 100)
  {
  Seg++;
  IN2 = TR2;
  Reloj(Segundos,clWhite,clGreen,clBlack,10,Seg,0,true);
  Reloj(DosAgujas,clWhite,clBlue,clBlack,10,Seg,Min,true);
  Reloj(Reves,clWhite,clSilver,clBlack,10,Seg,Min,false);
  if(Seg > 100) Seg = 1;
  Label3->Caption = AnsiString(AnsiString(Seg));
  }
TR3 = GetTickCount();
if((TR3-IN3) > 1000)
  {
  Min++;
  IN3 = TR3;
  Reloj(Minutos,clWhite,clYellow,clBlack,10,Min,0,true);
  if(Min> 100) Min= 1;
  Label4->Caption = AnsiString(AnsiString(Min));
  }
}
//---------------------------------------------------------------------------



El GetTickCount(); aparece por cortesía de _Leo, hay que ver todo lo que aprendo gracias él. Mil Gracias.

TR1-2-3 IN1-1-2-3 Están definidos en el .h y se inicializan en en el Activate.

Min,Cen,Seg Se llaman así por obvias razones, lo que ya no es tan obvio es que en estas variables no se usan para lo que se definieron y podría confudir. Se parte de milisegundos y no se llega al minuto, ojo.

Espero que os sea útil.


P.D. : Me olvidaba; hay que poner #include <math.h> para la función floor(); y #define Pi 3.1415926535897932385 en el .h
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Amigo la idea me gusta pero no se donde poner la primera parte del codigo que dejas , la segunda me imagino que en un timer 2 ...
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Pues si te fijas:

Cita:
void __fastcall TEspere::Reloj


Es una función mia.
Hice un formulario que se llamó "Espere", por lo tanto la clase (pues al final todo son clases) se llama "TEspere".
Así que para hacer una función se pone:

void __fastcall NombreDeTuFormulario::Reloj...

Luego defines eso mismo (la llamada a la función) en el .h de tu formulario (sino sabes como acceder prueba a darle Ctrl+F6), que es dónde está la definción de la clase TEspere (la definición del formulario, en suma). Yo suelo definir estas funciones como Public.
Y ya puedes llamarlo desde un TTimer.

Espero haberme explicado.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

te alo agradezco
pero no me vendria mal que me dijeras los componentes que se utilizan , yo he puesto un TTimer y un TImage, pero aun me arroja un error de no saber que es el TR1?
_________________
Todos somos ignorantes, lo que no todos ignoramos lo mismo...
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Deberias buscar la función GetTickCount(). Entonces te darías cuenta que:


Cita:
Retrieves the number of milliseconds since the computer was started.
function GetTickCount: Cardinal;
Returns
Cardinal - Number of milliseconds (ticks).
Description
GetTickCount is a Cardinal function used to retrieve the number of milliseconds since the computer was started.
GetTickCount is often used when calculating the response times for Indy components such as TIdEcho and TIdTime.
GetTickCount encapsulates the platform-specific calls necessary to provide a high resolution timer for fixed duration events. On the Windows platform, the function used is Windows.GetTickCount. On the Linux platform, GetTickCount uses the library function clock adjusted to thousandths of CLOCKS_PER_SECs.


(Sacado de la ayuda del builder). Entonces te habrías dado cuenta que ese TR1 puede ser un entero que he definido en el .h del formulario.
Te digo esto por que es la manera de trabajar en el foro.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Tampoco entiendo muy bien el codigo que hay pero lo acomodo de la siguiente forma y tengo un resultado talvez te sirva o lo puedas acomodar mejor Very Happy
ifrit escribió:
Amigo la idea me gusta pero no se donde poner la primera parte del codigo que dejas , la segunda me imagino que en un timer 2 ...

En el archivo CPP
Código:
//---------------------------------------------------------------------------

#include <vcl>
#pragma hdrstop
#include <math>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "sEdit"
#pragma link "sLabel"
#pragma link "sSpinEdit"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        Pi=3.1415926535897932385;
        Form1->Caption = GetTickCount();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Reloj(TImage * Imagen,TColor FondoImagen,
      TColor Fondo,TColor Tinta,int Grosor,
      int Porciento,int Porciento2,bool Sentido)
{
   TRect rect;
   int centroX, centroY,ancho, alto;
   double angulo,angulo2;

   //La elipse se "adapta" al image que la contiene
   rect.left = 0;
   rect.top = 0;
   rect.right = Imagen->Width;
   rect.bottom = Imagen->Height;

   //se pinta todo el rect
   Imagen->Canvas->Brush->Color = FondoImagen;
   Imagen->Canvas->FillRect(rect);

   Imagen->Canvas->Brush->Color = Fondo;
   Imagen->Canvas->Pen->Color = Tinta;
   Imagen->Canvas->Pen->Width = Grosor;

   //Y ahora se repinta la ellipse teniendo en cuenta el grosor de la pluma
   rect.left = Grosor;
   rect.top = Grosor;
   rect.right = Imagen->Width-Grosor;
   rect.bottom = Imagen->Height-Grosor;
   Imagen->Canvas->Ellipse(rect);

   ancho = rect.Right - rect.Left;
   alto = rect.Bottom - rect.Top;
   centroX = rect.Left+(ancho / 2);
   centroY = rect.Top+(alto / 2);

   angulo = (Pi * ((Porciento/ 50.0) + 0.5));
   //Si el segundo porcentaje es cero sólo tendrá una aguja
   if(Porciento2 != 0) angulo2 = (Pi * ((Porciento2/ 50.0) + 0.5));
   else angulo2 = angulo;

   //El reloj va para atrás
   if(!Sentido){
      angulo = -angulo;
      angulo2 = -angulo2;
      }

   //Se pinta una porción
   Imagen->Canvas->Pie(rect.Left,rect.Top,rect.Right, rect.Bottom,
        floor(centroX * (1 - cos(angulo))),
        floor(centroY * (1 - sin(angulo))),
        floor(centroX * (1 - cos(angulo2))),
        floor(centroY * (1 - sin(angulo2))));
   //Y sino se refresca la imagen primero hará los calculos y luego pintará
   Imagen->Refresh();
}
//-----------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  TR1 = GetTickCount();
  if((TR1 - IN1) > 10){
      Cen++;
      IN1 = TR1;
      Reloj(Centesimas,clWhite,clRed,clBlack,1,Cen,0,true);
      if(Cen > 100) Cen = 1;
         Label2->Caption = AnsiString(AnsiString(Cen));
      }
  TR2 = GetTickCount();
  if((TR2-IN2) > 100){
     Seg++;
     IN2 = TR2;
     Reloj(Segundos,clWhite,clGreen,clBlack,1,Seg,0,true);
     Reloj(DosAgujas,clWhite,clBlue,clBlack,1,Seg,Min,true);
     Reloj(Reves,clWhite,clSilver,clBlack,1,Seg,Min,false);
     if(Seg > 100) Seg = 1;
         Label3->Caption = AnsiString(AnsiString(Seg));
     }
  TR3 = GetTickCount();
  if((TR3-IN3) > 1000){
     Min++;
     IN3 = TR3;
     Reloj(Minutos,clWhite,clYellow,clBlack,1,Min,0,true);
     if(Min> 100) Min= 1;
        Label4->Caption = AnsiString(AnsiString(Min));
     }
}
//---------------------------------------------------------------------------

En el archivo .H
Código:
#include "sEdit.hpp"
#include "sLabel.hpp"
#include "sSpinEdit.hpp"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
        TTimer *Timer1;
        TLabel *Label2;
        TImage *Centesimas;
        TImage *Segundos;
        TImage *DosAgujas;
        TImage *Reves;
        TLabel *Label3;
        TImage *Minutos;
        TLabel *Label4;
        TsLabel *sLabel1;
        TsLabel *sLabel2;
        TsLabel *sLabel3;
        TsLabel *sLabel4;
        TsLabel *sLabel6;
        TsLabel *sLabel5;
        TsLabel *sLabel7;
        TsLabel *sLabel8;
        void __fastcall Timer1Timer(TObject *Sender);
private:   // User declarations
public:      // User declarations
        int TR1,TR2,TR3;
        int IN1,IN2,IN3;
        double Pi;
        int Cen,Seg,Min;

        void __fastcall Reloj(TImage * Imagen,TColor FondoImagen,
      TColor Fondo,TColor Tinta,int Grosor,
      int Porciento,int Porciento2,bool Sentido);
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.