Primero disculparme por la tardanza.
Lo que necesitas lo he medio solucionado de la siguiente manera:
Para extraer un icono de una DLL he implementado la función:
HB_FUNC( LOADDLLICON ) // LoadDllIcon( LPSTR IconResource, INT nSize )
{
HICON hIcon = LoadImage( GetResources(), IF(ISCHAR(1),hb_parc(1),MAKEINTRESOURCE(hb_parni(1))), IMAGE_ICON, hb_parni(2), hb_parni(2), LR_DEFAULTCOLOR ) ;
hb_retnl( ( LONG ) hIcon ) ;
}
Y hago:
SET RESOURCES TO cDLLFile
hIcon := LoadDllIcon( nIcon/cIcon, nSize )
SET RESOURCES TO
- cDLLFile es el fichero DLL que contiene el icono (preferiblemente con el path completo).
- nIcon o cIcon son el nombre del icono en la DLL, puede ser un número o un String.
- nSize es el tamaño que queremos. Si existe un icono con ese tamaño ese será el que devuelva la función, sino el más cercano en tamaño.
Para extraer el icono de un EXE implementé:
HB_FUNC( EXTRACTICOEX ) // ExtractIcoEx( LPSTR IconFile, BOOL lSmall, INT nIndex )
{
HICON aIcon[1] ;
if ( hb_parl( 2 ) ) ExtractIconEx( hb_parc(1), hb_parni(3), 0, (HICON *) aIcon, 1) ;
else ExtractIconEx( hb_parc(1), hb_parni(3), (HICON *) aIcon, 0, 1) ;
hb_retnl( ( LONG ) aIcon[0] ) ;
}
Y hago:
nSize := xx
hIcon := ExtractIcoEx( cFile, nSize = 16, nIndex )
- cFile es el fichero del que queremos extraer el icono (preferiblemente con el path completo).
- nSize es el tamaño de icono que queremos.
- nIndex es el puesto que ocupa el icono en el fichero. Un 0 extrae el 1º icono, un 1 el 2º, etc. Por defecto coge 0.
Esta función no extrae el icono del tamaño específico, pero al menos, con nSize := 16, extrae el icono de 16X16; un nSize mayor, extrae al menos el de 32X32 que queda mejor ampliado a 48X48 que el de 16X16, es posible que exista otra función más adecuada, pero mi Borland C++ no la trae, o no la he encontrado.
Para pintar el icono al tamaño deseado, utilizo:
HB_FUNC( DRAWICONEX ) // DrawIconEx( hDc, nY, nX, hIcon, nSize )
{
DrawIconEx( (HDC) hb_parnl( 1 ), hb_parni( 3 ), hb_parni( 2 ), (HICON) _parnl( 4 ), hb_parni( 5 ), hb_parni( 5 ),0,0, DI_NORMAL ) ;
}
- nY y nX Son la coordenadas donde quiero dibujarlo.
- hIcon es el handle del icono obtenido con alguna de las funciones anteriores.
- nSize es el tamaño al que quiero dibujarlo.
Con estos métodos, el icono de 16X16 siempre se puede conseguir (si existe); uno de mayor tamaño, no siempre, pero al menos siempre puedo pintarlo del tamaño deseado.
Espero te sea de utilidad.
Saludos.
Peaaaaaso de foro...
FWH 2007 - xHarbour - BCC55