Página 1 de 2
AddFile x AddResource comportamento diferente
Enviado: 05 Dez 2019 09:21
por asimoes
Pessoal,
Tenho um icone que tem o tamanho 32 x 32 px, quero usar esse icone em uma tela com a dimensão 16 x 16 px
Usando
HIcon():AddFile("AVI\ICON011.ICO", 16, 16) não funciona, fica com o tamanho original
Agora se colocar esse icone no RESOURCE.RC e usar, funciona a resolução:
HIcon():AddResource("ICON_MSG", 16, 16)
AddFile x AddResource comportamento diferente
Enviado: 05 Dez 2019 10:29
por JoséQuintas
Dá uma olhada no fonte, se ele usa a API passando os parâmetros de tamanho.
AddFile x AddResource comportamento diferente
Enviado: 05 Dez 2019 11:18
por asimoes
JoséQuintas escreveu:Dá uma olhada no fonte, se ele usa a API passando os parâmetros de tamanho.
Sim passa.
Esses são os métodos da classe HIcon, os dois métodos usam hwg_LoadImage( 0, Name, IMAGE_ICON, nWidth, nHeight, nFlags ), a diferença é que AddResource o nFlags é 0 (zero)
Código: Selecionar todos
METHOD AddResource( name, nWidth, nHeight, nFlags, lOEM ) CLASS HIcon
LOCAL lPreDefined := .F. , oElemento, aIconSize
IF nWidth == Nil
nWidth := 0
ENDIF
IF nHeight == Nil
nHeight := 0
ENDIF
IF nFlags == Nil
nFlags := 0
ENDIF
IF lOEM == Nil
lOEM := .F.
ENDIF
IF ValType( Name ) == "N"
Name := LTrim( Str( Name ) )
lPreDefined := .T.
ENDIF
FOR EACH oElemento IN ::aIcons
IF oElemento:name == Name
oElemento:nCounter ++
RETURN oElemento
ENDIF
NEXT
// ::classname:= "HICON"
IF lOEM // LR_SHARED is required for OEM images
::handle := hwg_LoadImage( 0, Val( Name ), IMAGE_ICON, nWidth, nHeight, Hwg_bitor( nFlags, LR_SHARED ) )
ELSE
::handle := hwg_LoadImage( Nil, iif( lPreDefined, Val( Name ), Name ), IMAGE_ICON, nWidth, nHeight, nFlags )
ENDIF
::Name := Name
aIconSize := hwg_GetIconSize( ::handle )
::nWidth := aIconSize[ 1 ]
::nHeight := aIconSize[ 2 ]
aAdd( ::aIcons, Self )
RETURN Self
METHOD AddFile( Name, nWidth, nHeight, nFlags ) CLASS HIcon
LOCAL oElemento, aIconSize, cName := CutPath( Name ), cCurDir, nHandleFile, aTamIcon, nIconW, nIconH
LOCAL nWidthIcon, nHeightIcon, lPreDefined := .F.
IF nFlags = Nil
nFlags := LR_LOADFROMFILE + LR_SHARED + LR_LOADTRANSPARENT + LR_LOADMAP3DCOLORS
ENDIF
FOR EACH oElemento IN ::aIcons
IF oElemento:Name == cName
oElemento:nCounter ++
RETURN oElemento
ENDIF
NEXT
// ::classname:= "HICON"
Name := iif( ! File( Name ) .AND. File( cName ), cName, Name )
IF ::lSelFile .AND. ! File( Name )
cCurDir := DiskName() + [:\] + CurDir()
Name := hwg_SelectFile( "Image Files( *.jpg;*.gif;*.bmp;*.ico )", CutPath( Name ), FilePath( Name ), "Locate " + Name ) //"*.jpg;*.gif;*.bmp;*.ico"
DirChange( cCurDir )
ENDIF
::handle := hwg_LoadImage( 0, Name, IMAGE_ICON, nWidth, nHeight, nFlags )
::Name := cName
aIconSize := hwg_GetIconSize( ::handle )
::nWidth := aIconSize[ 1 ]
::nHeight := aIconSize[ 2 ]
aAdd( ::aIcons, Self )
RETURN Self
Código: Selecionar todos
HB_FUNC( HWG_LOADIMAGE )
{
void *hString = NULL;
HB_RETHANDLE( LoadImage( HB_ISNIL( 1 ) ? GetModuleHandle( NULL ) : ( HINSTANCE ) hb_parnl( 1 ), // handle of the instance that contains the image
HB_ISNUM( 2 ) ? MAKEINTRESOURCE( hb_parni( 2 ) ) : HB_PARSTR( 2, &hString, NULL ), // name or identifier of image
( UINT ) hb_parni( 3 ), // type of image
hb_parni( 4 ), // desired width
hb_parni( 5 ), // desired height
( UINT ) hb_parni( 6 ) // load flags
) );
hb_strfree( hString );
}
AddFile x AddResource comportamento diferente
Enviado: 05 Dez 2019 12:02
por JoséQuintas
E no addfile?
Lembrando que LoadImage() é só pra tipos padrão.
AddFile x AddResource comportamento diferente
Enviado: 05 Dez 2019 12:09
por JoséQuintas
AddFile x AddResource comportamento diferente
Enviado: 05 Dez 2019 13:34
por asimoes
JoséQuintas escreveu:Acho que tem a ver com flags.
Já tinha olhado isso nessa página
O que diferencia um método do outro é isso
método AddResource
nFlags := 0
método AddFile
nFlags := LR_LOADFROMFILE + LR_SHARED + LR_LOADTRANSPARENT + LR_LOADMAP3DCOLORS
Se colocar nFlags := 0 em AddFile os icones não aparecem, isso só funciona com AddResource, agora com AddResource funciona se definir o tamanho que eu quiser, o problema é que acarreta é inchar o .exe
AddFile x AddResource comportamento diferente
Enviado: 05 Dez 2019 13:37
por asimoes
Exemplicando o uso:
oIcon := HIcon():AddResource("ICON_MSG", 16, 16) //funciona

- 2019-12-05 13_40_12-Mensagem Guias AsaPrev.png (2.61 KiB) Exibido 5794 vezes
oIcon := HIcon():AddFile("AVI\ICON011.ICO", 16, 16) //não funciona, mantém o tamanho original

- 2019-12-05 13_38_44-Mensagem Guias AsaPrev.png (2.1 KiB) Exibido 5794 vezes
AddFile x AddResource comportamento diferente
Enviado: 06 Dez 2019 10:22
por Itamar M. Lins Jr.
Ola!
Estou tentando entender mais, esses processos.
Tem .PNG, .SVG(agora), .ICO ...
Mas eu tenho que converter para .BMP senão não mostra no PANEL(via resource), no arquivo .RC importa .PNG mas não mostra, via:
BITMAP oPagar64 FROM RESOURCE
Qual é o mais indicado para trabalhar no caso ?
Pq agora os novos ICONES vem todos com extensão .SVG
Saudações,
Itamar M. Lins Jr.
AddFile x AddResource comportamento diferente
Enviado: 06 Dez 2019 11:19
por asimoes
Itamar M. Lins Jr. escreveu:Qual é o mais indicado para trabalhar no caso ?
A questão é carregar o .ICO, .BMP quando precisar ou colocar isso no .RC, qual o custo disso? inflar o .exe mas não tem o problema de não existir o icone ou colocar esses icones em uma pasta para o .exe mostrar.
Quanto aos novos formatos a minigui e hwgui mais recente conseguem usar png, svg etc em botões, janela, panel etc?
AddFile x AddResource comportamento diferente
Enviado: 06 Dez 2019 11:37
por Itamar M. Lins Jr.
Ola!
Com .JPG funciona.
Alias preciso refazer os testes...
Agora vem .svg com 256 de resolução, dai usamos do tamanho que precisar( menor) até o limite... Assim entendo.
Mas na Hwgui tenho que testar isso. Não sei.
Qualquer tema do KDE vem em .SGV, nem o win10 reconhece, só o chrome!
Saudações,
Itamar M. Lins Jr.
AddFile x AddResource comportamento diferente
Enviado: 06 Dez 2019 14:26
por asimoes
Offtopic:
Consegui criar uma função em C HWG_GRAYLOADICON com escala cinza, útil para botões ficarem cinza, quando estão disable.

- 2019-12-06 14_23_12-Form1.png (6.33 KiB) Exibido 5751 vezes
AddFile x AddResource comportamento diferente
Enviado: 06 Dez 2019 15:28
por asimoes
O código da função é esse, se o Alexander Kressin quiser tá ai.
Código: Selecionar todos
HB_FUNC( HWG_GRAYLOADICON )
{
void *hString = NULL;
COLORREF palette[256];
for(int i = 0; i < 256; i++)
{
palette[i] = RGB(255-i, 255-i, 255-i);
}
HICON myIcon = (HICON)LoadImage( HB_ISNIL( 1 ) ? GetModuleHandle( NULL ) : ( HINSTANCE ) hb_parnl( 1 ), // handle of the instance that contains the image
HB_ISNUM( 2 ) ? MAKEINTRESOURCE( hb_parni( 2 ) ) : HB_PARSTR( 2, &hString, NULL ), // name or identifier of image
( UINT ) hb_parni( 3 ), // type of image
hb_parni( 4 ), // desired width
hb_parni( 5 ), // desired height
( UINT ) hb_parni( 6 ) // load flags
);
HICON grayIcon = CreateGrayscaleIcon(myIcon,palette);
HB_RETHANDLE( grayIcon ) ;
hb_strfree( hString );
}
Código: Selecionar todos
#ifndef _CREATEGRAYSCALEICON_H
#define _CREATEGRAYSCALEICON_H
COLORREF defaultGrayPalette[256];
BOOL bGrayPaletteSet = FALSE;
HICON CreateGrayscaleIcon( HICON hIcon, COLORREF* pPalette )
{
if (hIcon == NULL)
{
return NULL;
}
HDC hdc = GetDC(NULL);
HICON hGrayIcon = NULL;
ICONINFO icInfo = { 0 };
ICONINFO icGrayInfo = { 0 };
LPDWORD lpBits = NULL;
LPBYTE lpBitsPtr = NULL;
SIZE sz;
DWORD c1 = 0;
BITMAPINFO bmpInfo = { 0 };
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
if (GetIconInfo(hIcon, &icInfo))
{
if (GetDIBits(hdc, icInfo.hbmColor, 0, 0, NULL, &bmpInfo, DIB_RGB_COLORS) != 0)
{
bmpInfo.bmiHeader.biCompression = BI_RGB;
sz.cx = bmpInfo.bmiHeader.biWidth;
sz.cy = bmpInfo.bmiHeader.biHeight;
c1 = sz.cx * sz.cy;
lpBits = (LPDWORD)GlobalAlloc(GMEM_FIXED, (c1) * 4);
if (lpBits && GetDIBits(hdc, icInfo.hbmColor, 0, sz.cy, lpBits, &bmpInfo, DIB_RGB_COLORS) != 0)
{
lpBitsPtr = (LPBYTE)lpBits;
UINT off = 0;
for (UINT i = 0; i < c1; i++)
{
off = (UINT)( 255 - (( lpBitsPtr[0] + lpBitsPtr[1] + lpBitsPtr[2] ) / 3) );
if (lpBitsPtr[3] != 0 || off != 255)
{
if (off == 0)
{
off = 1;
}
lpBits[i] = pPalette[off] | ( lpBitsPtr[3] << 24 );
}
lpBitsPtr += 4;
}
icGrayInfo.hbmColor = CreateCompatibleBitmap(hdc, sz.cx, sz.cy);
if (icGrayInfo.hbmColor != NULL)
{
SetDIBits(hdc, icGrayInfo.hbmColor, 0, sz.cy, lpBits, &bmpInfo, DIB_RGB_COLORS);
icGrayInfo.hbmMask = icInfo.hbmMask;
icGrayInfo.fIcon = TRUE;
hGrayIcon = CreateIconIndirect(&icGrayInfo);
DeleteObject(icGrayInfo.hbmColor);
}
GlobalFree(lpBits);
lpBits = NULL;
}
}
DeleteObject(icInfo.hbmColor);
DeleteObject(icInfo.hbmMask);
}
ReleaseDC(NULL,hdc);
return hGrayIcon;
}
HICON CreateGrayscaleIcon1( HICON hIcon )
{
if (hIcon == NULL)
{
return NULL;
}
if (!bGrayPaletteSet)
{
for(int i = 0; i < 256; i++)
{
defaultGrayPalette[i] = RGB(255-i, 255-i, 255-i);
}
bGrayPaletteSet = TRUE;
}
return CreateGrayscaleIcon(hIcon, defaultGrayPalette);
}
#endif
AddFile x AddResource comportamento diferente
Enviado: 09 Dez 2019 19:43
por asimoes
Resolvido.
Era isso que estava impedindo usar tamanhos diferentes no método AddFile da classe HIcon
Código original:
Código: Selecionar todos
FOR EACH oElemento IN ::aIcons
IF oElemento:Name == cName
oElemento:nCounter ++
RETURN oElemento
ENDIF
NEXT
Código modificado:
Código: Selecionar todos
FOR EACH oElemento IN ::aIcons
IF oElemento:Name == cName .AND. ( oElemento:nWidth = nWidth .OR. oElemento:nHeight = nHeight )
oElemento:nCounter ++
RETURN oElemento
ENDIF
NEXT
AddFile x AddResource comportamento diferente
Enviado: 09 Dez 2019 19:59
por asimoes
AddFile x AddResource comportamento diferente
Enviado: 11 Dez 2019 16:14
por Itamar M. Lins Jr.
Ola!
Qual é o arquivo ?
Era isso que estava impedindo usar tamanhos diferentes no método AddFile da classe HIcon
Não achei no SVN essas linhas, nem arquivo.
Saudações,
Itamar M. Lins Jr.