Page 1 of 1
Color degradado en dialogos
Posted: 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
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
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.
Posted: 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.
Posted: 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
Ni con cada una por separado ni con las dos juntas he conseguido mostar el checkbox sin el fondo gris.

Posted: 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.
Posted: Wed Jul 30, 2008 6:19 pm
by Antonio Linares
Fernando,
Aqui tienes un ejemplo:
test.prg:
Code: Select all | Expand
#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
#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
}
Aqui tienes los ficheros y el EXE:
http://www.mediafire.com/?utl0mmjnut2
Posted: 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.
Posted: 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.
Posted: Wed Jul 30, 2008 8:43 pm
by Antonio Linares
Seguro que asi os gusta más
Code: Select all | Expand
#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
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
Posted: Wed Jul 30, 2008 8:50 pm
by Antonio Linares
Modificando el recurso para que se aprecien mejor los colores:

Posted: Thu Jul 31, 2008 6:36 am
by fgondi
Antonio,
Como siempre mejorando el sistema. Así da gusto
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.
Posted: 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
Posted: 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
Posted: 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.
Posted: 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.
Posted: 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.