23 de abril de 2016

Reloj Analógico con VFP 9.0

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), ;
    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)

No hay comentarios. :

Publicar un comentario