Página 2 de 3

Cor de fundo do ICON

Enviado: 08 Dez 2020 17:41
por asimoes
JoséQuintas escreveu:Tem @ x, y ICON .... mas pra ficar transparente usa @ x, y BITMAP

Resta a dúvida.... o ICO é ICO mesmo, ou é BMP salvo como ICO?
É icone mesmo, mas vou verificar e informo aqui., porque andei modificando essa classe pra carregar outros tipos de imagens

Cor de fundo do ICON

Enviado: 08 Dez 2020 20:41
por asimoes

Código: Selecionar todos

@ 010,500 BITMAP oIcon ;
                SHOW          HBitMap():AddFile("AVI\exit-512 Black.ico", .T., 60, 60) ; 
                OF            oPanelx1 ;
                STRETCH       0 ;
                BACKTRANSPARENT ;
                SIZE          60, 60 
2020-12-08 20_22_39-Greenshot.png
Na lib Hwgui + Bostaurus

Código: Selecionar todos

METHOD AddFile( Name, hDC, lTranparent, nWidth, nHeight ) CLASS HBitmap
LOCAL oElemento, aBmpSize, cName := CutPath( Name ), cCurDir
   
   FOR EACH oElemento IN ::aBitmaps
      IF oElemento:Name == cName .AND. oElemento:bGray = "0" .AND. ( oElemento:nWidth = nWidth .OR. oElemento:nHeight = nHeight )
         oElemento:nCounter ++
         RETURN oElemento
      ENDIF
   NEXT

   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

   IF Lower( Right( Name, 4 ) ) != ".bmp" .OR. ( nWidth == Nil .AND. nHeight == Nil .AND. lTranparent == Nil )
      IF Lower( Right( Name, 4 ) ) == ".bmp"
         ::handle := hwg_OpenBitMap( Name, hDC )
      ELSE
         * A chamada do ICO, JPG, GIF, PNG, TIF OU BMP poderia até remover o if acima para carregar o BMP
         ::handle := BT_BitmapLoadFile( Name )
         IF nWidth != Nil .AND. nHeight != Nil
            ::handle := BT_BitmapCopyAndResize( ::handle, nWidth, nHeight ) 
         ENDIF   
      ENDIF
   ELSE
      IF lTranparent != Nil .AND. lTranparent
         ::handle := hwg_LoadImage( Nil, Name, IMAGE_BITMAP, nWidth, nHeight, LR_LOADFROMFILE + LR_LOADTRANSPARENT + LR_LOADMAP3DCOLORS )
      ELSE
         ::handle := hwg_LoadImage( Nil, Name, IMAGE_BITMAP, nWidth, nHeight, LR_LOADFROMFILE )
      ENDIF
   ENDIF
  
   IF Empty( ::handle )
      RETURN Nil
   ENDIF
   
   ::bGray := "0"
   
   ::name := cName
   
   aBmpSize  := hwg_GetBitmapSize( ::handle )
   
   ::nWidth  := aBmpSize[ 1 ]
   
   ::nHeight := aBmpSize[ 2 ]
   
   aAdd( ::aBitmaps, Self )

RETURN Self

Na lib

FUNCTION BT_BitmapLoadFile ( cFileName )

   LOCAL hBitmap := BT_BMP_LOADFILE ( cFileName )

RETURN hBitmap

Função C

//*************************************************************************************************
//* BT_BMP_LOADFILE (cFileBMP) ---> Return hBITMAP
//*************************************************************************************************

HB_FUNC( BT_BMP_LOADFILE )
{
   HBITMAP hBitmap;
   CHAR *  FileName;

   FileName = ( CHAR * ) hb_parc( 1 );

   // First find BMP image in resourses (.EXE file)
   hBitmap = ( HBITMAP ) LoadImage( GetModuleHandle( NULL ), FileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADTRANSPARENT | LR_LOADMAP3DCOLORS );

   // If fail: find BMP in disk
   if( hBitmap == NULL )
      hBitmap = ( HBITMAP ) LoadImage( NULL, FileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_LOADTRANSPARENT | LR_LOADMAP3DCOLORS );

   // If fail: find JPG Image in resourses
   if( hBitmap == NULL )
      hBitmap = bt_LoadOLEPicture( FileName, "JPG" );

   // If fail: find GIF Image in resourses
   if( hBitmap == NULL )
      hBitmap = bt_LoadOLEPicture( FileName, "GIF" );

   // If fail: find PNG Image in resourses
   if( hBitmap == NULL )
      hBitmap = bt_LoadGDIPlusPicture( FileName, "PNG" );

   // If fail: find TIF Image in resourses
   if( hBitmap == NULL )
      hBitmap = bt_LoadGDIPlusPicture( FileName, "TIF" );

   // If fail: find JPG and GIF Image in disk
   if( hBitmap == NULL )
      hBitmap = bt_LoadOLEPicture( FileName, NULL );

   // If fail: find PNG and TIF Image in disk
   if( hBitmap == NULL )
      hBitmap = bt_LoadGDIPlusPicture( FileName, NULL );

   // If fail load: return zero
   if( hBitmap == NULL )
   {
      hb_retnll( 0 );
      return;
   }

//   if (bt_bmp_is_24bpp (hBitmap) == FALSE)
//       hBitmapFile = bt_bmp_convert_to_24bpp (hBitmap, BMP_DELETE_ORIGINAL_HBITMAP);   // Convert Bitmap in 24bpp

   hb_retnll( ( LONG_PTR ) hBitmap );
}

HBITMAP bt_LoadGDIPlusPicture( CHAR * FileName, CHAR * TypePictureResource )
{
   IStream *  iStream;
   HBITMAP    hBitmap;
   HGLOBAL    hGlobalAlloc;
   GpBitmap * pGpBitmap;
   ARGB       BkColor;

   if( bt_Load_GDIplus() == FALSE )
      return NULL;

   if( TypePictureResource != NULL )
      hGlobalAlloc = bt_LoadFileFromResources( FileName, TypePictureResource );
   else
      hGlobalAlloc = bt_LoadFileFromDisk( FileName );

   if( hGlobalAlloc == NULL )
      return NULL;

   iStream = NULL;
   hBitmap = NULL;
   if( CreateStreamOnHGlobal( hGlobalAlloc, FALSE, &iStream ) == S_OK )
   {
      //BkColor = 0xFF000000UL; aqui cor transparente 0x00FFFFFFUL
      BkColor = 0x00FFFFFFUL;
      GdipCreateBitmapFromStream( iStream, &pGpBitmap );
      GdipCreateHBITMAPFromBitmap( pGpBitmap, &hBitmap, BkColor );
      iStream->lpVtbl->Release( iStream );
   }

   bt_Release_GDIplus();
   GlobalFree( hGlobalAlloc );
   return hBitmap;
}
Descobri isso

* BkColor = 0xFF000000UL; original da função
BkColor = 0x00FFFFFFUL; cor transparente
2020-12-08 20_46_28-RMChart Demo.png
Icone com fundo preto com o valor original 0xFF000000UL

Cor de fundo do ICON

Enviado: 08 Dez 2020 21:00
por asimoes
Para icone branco tem que usar o valor original, talvez tenha que ser um parâmetro da function
2020-12-08 20_58_27-RMChart Demo.png

Cor de fundo do ICON

Enviado: 08 Dez 2020 21:12
por asimoes
Qualquer cor diferente de preto e branco não precisar fazer nada, ou criar um parâmetro na BT para tratar B/W
2020-12-08 21_11_41-Greenshot.png

Cor de fundo do ICON

Enviado: 09 Dez 2020 00:55
por JoséQuintas
Ok, então vale pra ícone também.

Postei pouco tempo atrás a rotina pra ESCOLHER a cor que vai ficar transparente, ao invés de ser a tela inteira.
Provavelmente a rotina de bitmap faça uso dela, e provavelmente as cores mais usadas pra ficarem transparentes sejam branca e preta.

Cor de fundo do ICON

Enviado: 09 Dez 2020 08:36
por Itamar M. Lins Jr.
Olá!
Será bom incorporar a BOSTAURUS na Hwgui, porquê fica esses exemplos com versões incompatíveis, usando 2.17 e a versão final do SVN.
Eu mesmo tenho que reler aqui esses exemplos para entender, mas dai lembro que não existe BOSTAURUS na Hwgui, oficialmente falando.

Saudações,
Itamar M. Lins Jr.

Cor de fundo do ICON

Enviado: 09 Dez 2020 10:56
por asimoes
Itamar M. Lins Jr. escreveu:Olá!
Será bom incorporar a BOSTAURUS na Hwgui, porquê fica esses exemplos com versões incompatíveis, usando 2.17 e a versão final do SVN.
Eu mesmo tenho que reler aqui esses exemplos para entender, mas dai lembro que não existe BOSTAURUS na Hwgui, oficialmente falando.
Não existe, mas os fontes estão disponíveis para incorporar na hwgui ou usar fora da hwgui

A Bostaurus é um recurso opcional na Minigui

Cor de fundo do ICON

Enviado: 09 Dez 2020 12:55
por Itamar M. Lins Jr.
Olá!
Eu li no grupo internacional que o Italiano Maurizio fez o porte para a Hwgui, não sei pq eles não fazem o commit.
https://groups.google.com/g/harbour-use ... w_LVzoBgAJ
Hi,
Auge & Ohr suggestion it's very fine.
Today I found the time to study BosTaurus (a very nice piece of code) and how to use it outside HMG and easily did the job.

I just added BosTaurus_C.prg, BosTaurus.ch and mgdefs.h to my project and rewrote the function:

Código: Selecionar todos

#include "bostaurus.ch"

function hbs_ScreenShot( cFileName, nImgType )

   local row       := Hb_GtInfo( HB_GTI_SETPOS_XY )[ 2 ]
   local col       := Hb_GtInfo( HB_GTI_SETPOS_XY )[ 1 ]
   local width     := Hb_GtInfo( HB_GTI_SCREENWIDTH )
   local height    := Hb_GtInfo( HB_GTI_SCREENHEIGHT )
   local maxwidth  := hb_GtInfo( HB_GTI_DESKTOPWIDTH )
   local maxheight := hb_GtInfo( HB_GTI_DESKTOPHEIGHT )
  
   /* reduce the output to the visible part of the app window */
   if col + width > maxwidth
      width := maxwidth - col
   endif
   if row + height > maxheight
      height := maxheight - row
   endif
  
   return BT_BMP_SaveFile( BT_BMP_CaptureScr( Hb_GtInfo( HB_GTI_WINHANDLE ), ;
                                              col, ;
                                              row, ;
                                              width, ;
                                              height, ;
                                              BT_BITMAP_CAPTURE_WINDOW ), ;
                           cFileName, ;
                           hb_defaultValue( nImgType, BT_FILEFORMAT_PNG ) )
Saudações,
Itamar M. Lins Jr.

Cor de fundo do ICON

Enviado: 09 Dez 2020 21:02
por JoséQuintas
Itamar M. Lins Jr. escreveu:Eu li no grupo internacional que o Italiano Maurizio fez o porte para a Hwgui, não sei pq eles não fazem o commit.
Bostaurus é só Windows, deve ser por isso.
Eu peguei, se não me engano, da OOHG.

Cor de fundo do ICON

Enviado: 10 Dez 2020 09:32
por asimoes
JoséQuintas escreveu:Bostaurus é só Windows, deve ser por isso.
Eu peguei, se não me engano, da OOHG.
Linux não deve funcionar
Mesmo porque a Bostaurus foi feita para funcionar originalmente na Minigui

Cor de fundo do ICON

Enviado: 10 Dez 2020 11:22
por JoséQuintas
teste.png
No estilo da WVG.... kkkk
Se não deixa definir a cor de fundo na criação.... altera depois...

Código: Selecionar todos

   FOR EACH cCaption, hIcon IN acOptions, ::hIconList
      DO CASE
      CASE cCaption == "Consulta"; bCode := { || ::Consulta() }
      CASE cCaption == "Altera";   bCode := { || ::Altera() }
      CASE cCaption == "Exclui";   bCode := { || ::Exclui() }
      CASE cCaption == "Primeiro"; bCode := { || ::Primeiro() }
      CASE cCaption == "Último";   bCode := { || ::Ultimo() }
      CASE cCaption == "Seguinte"; bCode := { || ::Seguinte() }
      CASE cCaption == "Anterior"; bCode := { || ::Anterior() }
      CASE cCaption == "Sair";     bCode := { || ::Sair() }
      ENDCASE
      @ nCol, nRow ICON hIcon SHOW IconFromCaption( cCaption ) FROM RESOURCE ;
         OF ::oFrm ;
         SIZE 55, 55 ;
         ON CLICK bCode ;
         TOOLTIP cCaption
      hIcon:SetColor( 0, 0 )
      nCol += 60
      IF nCol > 540
         nCol := 1
         nRow += 60
      ENDIF
   NEXT

Cor de fundo do ICON

Enviado: 10 Dez 2020 11:22
por Claudio Soto
Si BT sólo funciona en Windows porque uriliza el API de Windows para manipular los mapas de bits.

Cor de fundo do ICON

Enviado: 10 Dez 2020 11:45
por JoséQuintas
JoséQuintas escreveu:Se não deixa definir a cor de fundo na criação.... altera depois...
Só comentário:
Essa é uma das complicações da API Windows.
O ícone NÃO está na janela do aplicativo, ele está em sua própria janela.
Ao deixar o ícone transparente, o que aparece é a janela do ícone, o que dá a impressão de que o ícone não ficou transparente.

Pelo mesmo motivo, aquele degradê da janela que foi postada anteriormente não aparece no ícone, porque não faz parte dele.
A complicação aqui é quando o transparente do ícone/imagem é diferente do transparente da janela do ícone/imagem.
Exemplo:
na janela do ícone a parte transparente é branca, mas no ícone a parte transparente é preta.
Como só uma cor pode ficar transparente.... se o preto virou transparente, a cor branca da janela aparece.
Então, o ícone branco tem transparência, mas a transparência ficou com o branco da janela do ícone.

O que fiz foi alterar a janela do ícone pra preto, e o ícone transparente deixa aparecer esse preto.
Convém lembrar que a HWGUI deveria ter feito isso automático, pra não precisar fazer isso em tudo que é controle, ao alterar a cor da janela.
Algo do tipo, se cor não definida, usa da mãe (parent)

Cor de fundo do ICON

Enviado: 10 Dez 2020 12:34
por JoséQuintas
teste.png
Uma visão rápida.

- O ícone é transparente
- A janela DO ÍCONE é vermelha
- A janela DA DIALOG é preta

É isso que muitas vezes confunde, são várias janelas.
Como na maioria das vezes a LIB faz tudo sozinha, a gente acaba esquecendo disso.
O ícone ser transparente não significa que o fundo dele vai ficar da cor da janela da dialog, e nem mesmo de um panel.

Cor de fundo do ICON

Enviado: 10 Dez 2020 13:06
por JoséQuintas
gthwgui.png
Aproveitando e voltando à janela GT.....
A tela GT é apenas a imagem de fundo.... da mesma forma que poderia ser o efeito gradiente, ou apenas uma única cor.
É o Harbour quem atualiza esse fundo ao fazer SAY/GET e outras coisas.
Pra componentes GUI, tanto faz, já que nem usam essa janela.