9 de março de 2011

Personalizando a aparência da barra de status em Delphi

O componente TStatusBar no Delphi e no C++ Builder é usado para criar barras de status na interface visual dos programas. É apropriado para fornecer ao usuário uma visão rápida sobre a situação de quaisquer aspectos importantes da execução do programa. Por exemplo, para mostrar se um determinado serviço do qual o programa depende está ativo, ou se a tela está em modo de edição, ou ainda data e hora atual, etc.

Apesar de ser útil para grande parte das situações, o comportamento básico desse componente é bem restrito. Você pode criar painéis independentes para exibir cada informação distinta em sua própria área mas você tem que optar por apresentar ou um texto ou uma imagem. No caso de textos, todos os painéis compartilham a configuração de fonte (sua cor, estilos e a família) do próprio StatusBar, impedindo que cada painel possa dar destaque diferenciado à informação que ele contém.

Para contornar essa limitação, a VCL disponibiliza a propriedade Style como membro da classe TStatusPanel, que representa um painel no StatusBar. O valor padrão do Style é psText; se esse valor for ajustado para psOwnerDraw num painel, a responsabilidade por desenhar o conteúdo desse painel passa a ser do programador, através da resposta ao evento OnDrawPanel. Esse evento é disparado pelo StatusBar uma vez para cada painel cujo estilo seja psOwnerDraw.

O trecho abaixo ilustra a interceptação do evento, desenhando manualmente o conteúdo de um único painel. De acordo com um status controlado pelo programa, o texto do painel é exibido numa cor diferente, refletindo o significado do status:
procedure TNfeConfig.StatusBarDrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; var Rect: TRect);
var lCanvas : TCanvas;
begin
{ Verifica o índice do painel pois o desenho pode ser diferente p/ cada um }
if (Panel.Index = 1) then
begin
lCanvas := StatusBar.Canvas;

{ Pinta a cor de fundo com a própria cor do StatusBar }
lCanvas.Brush.Color := StatusBar.Color;
lCanvas.FillRect (Rect);

{ Configura o fonte para exibir a mensagem }
StatusBar.Font.Size := 11;
StatusBar.Font.Style := (fsBold);

{ Varia a cor do fonte com base num status interno meu }
if (_StatusServNFe = ssnOK) then
StatusBar.Font.Color := clTeal
else
StatusBar.Font.Color := clMaroon;

{ Posiciona o texto no painel }
lCanvas.TextOut(Rect.Left + 5, Rect.Top - 2, Panel.Text);
end;
end;

Veja que a primeira coisa que o código de desenho faz é recuperar uma instância do Canvas do próprio StatusBar. Falei sobre o TCanvas em outro post, quando mostrei como customizar a aparência de grids no Delphi.

Como o controle do desenho agora é nosso, devemos preparar o terreno antes, apagando qualquer conteúdo que já tenha sido montado em outra oportunidade. Este efeito é conseguido chamando a função FillRect do canvas, que preenche o retângulo reservado para nosso painel com a mesma cor de fundo configurada no StatusBar. Só pra lembrar: o parâmetro Rect passado para o evento representa a área de um único painel - aquele que está sendo desenhado no momento. É importante respeitá-lo para evitar que sua personalização sobreponha o conteúdo apresentado por outros painéis, atrapalhando a visualização deles.

O exemplo mostrado apenas desenha um texto com uma cor diferente, mas, como temos à disposição o canvas, podemos usar quaisquer recursos de desenho que ele provê, tais como traçar linhas, desenhar um bitmap ou preencher o painel com um padrão qualquer. Consulte a documentação da classe TCanvas para obter maiores detalhes sobre as possibilidades que ela abre na personalização da aparência de seu programa.

Para encerrar, é possível adotar solução similar a esta para customizar a aparência de outros componentes, como Comboboxes e PageControls, bastando configurar o estilo de cada um deles para forçar a execução do evento de pintura associado a eles.

Mais Informações
Classe TStatusBar, Classe TCanvas

Nenhum comentário :

Postar um comentário

OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.

Observação: somente um membro deste blog pode postar um comentário.