Armazenando imagens no script para exibição em telas e criando botões animados com controles do tipo Picture

Artigos, manuais, conselhos e dicas sobre programação em AutoHotkey
User avatar
Gio
Posts: 450
Joined: 30 Sep 2013, 10:54
Location: Brazil

Armazenando imagens no script para exibição em telas e criando botões animados com controles do tipo Picture

13 Sep 2018, 11:17

Olá :angel:

Se você começou a aprender a programar telas usando o AutoHotkey há pouco tempo, deve ter se deparado com aparentes "limitações" nas opções padronizadas dos controles de telas. Primeiro, o controle do tipo Picture (imagem) depende de um arquivo de imagem identificado pelo caminho, o que significa que um usuário do script (não confundir com o próprio desenvolvedor) pode acabar se valendo disso para alterar a imagem que o seu programa exibe nas telas. Segundo, o controle do tipo botão não possui opções para inserção de texturas e cores, ou mesmo de uma animação, o que seria bom para quem gosta de aplicar efeitos estéticos em seus programas.

Essas duas questões não são falhas e nem limitações do AutoHotkey. Elas significam apenas que para você fazer essas coisas, deve procurar outros meios que não as opções padronizadas. Devemos lembrar sempre que quase tudo o que vemos em um computador foi feito através de programação, portanto, se você já viu um botão com textura, é porque é possível fazê-lo usando programação. Neste sentido, além de ser possível, os usuários da comunidade já contribuíram com vários exemplos de códigos para implementar essas duas opções ao longo do anos.

:arrow: Não se esqueça de consultar os fórums sempre que tiver uma ideia e não conseguir um meio de implementá-la somente através da documentação do programa. Você pode sempre usar os mecanismos de busca para encontrar tópicos que já existam sobre o assunto ou ainda fazer uma pergunta no fórum Ajuda e Suporte Geral.

:arrow: A dica abaixo é apenas uma das possibilidades de implementar botões animados (com texturas) e imagens com código dentro do script que não permitem ao usuário alterar a estética da tela mudando os arquivos. Existem muitas outras.

Primeiro, aqui vai o código para você testar (as explicações virão abaixo dele e também dentro do código em comentários):

Code: [Select all] [Expand] [Download] GeSHi © Codebox Plus



:arrow: O primeiro truque do código é simples. Nós armazenamos dentro do próprio script algumas strings (sequências de caracteres) compostas por hexadecimais (número em base 16) que correspondem aos valores binários dos arquivos de imagem, e depois usamos essas strings para encontrar os binários e com eles recriar os arquivos de imagem logo antes de adicioná-los nas telas. Isso resolve 2 possíveis problemas: Primeiro, o script agora pode ser distribuído sozinho (sem outros arquivos) e a sua tela ainda assim vai exibir as imagens do programa. Segundo, se o usuário (não o programador) deletar ou modificar os arquivos de imagem com o intuito de mudar a imagem a ser exibida na tela do programa, isso não funcionará, pois o programa reescreverá os arquivos de imagem logo antes da exibição e com isso exibirá as imagens corretas (ou seja, as escolhidas pelo programador). Com isso, modificar as imagens da tela se torna um pouco mais difícil.

:arrow: Um segundo truque do código é usar a função OnMessage() para monitorar o movimento e os cliques do mouse, de modo a animar corretamente a imagem do botão. É isto que transforma o controle do tipo imagem em uma espécie de botão rudimentar. O cursor do mouse também é modificado para uma mãozinha sempre que for movido para dentro da área da imagem e a imagem da tela também é modificada se o cursor se posiciona nela ou se clique nela (promovendo a animação).


Considerações finais:

Esse exemplo de código é somente uma prova de conceito e pode ser melhorado de várias maneiras. É possível, por exemplo, adicionar uma checagem de integridade nos arquivos reescritos antes de exibi-los na tela. Também devemos notar que ainda que o binários dos arquivos de imagem estejam dentro do próprio script, possibilitando a distribuição do mesmo somente em um arquivo, o script ainda faz uso de arquivos de imagem que ele cria na hora da execução. Há maneiras de fazer com que o script use apenas strings da memória se for necessário, melhorando ainda mais o conceito. Outro ponto importante é que a matemática que determina se o mouse se posicionou ou clicou na imagem é muito simplificada e por isso considera uma área retangular (o botão é redondo). É possível mudar isso também, alterando a área de ação ou mesmo tornando-a diretamente relacionada ao controle de imagem. Finalmente, este método tem uma limitação: algumas funcionalidades padrão de controles do tipo botão não existem em controles do tipo imagem, e isso significa que não será possível implementá-las sem escrever mais códigos nesta versão simplificada de botão.


Quaisquer dúvidas sinta-se livre para postar abaixo.
:wave:
Gio

:arrow: EDIT: Abaixo segue um exemplo de rotina para obtenção de uma string hex de arquivos de imagem usando o AutoHotkey.

Code: [Select all] [Expand] [Download] GeSHi © Codebox Plus



Execute o script acima, selecione a imagem desejada e a string hex será copiada para o clipboard (para que você possa colá-la no script que desejar). Assim, é possível alterar a string no exemplo acima de modo a mudar a imagem do botão.


Palavras-Chave: Figura Imagem Botao GUI tela janela cor arquivo mudar mudando alterar alterando mouse ponteiro cursor sobre

Links relacionados: Class_ImageButton - Uma classe do usuário Just Me que implementa texturas em controles do tipo botão (ou seja, sem precisar de controle do tipo imagem, mantendo as opções de botão).
"What is suitable automation? Whatever saves your day for the greater matters."
Barcoder - Create QR Codes and other Barcodes using only Autohotkey !!
User avatar
Gio
Posts: 450
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Armazenando imagens no script para exibição em telas e criando botões animados com controles do tipo Picture

13 Sep 2018, 11:36

O usuário Alguimist postou uma versão otimizada/melhorada do código acima neste post. A versão dele, no entanto, não reescreve os arquivos, mas você pode remover a condicional If (FileExist(Filename)) para manter o efeito de sobrescrita usando o código dele.
"What is suitable automation? Whatever saves your day for the greater matters."
Barcoder - Create QR Codes and other Barcodes using only Autohotkey !!

Return to “Tutoriais”

Who is online

Users browsing this forum: No registered users and 1 guest