Page 1 of 1

Color degradado en dialogos

PostPosted: Tue Jul 29, 2008 1:00 pm
by fgondi
¿Cómo puedo establecer un color degradado en el fondo de un cuadro de dialogo?

He probado esto que he visto en el foro

Code: Select all  Expand view
oDlg:bPainted := {|| Gradiente(oDlg)}

Proc Gradiente( oDlg )
local nGradient, oBrush
local aRect := GetClientRect( oDlg:hWnd )
local hDC   := oDlg:hDc
nGradient := Gradient(hDc, { aRect[1], aRect[2], aRect[3], aRect[4] }, nRgb(255,255,255), nRgb(224,236,255), .T. )
DEFINE BRUSH oBrush COLOR nGradient
FillRect( hDC, aRect, oBrush:hBrush )
ReleaseDC( oDlg:hWnd, hDC )
return


El problema es que en el dialogo existen controles radios buttons y checkbox, y estós no cogen el color de fondo.

También he leido que la forma correcta es teniendo un degradado en un bitmap y estableciendo el fondo con
Code: Select all  Expand view
DEFINE BRUSH oBrush FILENAME "C:\fwh\bitmaps\backgrnd\gradien.bmp"
Define Dialog oDlg Title cTitle Resource "MSGGET_TXT" TRANSPARENT Brush oBrush


Pero el problema es que tendría que crear un bitmap por cada dialogo, si estos cambian de largo.

PostPosted: Tue Jul 29, 2008 9:14 pm
by Carlos Mora
Hola Fernando,

deja lo del gradiente, pero añade las cláusulas de 'transparente' en los controles. Asi el fondo del control no se pinta y queda el fondo que pinto el dialogo.

Un saludo,
Carlos.

PostPosted: Wed Jul 30, 2008 7:04 am
by fgondi
Hola Carlos,

Gracias por tu tiempo.


Nada, que sigo sin conseguirlo.
He probado a definir el recurso con la condición WS_EX_TRANSPARENT
He probado a cambiar el valor ::transparent del objeto CheckBox
Code: Select all  Expand view
oCheck:lTransparent := .T.


Ni con cada una por separado ni con las dos juntas he conseguido mostar el checkbox sin el fondo gris.

Image

PostPosted: Wed Jul 30, 2008 5:44 pm
by fespinoza
Carlos

Creo que lo que te aconsejan es agregar el TRANSPATENT directamente así por ejemplo:

REDEFINE GROUP oGrp ID 8101 OF oFld:aDialogs[1] TRANSPARENT

Yo lo hice con un group dentro de un folder y me funciono bien; no he probado con RADIO ni con CHECKBOX.

PostPosted: Wed Jul 30, 2008 6:19 pm
by Antonio Linares
Fernando,

Aqui tienes un ejemplo:

test.prg:
Code: Select all  Expand view
#include "FiveWin.ch"

function Main()

   local oBrush, oDlg, oRad, nVal := 1, oCbx, lVal := .T., oGrp

   DEFINE BRUSH oBrush FILE "..\bitmaps\grad.bmp"

   DEFINE DIALOG oDlg RESOURCE "Test" BRUSH oBrush TRANSPARENT

   REDEFINE RADIO oRad VAR nVal ID 10 OF oDlg
   
   REDEFINE CHECKBOX oCbx VAR lVal ID 20 OF oDlg
   
   REDEFINE GROUP oGrp ID 30 OF oDlg
   
   REDEFINE BUTTON ID 1 OF oDlg ACTION oDlg:End()

   ACTIVATE DIALOG oDlg CENTERED

return nil


Test.rc
Code: Select all  Expand view
#ifdef __FLAT__
   1 24 "winxp\WindowsXP.Manifest"
#endif

test DIALOG 17, 36, 185, 147
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Test"
FONT 8, "MS Sans Serif"
{
RADIOBUTTON "Radio", 10, 24, 15, 60, 12, BS_AUTORADIOBUTTON
CHECKBOX "Checkbox", 20, 24, 31, 60, 12, BS_AUTOCHECKBOX | WS_TABSTOP
GROUPBOX "Group", 30, 18, 50, 145, 38, BS_GROUPBOX
DEFPUSHBUTTON "OK", 1, 67, 128, 50, 14
}

Image

Aqui tienes los ficheros y el EXE:
http://www.mediafire.com/?utl0mmjnut2

PostPosted: Wed Jul 30, 2008 6:54 pm
by Alfredo Arteaga
Tengo el mismo problema que Fernando.

Veo que si se usa como fondo una imagen, al crear el BRUSH se genera el recurso hBitmap mismo que es tomado por los controles incluidos.

Pero si el BRUSH es generado con un color no hay hBitmap, posiblemente por ahí este el secreto.

PostPosted: Wed Jul 30, 2008 7:20 pm
by wmormar
Alfredo,

efectivamente ese es el problema (checado), si el degradado se basa en un pintado sin la creacion de un BRUSH, pues sinplemente no lo toma en cuenta, y cuando se hace el degradado por una imagen, ahi si toma la caracteristica de transparente los controles.

saludos

Alfredo Arteaga wrote:Tengo el mismo problema que Fernando.

Veo que si se usa como fondo una imagen, al crear el BRUSH se genera el recurso hBitmap mismo que es tomado por los controles incluidos.

Pero si el BRUSH es generado con un color no hay hBitmap, posiblemente por ahí este el secreto.

PostPosted: Wed Jul 30, 2008 8:43 pm
by Antonio Linares
Seguro que asi os gusta más :-)

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

function Main()

   local oDlg, oRad, nVal := 1, oCbx, lVal := .T., oGrp
   local hBmp := ReadBitmap( 0, "rainbow.bmp" )

   DEFINE DIALOG oDlg RESOURCE "Test" TRANSPARENT

   REDEFINE RADIO oRad VAR nVal ID 10 OF oDlg
   
   REDEFINE CHECKBOX oCbx VAR lVal ID 20 OF oDlg
   
   REDEFINE GROUP oGrp ID 30 OF oDlg
   
   REDEFINE BUTTON ID 1 OF oDlg ACTION oDlg:End()

   ACTIVATE DIALOG oDlg CENTERED ;
      ON PAINT DrawBitmap( hDC, hBmp, 0, 0, oDlg:nWidth, oDlg:nHeight )

   DeleteObject( hBmp )

return nil

Image
Aqui teneis el PRG y el EXE. Podeis modificar el bitmap usado y cambiarlo por uno vuestro. Requiere un nuevo build de FWH 8.07:
http://www.mediafire.com/?nbh21ugth3t

PostPosted: Wed Jul 30, 2008 8:50 pm
by Antonio Linares
Modificando el recurso para que se aprecien mejor los colores:

Image

PostPosted: Thu Jul 31, 2008 6:36 am
by fgondi
Antonio,

Como siempre mejorando el sistema. Así da gusto :wink:

De esa forma sólo necesito crear un bitmap de 1 pixel de ancho con el color degradado ya que luego se puede agrandar hasta cubir el espacio.

El major problema que veía a no poder redimensionar la imagen era en las ventanas mdi.

En los dialogos, al fin y al cabo, era crear varias imagenes, un poco engorroso, pero que remedio.

Sin embargo en las mdi veia un problema. Las ventanas cambian de tamaño segun la resolución y tenía que crear una imagen por cada resolución posible, que anda que no hay, sobre todo ahora con los monitores de 22'' bajando el precio.

Pero con esta aportación creo que esta todo solucionado.

PostPosted: Thu Jul 31, 2008 8:57 am
by Antonio Linares
Fernando,

Acabamos de publicar una revisión de FWH 8.07 que ya incluye esta característica :-)

alguno sample

PostPosted: Thu Jul 31, 2008 2:55 pm
by fleal
Fernando

//De esa forma sólo necesito crear un bitmap de 1 pixel de ancho con el color degradado ya que luego se puede agrandar hasta cubir el espacio.

¿Algún ejemplo de eso que mencionas?

Yo tambien varios bmps de diferentes tamaños para mis dialogos.


Gracias
Fernando Leal

PostPosted: Fri Aug 01, 2008 8:11 am
by fgondi
Antonio,

Acabo de adquirir 8.07 y al compilar he comprobado que sigue viendose con el fondo gris.

Ya he leido en el foro en inglés que habeis visto el problema en XP
http://fivetechsoft.com/forums/viewtopic.php?t=12117

Fernando,

El ejemplo es el que publica Antonio en este post, cambiando "rainbow.bmp" por una imagen con el color degradado.

PostPosted: Fri Aug 01, 2008 8:35 am
by Antonio Linares
Fernando,

En Vista funciona bien, pero no lo hace bien en XP. De hecho hasta hemos probado en Wine (soporte para Windows en Linux y OSX) y tampoco funciona.

Lo curioso es que FillRect() si funciona. Asi que hemos revisado el código fuente de FillRect() (de los fuentes open source de Wine) y lo único que hace es una llamada a PatBlt(). Por alguna razón el API de Windows en XP tolera que se use un brush desde el mensaje WM_CTLCOLOR... pero no admite una copia de hDC a hDC.

Vamos a intentar hoy mismo una solución alternativa, que consistiría en generar sobre la marcha un pequeño bitmap con el fondo de la imagen del control y usarlo como brush para el control. A ver si así conseguimos que XP lo admita.

La verdad es que Microsoft debería cuidar estos detalles y mantener compatibilidad entre XP y Vista. El caso es que lo han arreglado en Vista y no lo han arreglado en XP.

PostPosted: Fri Aug 01, 2008 8:49 am
by fgondi
Antonio,

Gracias por vuestro tiempo.

La verdad es que Microsoft debería cuidar estos detalles y mantener compatibilidad entre XP y Vista. El caso es que lo han arreglado en Vista y no lo han arreglado en XP.


Con la cantidad de problemas que tienen en Vista y lo estable que es XP deberían preocuparse mas de buque insignia.

Pues si en la service pack 3 incluian muchas mejoras que habían hecho en Vista y algo tan basico como esto no lo han incluido, a uno le hacen dudar de las mejoras de la service pack 3.