Page 1 of 1

16 bits tranparentes

PostPosted: Thu Feb 02, 2006 5:36 pm
by manuramos
Qué embidia de diálogos tranparentes con los 32 bits. Menos mal que con 16 bits tambien se puede: Ahí va una clase que ayyuda

#Include "FiveWin.ch"
*#Include "MisFunc.ch"

#define GWL_STYLE -16

CLASS TDIAG OF TDIALOG

CLASSDATA lRegistered AS LOGICAL

DATA lSomb AS LOGICAL INIT .F.
DATA hFond,hPen,nDif

METHOD Activate( bClicked, bMoved, bPainted, lCentered, bValid, lModal, bInit, bRClicked, bWhen, nClrShadow )
METHOD Initiate( hWndFocus, hWnd )
METHOD Paint()
METHOD StartPaint()
METHOD PintSombra()
METHOD Destroy()

ENDCLASS


METHOD Activate( bClicked, bMoved, bPainted, lCentered, bValid, lModal, bInit, bRClicked, bWhen, nClrShadow ) CLASS TDIAG
IF nClrShadow # NIL
::lSomb := .T.
::hPen := CreatePen( 0,1,nClrShadow )
ENDIF
DEFINE BRUSH ::oBrush NULL
RETURN Super:Activate( bClicked, bMoved, bPainted, lCentered, bValid, lModal, bInit, bRClicked, bWhen )

METHOD Initiate( hWndFocus, hWnd ) CLASS TDIAG
LOCAL lFocus := Super:Initiate( hWndFocus, hWnd )
*
::nDif := IF(lAnd(GetWindowLong(::hWnd,GWL_STYLE),WS_BORDER),1,0)
::bStart := { || ::StartPaint() }
RETURN lFocus

METHOD Paint() CLASS TDIAG
DrawBitmap( ::hDc, ::hFond, -::nDif, -::nDif )
IF ::bPainted # NIL
EVAL(::bPainted,::hDc)
ENDIF
RETURN NIL
*
METHOD StartPaint() CLASS TDIAG
::GetDc()
::PintSombra(::hDc)
::ReleaseDc()
IF ::bPainted # NIL
ENDIF
::hFond := WndBitmap(::hWnd)
RETURN NIL
*
METHOD PintSombra(hDc) CLASS TDIAG
LOCAL hOldP := SelectObject( hDc,::hPen )
LOCAL nCont1,nCont2 := 0
LOCAL nDesde := 2
LOCAL nHasta := ::nWidth+::nHeight-2
*
FOR nCont1 = nDesde TO nHasta STEP 2
nCont2 := nCont1 - ::nHeight
MoveTo(hDc,nCont1,0)
LineTo(hDc,nCont2,::nHeight)
MoveTo(hDc,nCont2,0)
LineTo(hDc,nCont1,::nHeight)
NEXT
SelectObject( hDc,hOldP )
RETURN NIL

METHOD Destroy() CLASS TDIAG
DeleteObject(::hFond)
DeleteObject(::hPen)
RETURN NIL

Por favor, si alguien la perfecciona, le agradecería que me mandara el nuevo código a mi e-mail (ramosframit@ono.com)

Y EL FONDO NO SE BORRA CUANDO SE REFRESCA. El único inconveniente es que sólo se puede emplear con diálogos estáticos.

[img][img]http://img72.imageshack.us/img72/5411/ejemplo10dn.jpg[/img][/img]

En este ejemplo, lo uso para la soombra del diaologo de confirmacion

[img][img]http://img72.imageshack.us/img72/2374/ejemplo20lx.jpg[/img][/img]

En este otro, para la sombra del diálogo naranja, y para el menu que hay por detrástranlucido.

PostPosted: Fri Feb 03, 2006 5:05 pm
by Antonio Linares
Manu,

Está muy bien!

PostPosted: Sat Feb 04, 2006 10:43 am
by Manuel Valdenebro
Muy buenos Manuel, pero lo que mas me han impresionado son los folders que utilizas.- ¿Como lo haces?

Gracias y un saludo desde Málaga

PostPosted: Sat Feb 04, 2006 1:39 pm
by manuramos
Muchas gracias Manuel, pero no son folders, son BITMAPS, pero da el pego. Los dialogo son NOWAIT sobre un WINDOW normal. Va muy bien; parecido al entorno MDI, pero, en ciertos aspectos, más controlable, si nunca se va a mostrar.
Hay dos BITMAPS para cada solapa, la activa y las otras, inactivas.

PostPosted: Sat Feb 04, 2006 1:43 pm
by manuramos
Bueno, en realidad, son tres BITMAPS por cada solapa, se me olvidaba nombrar los que se 'ReLoadea'n cuando paso el Mouse por encima (un poco más altos, para dar la impresión de que las solapas se elevan al pasar el ratón por encima).

PostPosted: Sat Feb 04, 2006 11:25 pm
by manuramos
Repasando mi clase TDIAG me he dado cuenta de un pequeño error, ::PintSombra sólo debe ejecutarse (en bStartPaint) si ::lSomb es .T.
Perdon!!
Lo que pasa es que yo siempre la utilizo con color de sombra.

PostPosted: Tue Mar 07, 2006 11:34 pm
by meskamas
excelente trabajo, Felicidades