ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Alterar trayicon conforme tema do Windows

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
marcieldeg
Colaborador
Colaborador


Registrado: Terça-Feira, 5 de Abril de 2011
Mensagens: 1054
Localização: Vitória - ES

MensagemEnviada: Sex Mar 18, 2022 2:03 pm    Assunto: Alterar trayicon conforme tema do Windows Responder com Citação

Boa tarde,

Estou criando trayicons personalizados monocromáticos para seguir o padrão do Windows 10.

Como alterar o ícone de acordo com o tema do Windows? Ou seja, se a barra for clara, exibir o ícone escuro, e vice versa, conforme o Windows faz com seus ícones internos de bateria, wi-fi etc?
_________________
"Olha a interface da IDE! Será que ela é? Será que ela é? DELPHI!"
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Sex Mar 18, 2022 11:27 pm    Assunto: Re: Alterar trayicon conforme tema do Windows Responder com Citação

marcieldeg escreveu:
Boa tarde,

Estou criando trayicons personalizados monocromáticos para seguir o padrão do Windows 10.

Como alterar o ícone de acordo com o tema do Windows? Ou seja, se a barra for clara, exibir o ícone escuro, e vice versa, conforme o Windows faz com seus ícones internos de bateria, wi-fi etc?



Acredito que exista algum recurso da api para devolver a cor de determinado control do windows mesmo que seja a barra de tarefa.

Quanto ao saber qual icone usar mediante a uma determinada cor a resposta é bem simples

A cor deve ser convertida em tom de cinza e em seguida perguntado se o tom de cinza obtido é maior ou igual a 128, sendo então é um tema claro e deve ser usado o icone com cor escura, senão é um tema de cor escura e deve usar um icone de cor clara.

para obter um tom de cinza de um dada cor precisa possuir os rgb da mesma somado e dividodo por 3;


cor := cor_obtida;
tom_de_cinza := (getRvalue(cor)+ getGvalue(cor)+ getBvalue(cor) ) div 3;

if tom_cinza>=128
then use_icone_escuro
else use_icone_claro;


Caso não ache um recurso para obter a cor da barra de tarefa, voce pode usar o codigo do printscreen por região, assim voce printa um região pequena do desktop, muito proximo a uma região onde provavelmente possuiria a cor que vai entregar a cor do tema do windows, tipo: uma região de 40x40 pixels perto do botão iniciar ou do relógio deste print voce pode pegar um pixels e examinar a cor deste pixels levando a consideração o que foi explicado acima.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Sáb Mar 19, 2022 1:31 am    Assunto: Responder com Citação

Escrevi um codigo bem simples em vcl

Código:
procedure TForm1.Button2Click(Sender: TObject);
var
  cor: tcolor;
  tom_cinza: integer;
begin

  cor := GetPixel(GetDC(0), 1, screen.Height - 1); // cor da barra de tarefa nas coordenadas informada

  tom_cinza := (GetRValue(cor) + GetGValue(cor) + GetBValue(cor)) div 3; // descobrindo o tom cinza da cor buscada

  Shape1.Brush.Color := cor;

  if tom_cinza >= 128 then
    Shape2.Brush.Color := clBlack // usar icone escuro
  else
    Shape2.Brush.Color := clWhite; // usar icone claro

end;



Uma observação

Código:
// GetDC(0); -> busca o HDC do desktop (0 é seu HWND)
// GetPixel(HDC, x, y); busca o pixel da corredenada x e y do HDC


Desta forma, para buscar um pixel de qualquer lugar do desktop basta combinar ambos em GetPixel(GetDC(0), x, y);
Dei as coordenada x = 1 e y = screen.height -1
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
marcieldeg
Colaborador
Colaborador


Registrado: Terça-Feira, 5 de Abril de 2011
Mensagens: 1054
Localização: Vitória - ES

MensagemEnviada: Seg Mar 21, 2022 8:42 am    Assunto: Responder com Citação

Encontrei uma forma bem simples, basta ler a chave de registro "SystemUsesLightTheme" em
Código:
Computador\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize

Assim consigo identificar qual cor o sistema está usando e alterar o ícone de acordo.

Um problema é que não consigo fazer "a quente", alterando automaticamente se o usuário alterar as configurações do Windows, sendo necessário reiniciar a aplicação.
_________________
"Olha a interface da IDE! Será que ela é? Será que ela é? DELPHI!"
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Mar 21, 2022 4:07 pm    Assunto: Responder com Citação

ve se a dica do link te da um luz:

http://www.queryadmin.com/2382/delphi-xe-change-system-tray-icon-with-ttrayicon-no-blurry/
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB