by 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...
FWH 2007 - xHarbour - BCC55