Una clase que que contiene un objeto Shape con su nueva propiedad PolyPoints en Visual FoxPro 9.0 que nos permite dibujar las agujas de un reloj analógico con formas poligonales.
El código (para VFP 9.0) de la clase RelojAnalogico contenida en un formulario es el siguiente:
PUBLIC goMiForm goMiForm = CREATEOBJECT("MiForm") goMiForm.SHOW(1) RETURN DEFINE CLASS MiForm AS FORM HEIGHT = 240 WIDTH = 240 AUTOCENTER = .T. CAPTION = "Reloj Analógico" NAME = "frmRelojAnalogico" ADD OBJECT RelojAnalogico1 AS RelojanAlogico WITH ; TOP = 20, ; LEFT = 20, ; NAME = "RelojAnalogo1" ENDDEFINE DEFINE CLASS relojanalogico AS CONTAINER WIDTH = 200 HEIGHT = 200 BACKSTYLE = 0 BORDERWIDTH = 0 NAME = "RelojAnalogico" ADD OBJECT shpEsfera AS SHAPE WITH ; TOP = 0, ; LEFT = 0, ; HEIGHT = 200, ; WIDTH = 200, ; CURVATURE = 99, ; BACKCOLOR = RGB(255,255,255), ; BACKSTYLE = 1, ; NAME = "shpEsfera" ADD OBJECT shpAgujas AS SHAPE WITH ; TOP = 0, ; LEFT = 0, ; HEIGHT = 200, ; WIDTH = 200, ; BORDERWIDTH = 1, ; BACKCOLOR = RGB(200,255,200), ; POLYPOINTS = "This.aPoly", ; NAME = "shpAgujas" ADD OBJECT tmrTimer AS TIMER WITH ; INTERVAL = 1000, ; NAME = "tmrTimer" PROCEDURE Hora LOCAL ln, lnAng, lnCos, lnSen, ; lnCoI, lnCoD, lnSeI, lnSeD ln = SECONDS() *--- Posicion aguja segundos lnAng = INT(ln % 60) * 6 lnCos = COS(DTOR(lnAng -90)) lnSen = SIN(DTOR(lnAng -90)) THIS.shpAgujas.aPoly(10,1) = 48 * lnCos + 50 THIS.shpAgujas.aPoly(10,2) = 48 * lnSen + 50 *--- Posicion aguja minutos lnAng = INT((ln / 60) % 60) * 6 lnCos = COS(DTOR(lnAng-90)) lnSen = SIN(DTOR(lnAng-90)) lnCoI = COS(DTOR(lnAng-90-7)) lnSeI = SIN(DTOR(lnAng-90-7)) lnCoD = COS(DTOR(lnAng-90+7)) lnSeD = SIN(DTOR(lnAng-90+7)) THIS.shpAgujas.aPoly(2,1) = 30 * lnCoI + 50 THIS.shpAgujas.aPoly(2,2) = 30 * lnSeI + 50 THIS.shpAgujas.aPoly(3,1) = 45 * lnCos + 50 THIS.shpAgujas.aPoly(3,2) = 45 * lnSen + 50 THIS.shpAgujas.aPoly(4,1) = 30 * lnCoD + 50 THIS.shpAgujas.aPoly(4,2) = 30 * lnSeD + 50 *--- Posicion aguja horas lnAng = ((ln / 3600) % 12)* 30 lnCos = COS(DTOR(lnAng -90)) lnSen = SIN(DTOR(lnAng -90)) lnCoI = COS(DTOR(lnAng-90-10)) lnSeI = SIN(DTOR(lnAng-90-10)) lnCoD = COS(DTOR(lnAng-90+10)) lnSeD = SIN(DTOR(lnAng-90+10)) THIS.shpAgujas.aPoly(6,1) = 20 * lnCoI + 50 THIS.shpAgujas.aPoly(6,2) = 20 * lnSeI + 50 THIS.shpAgujas.aPoly(7,1) = 35 * lnCos + 50 THIS.shpAgujas.aPoly(7,2) = 35 * lnSen + 50 THIS.shpAgujas.aPoly(8,1) = 20 * lnCoD + 50 THIS.shpAgujas.aPoly(8,2) = 20 * lnSeD + 50 THIS.shpAgujas.REFRESH ENDPROC PROCEDURE INIT THIS.Hora ENDPROC PROCEDURE shpEsfera.INIT THIS.HEIGHT = THIS.PARENT.HEIGHT THIS.WIDTH = THIS.PARENT.WIDTH ENDPROC PROCEDURE shpAgujas.INIT THIS.HEIGHT = THIS.PARENT.HEIGHT THIS.WIDTH = THIS.PARENT.WIDTH THIS.ADDPROPERTY("aPoly[10,2]") FOR lnI = 1 TO 10 STORE 50 TO ; THIS.aPoly[lnI,1], ; THIS.aPoly[lnI,2] ENDFOR ENDPROC PROCEDURE tmrTimer.TIMER THIS.PARENT.Hora ENDPROC ENDDEFINE
Pueden descargar el proyecto con el formulario y la librería de clases visuales en el siguiente enlace:
RelojAnalogico.zip (4,41 KB)
Actualización: Dejo un formulario de muestra con distintas imágenes de fondo de relojes en formato PNG y fondo transparente, que se pueden utilizar descargando cada imagen haciendo clic derecho y seleccionar "Guardar imagen como..."
Si al objeto imagen con el fondo del reloj lo envian atras del objeto "RelojanAlogico", se debe cambiar la propiedad BackStyle = 0 && Transparente
del objeto Shape de nombre shpEsfera
, para que muestre la imagen correctamente
Las siguientes imágenes para descarga tienen todas 200 x 200 pixeles de tamaño. Uds. pueden redimensionarlas según sus necesidades
No hay comentarios. :
Publicar un comentario
Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.