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 1558 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 138 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, 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

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 1535 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