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
bitmap transparente
-
- Posts: 845
- Joined: Sun Oct 09, 2005 5:36 pm
- Location: la laguna, mexico.
-
- Posts: 330
- Joined: Fri May 25, 2007 9:06 pm
-
- Posts: 845
- Joined: Sun Oct 09, 2005 5:36 pm
- Location: la laguna, mexico.
- noe aburto
- Posts: 420
- Joined: Wed Nov 26, 2008 6:33 pm
- Location: Morelia, Mich. Mexico.
bmp
El primer pixel de tu bmp dara color a tu fondoFrancisco 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
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
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...