Page 1 of 1

Say Transparente sobre Brush o Gradient no funciona

PostPosted: Thu Jul 15, 2010 1:11 am
by Cgallegoa
Hola amigos,

En un diálogo simple, con un gradient, un say y un timer la transparencia del Say no funciona.

Cuando se refrezca el Say en el Timer, quita la transparencia.

Image

Ejemplo:
Code: Select all  Expand view
#include "FiveWin.ch"
#include "Ribbon.ch"

STATIC oTimer

Function Inicio()
LOCAL odlg, oBrush, oBtn, oSay
  DEFINE DIALOG oDlg FROM 0,0 TO 140,500 PIXEL TRANSPARENT TITLE "Transparent Say does not work either on brush or on gradient - FWH 10.3" //  BRUSH oBrush
      @ 20,150 SAY oSay PROMPT "Hora:  "+Time() OF oDlg PIXEL COLOR nRGB(255,50,50) SIZE 80,10
      @ 45,110 RBBTN oBtn PROMPT "Salir" OF oDlg SIZE 30,15 ROUND ACTION oDlg:end() PIXEL
  ACTIVATE DIALOG oDlg CENTERED ON INIT Set_Timer(oDlg,oSay);
     ON PAINT GradientFill( hDC, 0, 0, oDlg:nHeight, oDlg:nWidth, { { 0.50, 16054371, 8388608 } } )
Return(NIL)

function Set_Timer(oDlg,oSay)
  DEFINE TIMER oTimer INTERVAL 1000 OF oDlg ;
     ACTION (oSay:SetText("Hora:  "+Time()),oSay:Refresh())
  ACTIVATE TIMER oTimer
return


También probé con Brush y pasa lo mismo.

FWH-10.3, xHarbour 1.2.1, Borland 5.82, Windos XP, Windos Wista y Windows 7

Alguna sugerencia de cómo corregirlo ?

Gracias y Saludos,

Carlos Gallego

Re: Say Transparente sobre Brush o Gradient no funciona

PostPosted: Thu Jul 15, 2010 6:29 am
by groiss
Carlos intenta probar con esto:
Code: Select all  Expand view

ACTION (oSay:SetText("Hora:  "+Time()),osay:hide(),osay:show(),oSay:Refresh())

 

A mi así si me funciona.
Un saludo
José Luis

Re: Say Transparente sobre Brush o Gradient no funciona

PostPosted: Thu Jul 15, 2010 7:22 am
by Antonio Linares
Carlos, José Luis,

Asi tambien funciona (probado en W7) y se evitan parpadeos:
Code: Select all  Expand view

     ACTION ( oSay:SetText("Hora:  "+Time()), oSay:Hide(), oSay:Show() )
 

Re: Say Transparente sobre Brush o Gradient no funciona

PostPosted: Thu Jul 15, 2010 8:23 pm
by Cgallegoa
Code: Select all  Expand view
ACTION ( oSay:SetText("Hora:  "+Time()), oSay:Hide(), oSay:Show() )
 

Antonio funcionó bien, aunque con más says en el mismo diálogo de todas formas parpadea. :?
Me quedan algunas dudas:

Porqué pasa eso con oSay:Refresh() ?
Es mejor entonces usar :Hide() y :Show() ?
En cuáles casos usar :Refresh() y en cuáles :Hide() :Show()
Cómo evitar el parpadeo ?

El diálogo tiene al lado izquierdo un browse de una base de datos y a lado derecho una serie de says que muestran algunos de los datos de la base: nombre, dirección, teléfonos, ciudad, etc. Conforme se navega en el browse los says se refrezcan con el contenido de los campos. Ahí es donde parpadea aunque ya pinta bien la transparencia de los says.

Te contacto a tu privado para hacerte una consulta para la compra de FWH 10.07

Millón de gracias y saludos,

Carlos Gallego

Re: Say Transparente sobre Brush o Gradient no funciona

PostPosted: Sat Jul 17, 2010 5:12 am
by Cgallegoa
Antonio,

Con la solución propuesta por tí funciona bien la transparencia en los say sobre brush o gradient, pero parpadean más que ojos con arena. Alguna forma de evitarlo ?

Gracias y saludos,

Carlos Gallego

Re: Say Transparente sobre Brush o Gradient no funciona

PostPosted: Sat Jul 17, 2010 5:47 am
by Daniel Garcia-Gil
Carlos...

Te comento.... las transparencias de un control no vienen de la imagen de fondo del padre, sino del brush del mismo, para controles nativos de window, como el caso del SAY estos son controlados por el brush... el boton (RBTN) es un control nativo de fivewin y lo que se hizo fue "simular" dicha transparencias con tecnicas diferentes a las que aplica window a sus controles, es decir, el control SAY si es transparente, el problema esta es que el brush del padre (Dialogo) es blanco, hay que crear un brush con el gradiente y veras la diferencia, te dejo el ejemplo..

Code: Select all  Expand view

#include "FiveWin.ch"
#include "Ribbon.ch"

STATIC oTimer

Function Inicio()
LOCAL odlg, oBrush, oBtn, oSay

 
  DEFINE DIALOG oDlg FROM 0,0 TO 140,500 TRANSPARENT PIXEL;
         TITLE "Transparent Say does not work either on brush or on gradient - FWH 10.3" ;
         BRUSH oBrush
      @ 20,150 SAY oSay PROMPT "Hora:  "+Time() OF oDlg PIXEL COLOR nRGB(255,50,50) SIZE 80,10
      @ 45,110 RBBTN oBtn PROMPT "Salir" OF oDlg SIZE 30,15 ROUND ACTION oDlg:end()
     
  ACTIVATE DIALOG oDlg CENTERED ;
     ON INIT ( Set_Timer(oDlg,oSay), Gradient_oBrush( oDlg, { { 0.50, 16054371, 8388608 } } ) )
     

Return(NIL)

function Set_Timer(oDlg,oSay)
  DEFINE TIMER oTimer INTERVAL 1000 OF oDlg ;
     ACTION (oSay:SetText("Hora:  "+Time()),oSay:Refresh())
  ACTIVATE TIMER oTimer
return NIL


function Gradient_oBrush( oDlg, aColors )

   local hDC, hBmp, hBmpOld, oBrush
   
   if Empty( oDlg:oBrush:hBitmap )
      hDC = CreateCompatibleDC( oDlg:GetDC() )
      hBmp = CreateCompatibleBitMap( oDlg:hDC, oDlg:nWidth, oDlg:nHeight )
      hBmpOld = SelectObject( hDC, hBmp )
      GradientFill( hDC, 0, 0, oDlg:nHeight, oDlg:nWidth, aColors )
      DeleteObject( oDlg:oBrush:hBrush )
      oDlg:oBrush:hBitmap = hBmp
      oDlg:oBrush:hBrush = CreatePatternBrush( hBmp )
      SelectObject( hDC, hBmpOld )
      oDlg:ReleaseDC()
   endif  

return nil