bitmap transparente

bitmap transparente

Postby Francisco Horta » Fri Nov 28, 2008 7:08 pm

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
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Postby mantonio_08 » Fri Nov 28, 2008 7:33 pm

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..
mantonio_08
 
Posts: 330
Joined: Fri May 25, 2007 9:06 pm

Postby Francisco Horta » Fri Nov 28, 2008 8:09 pm

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
Francisco Horta
 
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

bmp

Postby noe aburto » Mon Dec 01, 2008 5:15 pm

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
User avatar
noe aburto
 
Posts: 418
Joined: Wed Nov 26, 2008 6:33 pm
Location: Morelia, Mich. Mexico.

Postby antolin » Sat Dec 20, 2008 11:41 am

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 ambos casos)

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...
antolin
 
Posts: 491
Joined: Thu May 10, 2007 8:30 pm
Location: Sevilla


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 8 guests