bitmap transparente

Post Reply
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

bitmap transparente

Post by Francisco Horta »

Hola foro,
antes de publicar intente muchas maneras de hacerlo y consulte en el foro y nada, explico:
Tengo un dialgo con un bitmap, pero no se hace transparente, al dialogo le aplico un degradado, este es mi codigo:
Define DIALOG oDlg RESOURCE "Frm1" TRANSPARENT
REDEFINE BITMAP oBmp ID 100 OF oDlg RESOURCE "USER"
oDlg:bPainted := {|hDC| Degrada( oDlg:hDC, { 0, 0, oDlg:nHeight, oDlg:nWidth }, nRGB(254,250,233), nRGB(253,242,198), lVertical ) }
ACTIVATE DIALOG oDlg CENTERED ;
ON INIT ( oDlg:lHelpIcon:=.F., oDlg:SetFocus() )

Como se observa el degradado lo hago en el paint del dialogo, ya probe a usar:
SETBKMODE()
oBmp:lTransparent:=.T.
REDEFINE BITMAP oBmp ID 100 OF oDlg RESOURCE "USER" TRANSPARENT
oBmp:bPainted:={|hDc| SetBkMode(oBmp:hDc,0} y con el 1 tambien
y nada, si el degradado lo pongo en el ON INIT este no se pinta en el dialogo, la funcion Degrada la saque del foro de una publicacion de Paco Garcia, los otros 2 controles de texto si los pone transaparentes
alguna sugerencia, ya no c por donde buscarle
gracias
paco
mantonio_08
Posts: 330
Joined: Fri May 25, 2007 9:06 pm

Post by mantonio_08 »

AMIGO USA.. UN BRUSH PARA EL DIALOG.. y ese brush que sea un Bmp,, degradado como quieras usarlo...

yo tambien tube los mismo problemas con el degradado y opte por usar solo un brush q haga el mismo efecto..
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Post by Francisco Horta »

Antonio,
no me digas, o sea que no hay solucion para eso?, de hecho con un SAY normal tampoco lo pude hacer, tuve que usar ssay, bueno pues viendo que no hay de otra, esperare a ver si sale algo mas, sino a probar con un brush
salu2
paco
User avatar
noe aburto
Posts: 420
Joined: Wed Nov 26, 2008 6:33 pm
Location: Morelia, Mich. Mexico.

bmp

Post by noe aburto »

Francisco Horta wrote:Antonio,
no me digas, o sea que no hay solucion para eso?, de hecho con un SAY normal tampoco lo pude hacer, tuve que usar ssay, bueno pues viendo que no hay de otra, esperare a ver si sale algo mas, sino a probar con un brush
salu2
paco
El primer pixel de tu bmp dara color a tu fondo
antolin
Posts: 475
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla

Post by antolin »

Estimado Francisco,

Ese problema me surgió a mi también y al final conseguí solucionarlo, el problema es que yo no utilizo la clase TBITMAP, tengo mi propia clase, pero debería funcionar también, y en cualquier caso darte una idea de por donde encaminar tu trabajo.

Te explico:

Todos los controles son como pequeños "DIALOGS" con su propio fondo (::hWnd) y demás propiedades exclusivas. Esos controles, incluido los bitmaps, se pintan primero en su propio "fondo" antes de pintarse en pantalla. Lo malo es que, por defecto, se pintan con el mismo BRUSH que el DIALOG o WINDOW al que pertenecen. Por eso, si te fijas, las partes supuestamente transparentes de tu bitmap tienen el mismo color (BRUSH) que el DIALOG/WINDOW sobre el que se pintan, por eso con un BRUSH funciona, pero con un bitmap (NO BRUSH) no funciona.

El truco está en pintar el "fondo" propio del bitmap con lo que tiene debajo (fondo del DIALOG/WIONDOW al que pertenece) antes de que se pinte el bitmap en si. Eso hay que hacerlo en el METHOD PAINT() de la clase TBITMAP poniendolo delante de:

nZeroZeroClr = GetPixel( ::hDC, 0, 0 )
SelectObject( ::hDC, hBmpOld )
nOldClr = SetBkColor( ::hDC, nRGB( 255, 255, 255 ) )
TransBmp( ::hBitmap, ::nWidth(), ::nHeight(), nZeroZeroClr, ::hDC, ::nX, ::nY, Super:nWidth(), Super:nHeight() )
...

(si te fijas, ese codigo aparece dos veces en el PRG, hay que hacerlo en _)

Yo utilizo un pequeño programam en C de mi cosecha que a lo mejor te sirve (busca PRAGMA en el foro), y que te transcribo a continuación:

HB_FUNC( PARENTIMG ) // ParentImg( HWND hWnd, HDC hDC )
{
HWND hWnd = ( HWND ) _parnl( 1 ) ;
HDC hDC = ( HDC ) _parnl( 2 ) ;

HWND hWndParent = GetParent( hWnd ) ;
HDC hDcParent = GetDCEx( hWndParent, NULL, DCX_PARENTCLIP ) ;
RECT rct ;
POINT pt ;

GetWindowRect( hWnd, &rct ) ;
pt.y = rct.top ;
pt.x = rct.left ;

ScreenToClient( hWndParent, &pt ) ;

BitBlt( hDC, 0, 0, rct.right - rct.left, rct.bottom - rct.top, hDcParent, pt.x, pt.y, SRCCOPY ) ;

ReleaseDC( hWndParent, hDcParent ) ;
}

(Si mal no recuerdo, DCX_PARENTCLIP está en WINTEN.H)

quedaria así:

ParentImg( ::hWnd, ::hDC )
nZeroZeroClr = GetPixel( ::hDC, 0, 0 )
SelectObject( ::hDC, hBmpOld )
nOldClr = SetBkColor( ::hDC, nRGB( 255, 255, 255 ) )
TransBmp( ::hBitmap, ::nWidth(), ::nHeight(), nZeroZeroClr, ::hDC, ::nX, ::nY, Super:nWidth(), Super:nHeight() )
...

Claro que como apuntaba al principio yo no uso la clase TBITMAP, ni doblefbuffer, ni TransBmp, por lo tanto, no te aseguro nada, pero al menos sabrás por donde van los tiros.

Espero que te sirva. Un slaudo
Peaaaaaso de foro...
Post Reply