Cor Enable() / Disable() de Botões com Icone

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

Cor Enable() / Disable() de Botões com Icone

Mensagem por asimoes »

Olá Pessoal,

Tem aquele velho problema com icones quando o botão usando o método disable(), a qualidade do icone fica muito ruim, quase não dá pra saber o que é, então criei esse artifício para criar uma botão simulando disable sem perder a qualidade. O trabalho é criar o icone cinza, eu uso IcoFx para criar o icone cinza ex:
2018-05-19 19_04_37-h-ProgressoBar.png
2018-05-19 19_04_37-h-ProgressoBar.png (10.39 KiB) Exibido 1585 vezes
O código abaixo dá a ideia de como simular o enable/disable sem perder a qualidade do icone

Código: Selecionar todos

FUNCTION TestarEnableDisable()

   oIconPastaC := HIcon():AddFile("ICON_PASTAC.ICO", 24, 24)
   oIconPastaD := HIcon():AddFile("ICON_PASTAD.ICO", 24, 24)

   INIT DIALOG oDlg ;
               TITLE "Testar Icone Cor / Cinza" ;
               AT 0, 0 ;
               SIZE 637,120 ;
               ICON oIconPastaC ;
               NOEXIT ;
               STYLE WS_POPUP + WS_CAPTION + WS_SYSMENU + DS_CENTER 

   ThisForm := oDlg

   @ 10,72 BUTTONEX oBtnPasta ;
           CAPTION "" ;
           SIZE 32,32 ;
           ICON oIconPastaC:handle ;
           STYLE BS_CENTER + WS_TABSTOP ;
           ON CLICK {|| TestarPasta() } 

   ACTIVATE DIALOG oDlg 

RETURN Nil

FUNCTION Enable( oBtn, bClick, oColor )
   
   ThisForm:oBtn:bClick := bClick
   ThisForm:oBtn:SetIcon( oColor:handle )

RETURN Nil

FUNCTION Disable( oBtn, oColor )
   
   ThisForm:oBtn:bClick := Nil
   ThisForm:oBtn:SetIcon( oColor:handle )

RETURN Nil   

FUNCTION TestarPasta()

   Disable( oBtnPasta, oIconPastaD )
   
   Hwg_MsgInfo( "Botão do Icone ficou disable e trocou a cor para cinza, simulando o Disable()")
   
   Enable( oBtnPasta, {|| TestarPasta() }, oIconPastaC )
   
   Hwg_MsgInfo( "Botão do Icone ficou enable e trocou a cor para colorido, simulando o Enable()")

RETURN Nil

►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

Cor Enable() / Disable() de Botões com Icone

Mensagem por asimoes »

Uma pequena correção:

Código: Selecionar todos

THREAD STATIC ThisForm, oBtnPasta

FUNCTION TestarEnableDisable()

   oIconPastaC := HIcon():AddFile("ICON_PASTAC.ICO", 24, 24)
   oIconPastaD := HIcon():AddFile("ICON_PASTAD.ICO", 24, 24)

   INIT DIALOG oDlg ;
               TITLE "Testar Icone Cor / Cinza" ;
               AT 0, 0 ;
               SIZE 637,120 ;
               ICON oIconPastaC ;
               NOEXIT ;
               STYLE WS_POPUP + WS_CAPTION + WS_SYSMENU + DS_CENTER 

   ThisForm := oDlg

   @ 10,72 BUTTONEX oBtnPasta ;
           CAPTION "" ;
           SIZE 32,32 ;
           ICON oIconPastaC:handle ;
           STYLE BS_CENTER + WS_TABSTOP ;
           ON CLICK {|| TestarPasta() } 

   ACTIVATE DIALOG oDlg 

RETURN Nil

FUNCTION Enable( oBtn, bClick, oColor )
   
   oBtn:bClick := bClick
   oBtn:SetIcon( oColor:handle )

RETURN Nil

FUNCTION Disable( oBtn, oColor )
   
   oBtn:bClick := Nil
   oBtn:SetIcon( oColor:handle )

RETURN Nil   

FUNCTION TestarPasta()

   Disable( oBtnPasta, oIconPastaD )
   
   Hwg_MsgInfo( "Botão do Icone ficou disable e trocou a cor para cinza, simulando o Disable()")
   
   Enable( oBtnPasta, {|| TestarPasta() }, oIconPastaC )
   
   Hwg_MsgInfo( "Botão do Icone ficou enable e trocou a cor para colorido, simulando o Enable()")

RETURN Nil

►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

Cor Enable() / Disable() de Botões com Icone

Mensagem por asimoes »

Quem quiser testar, um pequeno exemplo usando a progress bar
Demo.zip
(1019.35 KiB) Baixado 143 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
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Cor Enable() / Disable() de Botões com Icone

Mensagem por JoséQuintas »

Se não me engano, na bostaurus tem função pra escala de cinza.
Poderia evitar a necessidade de ícone adicional.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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

Cor Enable() / Disable() de Botões com Icone

Mensagem por asimoes »

Não Quintas, a Bostaurus não tem exemplo de button (botões) com escala de cinza, neste caso estamos falando de imagens tipo icone (.ico) ou bitmap (.bmp)
Tanto HwGui e MiniGui utilizam a função DrawState -> DSS_DISABLED quando utilizam o método Disable()

Código: Selecionar todos

   DrawState( hDC, NULL, NULL, ( LPARAM ) hIcon, 0, x, y, cx, cy,
         ( style & WS_DISABLED ) !=
         0 ? ( DST_ICON | DSS_DISABLED ) : ( DST_ICON | DSS_NORMAL ) );
Ex. o primeiro icone a esquerda usando o método disable(), o último a direita usando um icone cinza.
2018-05-20 18_41_51-Form1.png
2018-05-20 18_41_51-Form1.png (2.19 KiB) Exibido 1562 vezes
Entendo que tem duplicidade de icones mas a função DrawState não funciona como deveria, o Delphi trabalha com Bitmap com imagem espelho em um mesmo arquivo bitmap, a imagem a esquerda é em cores a direita em escala cinza, a função, então usa esse bitmap que tem dimensão 64 x 64 ( 32 x 32 a esquerda é cor e 32 x 32 a direita é cinza) a função que faz isso não tenho a mínima ideia de como faz. Sei que faz assim porque já vi um bitmap na pasta resources que o delphi usa ter esta característica.

Nos exemplos o "meu" disable() faz oBtn:bClick := Nil, bClick é a propriedade que recebe o Bloco contendo a ação para o click do botão.

Posso usar:

* Desabilita o click do botão:

bClick := oBtn:bClick // Salva o bloco definido para o click do botão

oBtn:SetIcon( oIconeCinza:handle ) // Troca o icone escala cinza
oBtn:bClick := Nil //Remove o bloco do click

* Faz algum processo

* Habilita o click do botão

oBtn:SetIcon( oIconeCor:handle ) //Troca o icone escala colorido
oBtn:bClick := bClick // Restaura o bloco do click
►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

Cor Enable() / Disable() de Botões com Icone

Mensagem por asimoes »

►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)
Responder