 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
Publicado: Mar 07 Nov, 2006 3:37 pm Asunto: Reloj Eliptico |
|
|
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 |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Jue 22 Ene, 2009 3:40 pm Asunto: |
|
|
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 |
|
 |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
Publicado: Jue 22 Ene, 2009 4:57 pm Asunto: |
|
|
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 |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Jue 22 Ene, 2009 5:08 pm Asunto: |
|
|
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 |
|
 |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
Publicado: Jue 22 Ene, 2009 5:48 pm Asunto: |
|
|
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 |
|
 |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Jue 01 Ene, 2015 8:45 pm Asunto: |
|
|
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
| 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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|