// 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