quinta-feira, 13 de janeiro de 2011

Efeito HotTrack em componentes Label e CheckBox

Neste exemplo, vamos aprender como criar um efeito HotTrack para componentes TLabel e TCheckBox. Este efeito está presente em muitos componentes do Delphi, em um dos caso no componente TPageControl. Ele é responsável por colorir as "guias" do PageControl quando o mouse "pousa" sobre a TabSheet.

Você deve estar se perguntando:
- Não seria o caso de criarmos um evento onMouseMove e colorirmos o mesmo através deste evento?

A resposta é sim, mas teríamos que fazer isso para todos os componentes do Form. Então para simplificarmos, vamos usar um outro método, mais genérico.
Nós vamos enviar uma mensagem ao Form fazendo com que seja disparado uma procedure que contém o algoritimo que será usado para mudar a cor da fonte dos componentes; O algoritimo é a procedure a seguir:

procedure TForm1.ChangeColor(Sender : TObject; MSG : Integer);
begin
If Sender is TLabel Then begin
   If (Msg = CM_MOUSELEAVE) Then
     (Sender as TLabel).Font.Color:=clWindowText;
   If (Msg = CM_MOUSEENTER) Then
     (Sender as TLabel).Font.Color:=clBlue;
end;
If Sender is TCheckBox then begin
   If (Msg = CM_MOUSELEAVE) Then
     (Sender as TCheckBox).Font.Color:=clWindowText;
   If (Msg = CM_MOUSEENTER) Then
     (Sender as TCheckBox).Font.Color:=clBlue;
end;
end;

E para dispara-lo vamos usar a procedure:

procedure TForm1.WndProc(Var Msg : TMessage);
var I : Integer;
begin
For I := 0 to ComponentCount -1 do
   If MSG.LParam = Longint(Components[I]) Then ChangeColor(Components[i],Msg.Msg);
inherited WndProc(Msg);
end;

Que é herdada do próprio Delphi, veja "inherited WndProc(Msg);".

Para exemplificar:
1- Abra o Delphi e no form vazio que se abre coloque alguns CheckBoxes e Labels.
2- Declare as procedures como a seguir na área private do formulário.

...
private
{ Private declarations }
   procedure ChangeColor(Sender : TObject; MSG : Integer);
   procedure WndProc(Var Msg : TMessage);override;
public
{ Public declarations }
end;
...

3- Digite seus respectivos algoritimos:

procedure TForm1.ChangeColor(Sender : TObject; MSG : Integer);
begin
If Sender is TLabel Then begin
   If (Msg = CM_MOUSELEAVE) Then
     (Sender as TLabel).Font.Color:=clWindowText;
   If (Msg = CM_MOUSEENTER) Then
     (Sender as TLabel).Font.Color:=clBlue;
end;
If Sender is TCheckBox then begin
   If (Msg = CM_MOUSELEAVE) Then
     (Sender as TCheckBox).Font.Color:=clWindowText;
   If (Msg = CM_MOUSEENTER) Then
     (Sender as TCheckBox).Font.Color:=clBlue;
end;
end;
procedure TForm1.WndProc(Var Msg : TMessage);
var I : Integer;
begin
For I := 0 to ComponentCount -1 do
   If MSG.LParam = Longint(Components[I]) Then ChangeColor(Components[i],Msg.Msg);
inherited WndProc(Msg);
end;
Pronto, agora basta compilar e ver o resultado.

Note as verificações necessárias para mudar os labels e checkboxes, isso significa que podemos fazer para outros objetos no Delphi;

If Sender is TLabel Then begin
If Sender is TCheckBox then begin

Nenhum comentário:

Postar um comentário