Clipper On Line • Ver Tópico - AddFile x AddResource comportamento diferente

AddFile x AddResource comportamento diferente

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

AddFile x AddResource comportamento diferente

Mensagempor asimoes » 05 Dez 2019 09:21

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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

AddFile x AddResource comportamento diferente

Mensagempor JoséQuintas » 05 Dez 2019 10:29

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18128
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

AddFile x AddResource comportamento diferente

Mensagempor asimoes » 05 Dez 2019 11:18

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)

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

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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

AddFile x AddResource comportamento diferente

Mensagempor JoséQuintas » 05 Dez 2019 12:02

E no addfile?
Lembrando que LoadImage() é só pra tipos padrão.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18128
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

AddFile x AddResource comportamento diferente

Mensagempor JoséQuintas » 05 Dez 2019 12:09

José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18128
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

AddFile x AddResource comportamento diferente

Mensagempor asimoes » 05 Dez 2019 13:34

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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

AddFile x AddResource comportamento diferente

Mensagempor asimoes » 05 Dez 2019 13:37

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) Visualizado 4807 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) Visualizado 4807 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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

AddFile x AddResource comportamento diferente

Mensagempor Itamar M. Lins Jr. » 06 Dez 2019 10:22

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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6944
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 311 vezes
Mens.Curtidas: 505 vezes

AddFile x AddResource comportamento diferente

Mensagempor asimoes » 06 Dez 2019 11:19

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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

AddFile x AddResource comportamento diferente

Mensagempor Itamar M. Lins Jr. » 06 Dez 2019 11:37

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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6944
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 311 vezes
Mens.Curtidas: 505 vezes

AddFile x AddResource comportamento diferente

Mensagempor asimoes » 06 Dez 2019 14:26

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) Visualizado 4764 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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

AddFile x AddResource comportamento diferente

Mensagempor asimoes » 06 Dez 2019 15:28

O código da função é esse, se o Alexander Kressin quiser tá ai.

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 );
 
}   



#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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

AddFile x AddResource comportamento diferente

Mensagempor asimoes » 09 Dez 2019 19:43

Resolvido.

Era isso que estava impedindo usar tamanhos diferentes no método AddFile da classe HIcon

Código original:
   FOR EACH oElemento IN ::aIcons
      IF oElemento:Name == cName
         oElemento:nCounter ++
         RETURN oElemento
      ENDIF
   NEXT

Código modificado:
  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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

AddFile x AddResource comportamento diferente

Mensagempor asimoes » 09 Dez 2019 19:59

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 de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

AddFile x AddResource comportamento diferente

Mensagempor Itamar M. Lins Jr. » 11 Dez 2019 16:14

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.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6944
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 311 vezes
Mens.Curtidas: 505 vezes

Próximo



Retornar para HwGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro