Clipper On Line • Ver Tópico - Cor Enable() / Disable() de Botões com Icone
Mudar para estilo Clássico
Projeto HwGui - Biblioteca visual para Harbour/xHarbour
Postar uma resposta

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

19 Mai 2018 19:08

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) Visualizado 1255 vezes


O código abaixo dá a ideia de como simular o enable/disable sem perder a qualidade do icone

Código:
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

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

19 Mai 2018 20:16

Uma pequena correção:

Código:
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

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

20 Mai 2018 08:37

Quem quiser testar, um pequeno exemplo usando a progress bar
Demo.zip
(1019.35 KiB) Baixado 88 vezes


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

20 Mai 2018 16:02

Se não me engano, na bostaurus tem função pra escala de cinza.
Poderia evitar a necessidade de ícone adicional.

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

20 Mai 2018 18:58

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:
   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) Visualizado 1232 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

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

20 Mai 2018 21:39

Postar uma resposta