mustafa wrote: ↑Mon Apr 25, 2022 12:19 pm
Hola amigos:
Tengo un problema con las manecillas del reloj .../...
Mustafa
Yeeep amigacho.., estas fet un artista!!!
Tengo dos ideas, las dos son malas pero no tengo otras
El principal problema es que un DRAW no se puede borrar, se tienen que borrar todos mediante un ERASE y eso provoca un pequeño parpadeo.
1ª IDEA. - CON ERASE.
He creado una WINDOW PANEL dentro de la definicion de tu DEFINE WINDOW Form_1 para que contenga el reloj
... / ...
Box( 179,1078, 159, 159 ,"346rhs", 255, 255, 255 )
SetProperty("Form_1","Label_346rhs","Enabled", .T. )
*--------------------------------------------------------------------------------*
// Esto es nuevo
DEFINE WINDOW WinPanel ;
ROW 175 ;
COL 1075 ;
WIDTH 160 ;
HEIGHT 160 ;
WINDOWTYPE PANEL
@ 5,5 IMAGE RELOJ PICTURE 'Resource\reloj.bmp' WIDTH 155 HEIGHT 155 STRETCH
END WINDOW
// HASTA AQUI
DEFINE TIMER Memory INTERVAL 1000 ACTION ( RELEASE MEMORY )
DEFINE TIMER TIME INTERVAL 1000 ACTION ( Dibuja() )
*--------------------------------------------------------------------------------*
.../....
y acto seguido he modificado la funcion "Static Function Dibuja()" de esta forma
*------------------------------------------------------------------------------*
Static Function Dibuja()
*------------------------------------------------------------------------------*
*
https://www.hmgforum.com/viewtopic.php? ... ock#p43746
* By vientopamperosur modificado by Mustafa
LOCAL radians := 3.1415926535 / 180 // <=== NO Se declaran arriba como PUBLIC
LOCAL Seg := VAL(SUBSTR(Time(),7,2))
LOCAL Min := VAL(SUBSTR(Time(),4,2))
LOCAL Hor := VAL(SUBSTR(Time(),1,2))
LOCAL segY2 := 80 +Sin(Seg * 6 * radians)*45
LOCAL segX2 := 80 -Cos(Seg * 6 * radians)*45
LOCAL minY2 := 80+Sin(Min * 6 * radians)*40
LOCAL minX2 := 80-Cos(Min * 6 * radians)*40
LOCAL IncrMinHr := Min / 60
LOCAL horY2 := 80+Sin((Hor + IncrMinHr) * 30 * radians) * 35
LOCAL horX2 := 80-Cos((Hor + IncrMinHr) * 30 * radians) * 35
*-------------------------------------------------------------*
* WinPanel.RELOJ.Picture := 'Resource\reloj.bmp'
// Esto provoca un pequeño parpado
ERASE WINDOW Winpanel
DRAW LINE IN WINDOW WinPanel AT 80,80 TO horX2,horY2 PENCOLOR { 000,000,000 } PENWIDTH 4
DRAW LINE IN WINDOW WinPanel AT 80,80 TO minX2,minY2 PENCOLOR { 000,000,000 } PENWIDTH 4
DRAW LINE IN WINDOW WinPanel AT 80,80 TO segX2,segY2 PENCOLOR { 255,000,000 } PENWIDTH 3
RETURN NIL
De esta forma se miniminiza el parpadeo al actuar solo el comando ERASE sobre la window panel
Y la 2ª Opción.
Esta mola más pero es algo más complicada, ya que necesitas saber el color exacto del fondo del reloj.
Yo lo he probado con WHITE pero creo que es algo más oscuro.
Te defines 6 variables para contener las coordenadas antiguas
PRIVATE nHorX1:=nHorY2:=nMinX1:=nMinY2:nSegX1:=nSegX2:=0
Y ahora en la funcion DIBUJA pondrias algo como esto
IF nHorX1!=horX2 .OR. nHorY2!=horY2
// Veo que si tengo algun valor tengo que pintar de color original... un gris raro
IF nHorX1!=0
DRAW LINE IN WINDOW Form_1 AT 265,1165 TO nHorX1,nHorY2 PENCOLOR WHITE PENWIDTH 4
ENDIF
// Actualizo Valores
nHorX1:=horX2
nHorY2:=horY2
// Pinto la hora Correcta
DRAW LINE IN WINDOW Form_1 AT 265,1165 TO horX2,horY2 PENCOLOR { 000,000,000 } PENWIDTH 4
ENDIF
Y lo mismo para los minutos y los segundos....
Esta 2ª opción evita los parpadeos.., pero claro amigo..., tienes que buscar el colorete!!!
Ya me dices si te gustan.
Un saludo una cervecita bien fresquita!!!