¿ Como se podria hacer ?


Amigo aun no hay respuesta,
saludos
Karinha,
Falta la luz
. Es decir... falta el efecto de luz. El enlace no lo tiene, solo tiene un Roundrect()
jbrita, ya se anima la cosa... a ver a ver...
Saludos
Podriamos dibujar un degradado en cada lado (arriba, izquierda, abajo, derecha). Tenemos una función para eso.
Pero en las esquinas no nos serviría.
Podriamos dibujar un RoundRect() e ir variando las coordenadas y el color de pintado, asi podría funcionar ![]()
#include "FiveWin.ch"
function Main()
local oDlg, cTest := Space( 20 ), oGet
DEFINE DIALOG oDlg
@ 2, 3 GET oGet VAR cTest OF oDlg SIZE 100, 13
oGet:bPainted = { || LightBorder( oGet ) }
ACTIVATE DIALOG oDlg CENTERED
return nil
function LightBorder( oGet )
local hDC := oGet:oWnd:GetDC()
local hBrush, hOldBrush, n
local aTopLeft, aBottomRight
local oPen
for n = 1 to 10
SelectObject( hDC, oPen := TPen():New( ,, nRGB( n ^ 2, n ^ 2, 200 ) ):hPen )
aTopLeft = ClientToScreen( oGet:hWnd, { oGet:nTop, oGet:nLeft } )
aTopLeft = ScreenToClient( oGet:oWnd:hWnd, aTopLeft )
aBottomRight = ClientToScreen( oGet:hWnd, { oGet:nBottom, oGet:nRight } )
aBottomRight = ScreenToClient( oGet:oWnd:hWnd, aBottomRight )
SetBkMode( hDC , 1 )
Rectangle( hDC, aTopLeft[ 2 ] - 2 - n,;
aTopLeft[ 1 ] - 2 - n,;
aBottomRight[ 1 ] + 2 + n,;
aBottomRight[ 2 ] + 2 + n )
oPen:End()
next
oGet:oWnd:ReleaseDC()
return nilAntonio,
De tu codigo, me viene una idea:
Tu funcion lightborder() intenta pintar fuera del oGet, en el dialogo , en el momento del oGet:Paint() del oGet, fuera de los limites del oGet usando un hDC del dialogo.Recuerdo vagamente que hace tiempo vez intente lo mismo (o similar) sin exito. Entonces lo achaqué a mis pobres conocimientos.
En su dia hasta donde investigué, descubrí que los controles tienen un pintado non client o algo asi, de manera que quiza lo que habria que hacer seria utilizar un pintado non client en un el evento de pintado non client del control y para ello el method :handleevent() de controls.prg deberia recoger el evento WM_NCPAINT y crear una data ::bNCPainted que seria la que contuviera la llamada al lightborder()
Todo dicho con mucho recato: no se si seria la solucion. Perdon por mi vaguedad de conceptos...
Saludos.
Paco,
Podriamos usar eso pero vendría a ser lo mismo.
En mi código ya se pinta encima del diálogo. Lo que no se es porque no se ven los sucesivos rectángulos en diferentes posiciones.
A ver si a alguien se le ocurre algo (Daniel, Manuel, Cristobal! Help!) ![]()
Antonio,
No lo he probado, pero creo que falla el hDC, con esos 2 parámetros, no se necesita el oGet, prueba así:
oGet:bPainted = { |hDC| LightBorder( hDC, oGet:HWnd ) }
function pintaselect(oItem)
local hDC := oItem:oWnd:GetDC()
local hBrush, hOldBrush, n
local aTopLeft, aBottomRight
local oPen,hPen1
local aRect := GetClientRect( oItem:hWnd )
for n = 1 to 10
hPen1 = CreatePen( PS_SOLID, 1, nRGB( Int(189- (n ^ 2)), Int(230-(n ^ 2) ) , 252 ) )
// SelectObject( hDC, oPen := TPen():New( ,, nRGB( n ^ 2, n ^ 2, 200 ) ):hPen )
SelectObject( hDC,hPen1)
aTopLeft = ClientToScreen( oItem:hWnd, { aRect[1], aRect[2] } )
aTopLeft = ScreenToClient( oITem:oWnd:hWnd, aTopLeft )
aBottomRight = ClientToScreen( oItem:hWnd, {aRect[3], aRect[4] } )
aBottomRight = ScreenToClient( oItem:oWnd:hWnd, aBottomRight )
SetBkMode( hDC , 1 )
Rectangle( hDC, aTopLeft[1]-12 + n, aTopLeft[2]-12+ n, aBottomRight[ 1 ]+12 -n, aBottomRight[ 2 ]+12-n )
DeleteObject( hPen1 )
next
oItem:oWnd:ReleaseDC()
Return nilcase WM_NCPAINT:
{
HDC hdc;
RECT rect;
HBRUSH b;
HPEN pe;
hdc=GetDCEx(hwnd,(HRGN)wParam,DCX_WINDOW|DCX_CACHE|DCX_INTERSECTRGN|DCX_LOCKWINDOWUPDATE);
GetWindowRect(hwnd,&rect);
b=CreateSolidBrush(RGB(0,180,180));
SelectObject(hdc,B)/>;
pe=CreatePen(PS_SOLID, 1, RGB(90, 90, 90));
SelectObject(hdc,pe);
Rectangle(hdc,0,0,(rect.right-rect.left),(rect.bottom-rect.top));
DeleteObject(pe);
DeleteObject(B)/>;
ReleaseDC(hwnd,hdc);
RedrawWindow(hwnd,&rect,(HRGN)wParam,RDW_UPDATENOW);
return 0;
}pintaselect( oItem)
local hDC := oItem:oWnd:GetDC()
local hBrush, hOldBrush, n
local aTopLeft, aBottomRight
local oPen,hPen1
local aRect := GetClientRect( oItem:hWnd )
for n = 1 to 6
IF n > 5
hPen1 = CreatePen( PS_SOLID, 1, nRGB(102 , 175, 233 ) )
ELSE
hPen1 = CreatePen( PS_SOLID, 1, nRGB( Int(254 - n*3-n ), Int(254- n*2 ) , 255 ) )
endif
// hPen1 = CreatePen( PS_SOLID, 1, nRGB( Int(244 - n ), Int(254- n ) , 255 ) )
// SelectObject( hDC, oPen := TPen():New( ,, nRGB( n ^ 2, n ^ 2, 200 ) ):hPen )
SelectObject( hDC,hPen1)
aTopLeft = ClientToScreen( oItem:hWnd, { aRect[1], aRect[2] } )
aTopLeft = ScreenToClient( oITem:oWnd:hWnd, aTopLeft )
aBottomRight = ClientToScreen( oItem:hWnd, {aRect[3], aRect[4] } )
aBottomRight = ScreenToClient( oItem:oWnd:hWnd, aBottomRight )
SetBkMode( hDC , 1 )
Rectangle( hDC, aTopLeft[1]-8 + n, aTopLeft[2]-8+ n, aBottomRight[ 1 ]+8 -n, aBottomRight[ 2 ]+8-n )
DeleteObject( hPen1 )
next
oItem:oWnd:ReleaseDC()
Return nil#Include "FiveWin.ch"
function Main()
local oDlg, cTest := Space( 20 ), oGet
DEFINE DIALOG oDlg
@ 2, 3 GET oGet VAR cTest OF oDlg SIZE 100, 13
oGet:bPainted = { || LightBorder( oGet ) }
ACTIVATE DIALOG oDlg CENTERED
return nil
//Function pintaselect( oItem )
function LightBorder( oGet )
local hDC := oGet:oWnd:GetDC()
local hBrush, hOldBrush, n
local aTopLeft, aBottomRight
local oPen,hPen1
local aRect := GetClientRect( oGet:hWnd )
for n = 1 to 6 // 10 es mejor
IF n > 5
hPen1 = CreatePen( PS_SOLID, 1, nRGB( 102 , 175, 233 ) )
ELSE
hPen1 = CreatePen( PS_SOLID, 1, nRGB( Int(254 - n*3-n ), Int(254- n*2 ) , 255 ) )
endif
// hPen1 = CreatePen( PS_SOLID, 1, nRGB( Int(244 - n ), Int(254- n ) , 255 ) )
// SelectObject( hDC, oPen := TPen():New( ,, nRGB( n ^ 2, n ^ 2, 200 ) ):hPen )
SelectObject( hDC,hPen1)
aTopLeft = ClientToScreen( oGet:hWnd, { aRect[1], aRect[2] } )
aTopLeft = ScreenToClient( oGet:oWnd:hWnd, aTopLeft )
aBottomRight = ClientToScreen( oGet:hWnd, {aRect[3], aRect[4] } )
aBottomRight = ScreenToClient( oGet:oWnd:hWnd, aBottomRight )
SetBkMode( hDC , 1 )
Rectangle( hDC, aTopLeft[1]-8 + n, aTopLeft[2]-8+ n, aBottomRight[ 1 ]+8 -n, aBottomRight[ 2 ]+8-n )
DeleteObject( hPen1 )
next
oGet:oWnd:ReleaseDC()
Return nilGenial Antonio, Manuel !! ya hay luz...
Para completar, si no es mucho molestar... ahora faltaria que se pinte solo cuando el oGet (o oontrol) tenga el foco con luz (no se si GetFocus() == oGet:hWnd) y ademas que se apague en el oGet (o control) que antes tenia el foco con luz.
#include "Fivewin.ch"
Function Test()
Local oDlg, oFont, oBmp, cTest := Space( 20 ), oGet
DEFINE BITMAP oBmp FILE "..\bitmaps\back.bmp"
DEFINE FONT oFont NAME "Arial" SIZE 0,-36 BOLD NESCAPEMENT 250 //Texto 45º
DEFINE DIALOG oDlg FROM 0,0 to 18,40 TITLE "Texto sin relleno"
@ 2, 3 GET oGet VAR cTest OF oDlg SIZE 100, 13 ;
COLORS CLR_HRED, CLR_WHITE
oGet:bPainted = { || LightBorder( oGet ) }
ACTIVATE DIALOG oDlg CENTERED ON PAINT;
(DrawBitmap(oDlg:hDC,oBmp:hBitmap,0,0,oDlg:nWidth,oDlg:nHeight),;
HollowText(oDlg,200,20," Texto sin relleno ",oFont,CLR_GREEN,2))
RELEASE FONT oFont
RELEASE BITMAP oBmp
return nil
*************************************************************************
*
* Function HollowText(oDlg,y,x,cText,oFont,nColor,nWidth,nStyle)
*
* Dibuja sólo el contorno de un texto
* oDlg: Contenedor
* y,x : Coordenadas
* oFont: Fuente
* nColor, nWidth, nStyle: Color, ancho y estilo de contorno
*
* César E. Lozada cesarlozada@hotmail.com
* Los Teques, Venezuela 17-Abr-2003
*
*************************************************************************
Function HollowText(oDlg,y,x,cText,oFont,nColor,nWidth,nStyle)
Local hDC:=oDlg:hDC
Local nOldFont, hPen, hOldPen
DEFAULT oFont:=oDlg:oFont, nColor:=oDlg:nClrText,;
nWidth:=1, nStyle:=0 //PS_SOLID
nOldFont:=SelectObject(hDC,oFont:hFont)
hPen:=CreatePen(nStyle,nWidth,nColor)
hOldPen:=SelectObject(hDC,hPen)
BeginPath(hDC)
TextOut(hDC,y,x,cText,Len(cText))
EndPath(hDC)
StrokePath(hDC)
SelectObject(hDC,nOldFont)
SelectObject(hDC,hOldPen)
DeleteObject(hPen)
return nil
function LightBorder( oGet )
local hDC := oGet:oWnd:GetDC()
local hBrush, hOldBrush, n
local aTopLeft, aBottomRight
local oPen,hPen1
local aRect := GetClientRect( oGet:hWnd )
for n = 1 to 10
IF n > 5
//hPen1 = CreatePen( PS_SOLID, 1, nRGB( 102 , 175, 233 ) ) // blue
hPen1 = CreatePen( PS_SOLID, 1, RGB( 255, 165, 000 ) ) // orange
ELSE
hPen1 = CreatePen( PS_SOLID, 1, nRGB( Int(254 - n*3-n ), Int(254- n*2 ) , 255 ) )
endif
// hPen1 = CreatePen( PS_SOLID, 1, nRGB( Int(244 - n ), Int(254- n ) , 255 ) )
// SelectObject( hDC, oPen := TPen():New( ,, nRGB( n ^ 2, n ^ 2, 200 ) ):hPen )
SelectObject( hDC,hPen1)
aTopLeft = ClientToScreen( oGet:hWnd, { aRect[1], aRect[2] } )
aTopLeft = ScreenToClient( oGet:oWnd:hWnd, aTopLeft )
aBottomRight = ClientToScreen( oGet:hWnd, {aRect[3], aRect[4] } )
aBottomRight = ScreenToClient( oGet:oWnd:hWnd, aBottomRight )
SetBkMode( hDC , 1 )
Rectangle( hDC, aTopLeft[1]-8 + n, aTopLeft[2]-8+ n, aBottomRight[ 1 ]+8 -n, aBottomRight[ 2 ]+8-n )
DeleteObject( hPen1 )
next
oGet:oWnd:ReleaseDC()
Return nil
*************************************************************************
DLL32 STATIC FUNCTION BeginPath;
( hdc AS LONG ) ;
AS LONG PASCAL;
LIB "GDI32"
DLL32 STATIC FUNCTION EndPath;
( hdc AS LONG ) ;
AS LONG PASCAL;
LIB "GDI32"
DLL32 STATIC FUNCTION StrokePath;
( hdc AS LONG ) ;
AS LONG PASCAL;
LIB "GDI32"
*************************************************************************