FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Say Transparente sobre Brush o Gradient no funciona
Posts: 514
Joined: Sun Oct 16, 2005 03:32 AM
Say Transparente sobre Brush o Gradient no funciona
Posted: Thu Jul 15, 2010 01:11 AM
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.



Ejemplo:
Code (fw): Select all Collapse
#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

Saludos,



Carlos Gallego



*** FWH-25.12, xHarbour 1.3.1 Build 20241008, Borland C++7.70, PellesC, ADS 11.1***

Posts: 234
Joined: Tue Sep 01, 2009 07:55 AM
Re: Say Transparente sobre Brush o Gradient no funciona
Posted: Thu Jul 15, 2010 06:29 AM
Carlos intenta probar con esto:
Code (fw): Select all Collapse
ACTION (oSay:SetText("Hora:  "+Time()),osay:hide(),osay:show(),oSay:Refresh())

A mi así si me funciona.
Un saludo
José Luis
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Say Transparente sobre Brush o Gradient no funciona
Posted: Thu Jul 15, 2010 07:22 AM
Carlos, José Luis,

Asi tambien funciona (probado en W7) y se evitan parpadeos:
Code (fw): Select all Collapse
     ACTION ( oSay:SetText("Hora:  "+Time()), oSay:Hide(), oSay:Show() )
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 514
Joined: Sun Oct 16, 2005 03:32 AM
Re: Say Transparente sobre Brush o Gradient no funciona
Posted: Thu Jul 15, 2010 08:23 PM
Code (fw): Select all Collapse
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

Saludos,



Carlos Gallego



*** FWH-25.12, xHarbour 1.3.1 Build 20241008, Borland C++7.70, PellesC, ADS 11.1***

Posts: 514
Joined: Sun Oct 16, 2005 03:32 AM
Re: Say Transparente sobre Brush o Gradient no funciona
Posted: Sat Jul 17, 2010 05:12 AM

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

Saludos,



Carlos Gallego



*** FWH-25.12, xHarbour 1.3.1 Build 20241008, Borland C++7.70, PellesC, ADS 11.1***

Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Say Transparente sobre Brush o Gradient no funciona
Posted: Sat Jul 17, 2010 05:47 AM
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 (fw): Select all Collapse
#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

Continue the discussion