Color degradado en dialogos

Post Reply
User avatar
fgondi
Posts: 636
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Color degradado en dialogos

Post 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

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

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 _ de largo.
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Post 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.
User avatar
fgondi
Posts: 636
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Post 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

oCheck:lTransparent := .T.
Ni con cada una por separado ni con las dos juntas he conseguido mostar el checkbox sin el fondo gris.

Image
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
User avatar
fespinoza
Posts: 188
Joined: Wed Feb 01, 2006 6:59 pm
Location: Ecuador

Post 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.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Fernando,

Aqui tienes un ejemplo:

test.prg:

Code: Select all

#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

#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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Alfredo Arteaga
Posts: 326
Joined: Sun Oct 09, 2005 5:22 pm
Location: Mexico
Contact:

Post 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.
User avatar
wmormar
Posts: 1050
Joined: Fri Oct 07, 2005 10:41 pm
Location: México
Contact:

Post 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.
William, Morales
Saludos

méxico.sureste
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Seguro que asi os gusta más :-)

Code: Select all

#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
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Modificando el recurso para que se aprecien mejor los colores:

Image
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
fgondi
Posts: 636
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Post 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.
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Fernando,

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

Antonio Linares
www.fivetechsoft.com
fleal
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF

alguno sample

Post 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
User avatar
fgondi
Posts: 636
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Post 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.
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post 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.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
fgondi
Posts: 636
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Post 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.
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
Post Reply