AddFile x AddResource comportamento diferente

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

AddFile x AddResource comportamento diferente

Mensagem 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)
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

AddFile x AddResource comportamento diferente

Mensagem por JoséQuintas »

Dá uma olhada no fonte, se ele usa a API passando os parâmetros de tamanho.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

AddFile x AddResource comportamento diferente

Mensagem 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 );
}
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

AddFile x AddResource comportamento diferente

Mensagem por JoséQuintas »

E no addfile?
Lembrando que LoadImage() é só pra tipos padrão.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

AddFile x AddResource comportamento diferente

Mensagem por JoséQuintas »

José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

AddFile x AddResource comportamento diferente

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

AddFile x AddResource comportamento diferente

Mensagem 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 5793 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 5793 vezes
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

AddFile x AddResource comportamento diferente

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

AddFile x AddResource comportamento diferente

Mensagem 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?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

AddFile x AddResource comportamento diferente

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

AddFile x AddResource comportamento diferente

Mensagem 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 5750 vezes
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

AddFile x AddResource comportamento diferente

Mensagem 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

►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

AddFile x AddResource comportamento diferente

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

AddFile x AddResource comportamento diferente

Mensagem por asimoes »

2019-12-09 19_57_34-Window.png
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

AddFile x AddResource comportamento diferente

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Responder