Clipper On Line • Ver Tópico - Cor Enable() / Disable() de Botões com Icone

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

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

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

Mensagempor asimoes » 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 324 vezes


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

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

asimoes
Colaborador

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

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

Mensagempor asimoes » 19 Mai 2018 20:16

Uma pequena correção:

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

asimoes
Colaborador

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

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

Mensagempor asimoes » 20 Mai 2018 08:37

Quem quiser testar, um pequeno exemplo usando a progress bar
Demo.zip
(1019.35 KiB) Baixado 19 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: 3904
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 268 vezes
Mens.Curtidas: 182 vezes

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

Mensagempor JoséQuintas » 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.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 9894
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 626 vezes

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

Mensagempor asimoes » 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()

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

asimoes
Colaborador

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

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

Mensagempor asimoes » 20 Mai 2018 21:39

►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: 3904
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 268 vezes
Mens.Curtidas: 182 vezes




Retornar para HwGui

Quem está online

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


Faça uma doação para o forum
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro