Page 1 of 1

Diferentes degrados de color en ToolBar y dialogo

Posted: Wed Apr 12, 2006 4:53 pm
by Raymundo Islas M.
Antonio :

Sigo con mis degrados :wink: (no lo puedo evitar, me fascinan )

Quisiera aplicar un color diferente a la ToolBar y otro al Dialogo, pero como el dialogo es contenedor de la barra de botones les aplica a los 2 el mismo degrado tanto en color como en tamaño, hay alguna forma de separar esto ?

Este es el degrado a la ToolBar :
Image

Y asi sale cuando le aplico el degrado al dialogo :
Aun cuando le defino diferentes colores y tamaño
Image


Muchas Gracias y Saludos

Posted: Thu Apr 13, 2006 6:40 am
by Antonio Linares
Raymundo,

Puedes publicar el código de un ejemplo pequeño y autocontenido (completo!) para que podamos probarlo ? gracias.

Posted: Thu Apr 13, 2006 11:44 am
by karinha
// COLOR DEGRADADO EN WINDOWS

#include "Fivewin.ch"

static oWnd

/* Degradado en una ambiente MDI. Ventana Padre.
Fijate como en un Ambiente MDI,la padre ,debemos pasarle a la
funcion del degradado , oWnd:oWndClient.
*/
Function Main()
Local nColor := 73647364737

DEFINE WINDOW oWnd MDI TITLE "Pasate por http://www.getex.net/gentefive";
MENU BuildMenu( )

ACTIVATE WINDOW oWnd ;
ON PAINT FillWnd( oWnd:oWndClient, nColor )

Return Nil

Static Func BuildMenu( )
Local oMenu
MENU oMenu
MENUITEM "Muestras de Degradado"
MENU
MENUITEM "Sobre una MDI" ACTION ( WndMdi( ) )
MENUITEM "Sobre un Dialogo Dialog" ACTION ( Dial( ) )
MENUITEM "Sobre una MDI con Folder" ACTION ( Folders( ) )
ENDMENU
ENDMENU
return oMenu

/* Degradado en una Ventana hija MDI
Usamos el evento ON PAINT para este menester.
No me dirás que no tiene nada de complicado y que
más simple imposible
Si pulsas el boton izquiedo del mouse puedes cambiar
el color en tiempo de ejecucion
*/
Function WndMdi( )
Local oWndChild
Static nColor := 342342342

DEFINE WINDOW oWndChild MDICHILD TITLE " Queda majo,la cosa ? " OF oWnd ;
ACTIVATE WINDOW oWndChild ;
ON PAINT FillWnd( oWndChild , nColor ,,2 ) ;
ON LEFT CLICK ( nColor := ChooseColor() ,;
FillWnd( oWndChild , nColor,,2 ) )

return nil


/* Degradado en un Dialog normal y corriente */
Function Dial()
Local oDlg
Static nColor := 160002999

DEFINE DIALOG oDlg TITLE "The GenteFive" OF oWnd

ACTIVATE DIALOG oDlg CENTER ;
ON PAINT FillWnd( oDlg , nColor ,,1 ) ;
ON LEFT CLICK ( nColor := ChooseColor() ,;
FillWnd( oDlg , nColor,,1 ) )

return nil

/* Degradados en un Folder.
Atentos. Aqui debemos de hacer dos trampas ;)
Primero el Folder debe de coger el color que vayamos a degradar y
segundo , debemos de modificar el evento ON PAINT de todos los
dialogos que componen el Folder
*/
Function Folders()
Local oWndChild,oFld
Local nColor := 4545454543

DEFINE WINDOW oWndChild MDICHILD TITLE "Folders en MDI " OF oWnd

/*1 Truco. Ya que el pintado del Folder es una funcion en C
y ha mi no me gusta tocar nada, le pasamos el color escogido para
que la cabecera pase disimulada y veamos que 'casi' forma parte
del degradado ;) Mira , una ilusion optica
*/
@ 1, 1 FOLDER oFld ITEMS "&TheFull", "&Joaquim", "The Best of Fivewin" ;
OF oWndChild COLOR 0,nColor

/*2 Truco.
Como sabras , los folders no son mas que dialogos creados en tiempo de
ejecucion. Hay que modificar el evento ON PAINT por cada dialogo.
*/
oFld:aDialogs[1]:bPainted := { || FillWnd (oFld:aDialogs[1],nColor ) }
oFld:aDialogs[2]:bPainted := { || FillWnd (oFld:aDialogs[2],nColor ) }

/* a Este le pasamos otro color XD */
oFld:aDialogs[3]:bPainted := { || FillWnd (oFld:aDialogs[3],(nColor+3312312), , 1.5 ) }

ACTIVATE WINDOW oWndChild ;
ON RESIZE FoldResize( oWndChild, oFld ) ;
ON PAINT FillWnd( oWndChild , nColor )
return nil

function FoldResize( oWnd, oFld )
local oRect := oWnd:GetCliRect()

oFld:Move( 0, 0, oRect:nRight - oRect:nLeft ,;
oRect:nBottom - oRect:nTop , .t. )

return nil

/* Funcion de degradado de control cualquiera.
Basada en el Install.prg de Fivewin, pero con
descomposicion de los colores primarios y
centrado de un Bitmap.

Mejoras:
Ahora, en equipos menos potentes el pintado de un
degradado la velocidad de apertura y el evento PAINT
se nos muere y vemos hasta como pinta Windows,
Por lo tanto el color puro significa que no
hara caso al evento ON PAINT.

oWnd := Ventana, Dialog o Control.
nColor := Color para hacer el Degradado
oBmp := Objeto Bitmap o Image para centrar en Wnd o Dlg
nSaltos := Oscuridad. Cuanto más pequño , mas oscuro.
Si quieres ver cuando se produce un eveto ON PAINT
pasale un 0.1 y SORPRESA!!!!
*/
Function FillWnd( oWnd ,nColor, oBmp , nSaltos )
local hWnd := oWnd:hWnd
local aRect := GetClientRect( hWnd )
local oBrush, n
local nTop := aRect[ 1 ]
local nBottom := aRect[ 3 ]
local nSteps
Local nBlue,nRed,nGreen
Local lPuro := .F. // LoadIniPure() // Si es puro no hay degradado

// Color de degradado
DEFAULT nColor := 123123122 // LoadIni("MADRE","DegraDialog")

IF !Empty( oBmp )
IF UPPER(oWnd:ClassName()) == 'TDIALOG' // Si es un Dialogo
oWnd:GetDC()
PalBmpDraw( oWnd:hDC, 0, 0, oBmp:hBmpPal )
oWnd:ReleaseDC()
ENDIF
WndCenter( oBmp:hWnd, oWnd:hWnd )
ENDIF

if lPuro == .T.
oWnd:SetColor( 0, nColor )
oWnd:Refresh()
else
lPuro := .F.
endif

if !lPuro // El color no es puro, entonces degradado
nBlue := nRGBBlue( nColor )
nRed := nRGBRed( nColor )
nGreen := nRGBGreen( nColor)

DEFAULT nSaltos := 3
nSteps := ( aRect[ 3 ] - aRect[ 1 ] ) / nSaltos

oWnd:GetDC()

aRect[ 3 ] = 0

for n = 1 to nSteps
aRect[ 3 ] += nSaltos
DEFINE BRUSH oBrush COLOR RGB(nRed,nGreen,nBlue)
FillRect( oWnd:hDC, aRect, oBrush:hBrush )
RELEASE BRUSH oBrush

aRect[ 1 ] += nSaltos
nBlue -= 1
nRed -= 1
nGreen -= 1

if nBlue < 0 ; nBlue += 1 ; endif
if nRed < 0 ; nRed += 1 ; endif
if nGreen < 0 ; nGreen += 1 ; endif
next
oWnd:ReleaseDC()
//oWnd:Refresh()
endif
return nil

Posted: Thu Apr 13, 2006 12:34 pm
by karinha

Posted: Thu Apr 13, 2006 5:35 pm
by Raymundo Islas M.
Muchas Gracias Joao

Lo voy a probar !


Saludos