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
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
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
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
2019-12-09 19_57_34-Window.png

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.