Nice
Thank you
Enhorabuena, tiene una pinta incre铆ble.

Cristobal,
Muy bien! ![]()
Gracias!
Entonces subo los bmps, el cambio en el c贸digo y el .rc modificado, Ok?
cnavarro wrote:Entonces subo los bmps, el cambio en el c贸digo y el .rc modificado, Ok?
dandole vueltas al asunto de los bmps en gris .... como mejora para fivewin ... creo que existe una funci贸n ( por alg煤n sitio la he visto ) dentro del c贸digo c de fivewin que vuelve un bmp a gris , con eso se podr铆a implementar un metodo en la clase Tbmp que invoc谩ndolo cree un bmp en gris , y de eso cambiar la clase buttonbar con una dataclass ldisableenGris ,si no se especifica un bmp para disabled lo que hace es crearlo en gris y asignarlo . Nos evitar铆a tener que generar nosotros los bmps grises y tener que colocarlos dentro de los recursos , y reducir铆a el tama帽o del fichero recursos .
IF Empty(cBmpFile3)
::hBitMap3 = Bmp2Dis( ::hBitMap1 )
ENDIF#include <windows.h>
#include <hbapi.h>
#define ROSA RGB(255,0,255)
#define BLANCO RGB(255,255,255)
HB_FUNC( BMP2DIS )
{
HBITMAP hBmpMem, hOldBmp, hOldBmp2;
COLORREF nColor;
int nX;
int nY;
HDC hDC = CreateDC("DISPLAY", 0, 0, 0);
HDC hDCMem = CreateCompatibleDC( hDC );
HDC hDCMem2 = CreateCompatibleDC( hDC );
HBITMAP hBitmap = (HBITMAP) hb_parnl( 1 );
BITMAP bm;
GetObject( ( HGDIOBJ ) hBitmap, sizeof( BITMAP ), ( LPSTR ) &bm );
hBmpMem = CreateCompatibleBitmap( hDC, bm.bmWidth, bm.bmHeight );
hOldBmp = (HBITMAP) SelectObject( hDCMem, hBmpMem );
hOldBmp2 = (HBITMAP) SelectObject( hDCMem2, hBitmap );
BitBlt( hDCMem, 0,0,bm.bmWidth, bm.bmHeight, hDCMem2, 0, 0, SRCCOPY );
for (nX = 0; nX < bm.bmWidth ; nX++ )
{
for (nY = 0; nY < bm.bmHeight ; nY++ )
{
nColor = GetPixel( hDCMem, nX, nY );
if( nColor != ROSA && nColor!=BLANCO )
{
SetPixel( hDCMem, nX, nY, RGB( 192, 192, 192) );
}
}
}
SelectObject( hDCMem, hOldBmp );
SelectObject( hDCMem2, hOldBmp2 );
DeleteDC( hDCMem );
DeleteDC( hDCMem2 );
DeleteDC( hDC );
hb_retnl( (LONG) hBmpMem );
}Gracias Biel
La idea es muy buena Manuel
Biel , lo he intentado pero o algo hago mal o no tengo el resultado esperado
.
Me sale como una mancha gris en vez el icono en escala de grises , mirando el c贸digo de la funcion lo que se hace es cambiar los pixeles a gris pero siempre el mismo gris no una escala de grises ( distintos grises dependiendo del color a variar ) .
Una manera de hacerlo seria sacar el color del pixel sacar su valor de color R ( por ejemplo ) y asignarle el valor al pixel rgb( valorR , 0, 0 ) , esto en teor铆a deber铆a sacar el canal r del pixel .
Cierto, est谩 funci贸n no convierte a escala de gris sino que pasa a gris todos los colores menos blanco y fucsia.
A mi gusta para el efecto disabled, pero si es un bmp con poco blaco y fucsia efectivamente queda una mancha. Creo que tengo otra que convierte a escala de grises, la busco.
#define FUCSIA RGB(255,0,255)
#define BLANCO RGB(255,255,255)
HB_FUNC( BMP2DIS )
{
HBITMAP hBmpMem, hOldBmp, hOldBmp2;
COLORREF nColor;
int nX;
int nY;
int red,green,blue;
HDC hDC = CreateDC("DISPLAY", 0, 0, 0);
HDC hDCMem = CreateCompatibleDC( hDC );
HDC hDCMem2 = CreateCompatibleDC( hDC );
HBITMAP hBitmap = (HBITMAP) hb_parnl( 1 );
BITMAP bm;
GetObject( ( HGDIOBJ ) hBitmap, sizeof( BITMAP ), ( LPSTR ) &bm );
hBmpMem = CreateCompatibleBitmap( hDC, bm.bmWidth, bm.bmHeight );
hOldBmp = (HBITMAP) SelectObject( hDCMem, hBmpMem );
hOldBmp2 = (HBITMAP) SelectObject( hDCMem2, hBitmap );
BitBlt( hDCMem, 0,0,bm.bmWidth, bm.bmHeight, hDCMem2, 0, 0, SRCCOPY );
for (nX = 0; nX < bm.bmWidth ; nX++ )
{
for (nY = 0; nY < bm.bmHeight ; nY++ )
{
nColor = GetPixel( hDCMem, nX, nY );
if( nColor != FUCSIA && nColor!=BLANCO )
{
red = GetRValue( nColor ) ;
green = GetGValue( nColor ) ;
blue = GetBValue( nColor ) ;
nColor = (0.3 * red + 0.59 * green + 0.11 * blue + 0.5 );
SetPixel( hDCMem, nX, nY, RGB( nColor , nColor , nColor ) );
}
}
}
SelectObject( hDCMem, hOldBmp );
SelectObject( hDCMem2, hOldBmp2 );
DeleteDC( hDCMem );
DeleteDC( hDCMem2 );
DeleteDC( hDC );
hb_retnl( (LONG) hBmpMem );
}Muchas gracias Biel , tambi茅n existia ( sabia que en alg煤n sitio estaba ) BMPTOGRAY( hbitmap ) que pertenece a el archivo c5new.c enlazado en fivewin ....
Tu funci贸n da un resultado mas oscuro , el otro quiz谩s en demasiado claro ... a gustos colores ... me quedo con tu funci贸n ...
CLASS TBtnBmp FROM TControl
....
DATA lDisableToGray INIT .t. // a帽adido
....
METHOD LoadBitmaps( )
.....
if ! Empty( cResName2 )
......
endif
if Empty( cResName3 ) .and. Empty( cBmpFile3 ) // a帽adido ...
IF ! Empty( cResName1 )
cResName3:= cResName1
endif
IF ! Empty( cBmpFile1 )
cBmpFile3:= cBmpFile1
endif
endif
if ! Empty( cResName3 )
IF FindResource( GetResources(), cResName3 , 10 ) != 0
....
ELSE
....
endif
IF ::lDisableToGray // a帽adido
::hBitmap3:= BMP2DIS( ::hBitmap1 )
endif
::HasAlpha( ::hBitmap3, BTN_DISABLE )
endif
.....
if ! Empty( cBmpFile3 )
if File( cBmpFile3 )
::cBmpFile3 = cBmpFile3
if Upper( Right( cBmpFile3, 3 ) ) == "PNG"
....
else
....
endif
IF ::lDisableToGray // a帽adido
::hBitmap3:= BMP2DIS( ::hBitmap1 )
endif
::HasAlpha( ::hBitmap3, BTN_DISABLE )
::cBmpFile3 = cBmpFile3
endif
endif
.....
#define FUCSIA RGB(255,0,255)
#define BLANCO RGB(255,255,255)
HB_FUNC( BMP2DIS )
{
HBITMAP hBmpMem, hOldBmp, hOldBmp2;
COLORREF nColor;
int nX;
int nY;
int red,green,blue;
HDC hDC = CreateDC("DISPLAY", 0, 0, 0);
HDC hDCMem = CreateCompatibleDC( hDC );
HDC hDCMem2 = CreateCompatibleDC( hDC );
HBITMAP hBitmap = (HBITMAP) hb_parnl( 1 );
BITMAP bm;
GetObject( ( HGDIOBJ ) hBitmap, sizeof( BITMAP ), ( LPSTR ) &bm );
hBmpMem = CreateCompatibleBitmap( hDC, bm.bmWidth, bm.bmHeight );
hOldBmp = (HBITMAP) SelectObject( hDCMem, hBmpMem );
hOldBmp2 = (HBITMAP) SelectObject( hDCMem2, hBitmap );
BitBlt( hDCMem, 0,0,bm.bmWidth, bm.bmHeight, hDCMem2, 0, 0, SRCCOPY );
for (nX = 0; nX < bm.bmWidth ; nX++ )
{
for (nY = 0; nY < bm.bmHeight ; nY++ )
{
nColor = GetPixel( hDCMem, nX, nY );
if( nColor != FUCSIA && nColor!=BLANCO )
{
red = GetRValue( nColor ) ;
green = GetGValue( nColor ) ;
blue = GetBValue( nColor ) ;
nColor = (0.3 * red + 0.59 * green + 0.11 * blue + 0.5 );
SetPixel( hDCMem, nX, nY, RGB( nColor , nColor , nColor ) );
}
}
}
SelectObject( hDCMem, hOldBmp );
SelectObject( hDCMem2, hOldBmp2 );
DeleteDC( hDCMem );
DeleteDC( hDCMem2 );
DeleteDC( hDC );
hb_retnl( (LONG) hBmpMem );
}