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;
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.
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.