Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 149. - Používáme HotTrack

Jan Šindelář 28.7.2004

Dnešním tématem bude vlastnost HotTrack, kterou nalezneme například u komponenty PageControl. Naučíme se aplikovat tuto vlastnost prakticky na libovolnou vizuální komponentu.

Zapnutím vlastnosti HotTrack konkrétně u zmiňované komponenty PageControl docílíme toho, že po najetí kurzoru myši na jednotlivé záložky (TabSheet), resp. jejich titulky, dojde k jejich zvýraznění změnou barvy. Tento drobný efekt slouží především pro lepší orientaci uživatele a celkově zpřehledňuje práci s uživatelským prostředím aplikace.

Dnes si ukážeme, jak tento efekt aplikovat na libovolnou komponentu, na kterou si jen vzpomenete. Nejprve si odchytíme pomocí procedury WndProc tu komponentu, nad níž se nachází kurzor. Poté pošleme tento parametr naší proceduře HotTrack, která se postará o zvýraznění daného objektu. V našem příkladu je použito zvýraznění komponent Label modrou barvou, CheckBox je červený a písmo tlačítka je změněno na tučné. Pochopitelně můžete použít libovolné označení dle vaší fantazie a možností jednotlivých objektů.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    CheckBox1: TCheckBox;
    Button1: TButton;
  procedure WndProc(var Mesg: TMessage); override;
  procedure HotTrack(Sender: TObject; Msg: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WndProc(var Mesg : TMessage);
begin
  if Mesg.LParam = Longint(Label1) then HotTrack(Label1, Mesg.Msg);
//  if Mesg.LParam = Longint(Label2) then HotTrack(Label2, Mesg.Msg);
  if Mesg.LParam = Longint(Label3) then HotTrack(Label3, Mesg.Msg);
  if Mesg.LParam = Longint(CheckBox1) then HotTrack(CheckBox1, Mesg.Msg);
  if Mesg.LParam = Longint(Button1) then HotTrack(Button1, Mesg.Msg);
  inherited WndProc(Mesg);
end;

procedure TForm1.HotTrack(Sender: TObject; Msg: Integer);
begin
  if Sender is TLabel then
    begin
      if (Msg = CM_MOUSEENTER) then (Sender as TLabel).Font.Color := clBlue;
      if (Msg = CM_MOUSELEAVE) then (Sender as TLabel).Font.Color := clWindowText;
    end;

  if Sender is TCheckBox then
    begin
      if (Msg = CM_MOUSEENTER) then (Sender as TCheckBox).Font.Color := clRed;
      if (Msg = CM_MOUSELEAVE) then (Sender as TCheckBox).Font.Color := clWindowText;
    end;

  if Sender is TButton then
    begin
      if (Msg = CM_MOUSEENTER) then (Sender as TButton).Font.Style := [fsBold];
      if (Msg = CM_MOUSELEAVE) then (Sender as TButton).Font.Style := [];
    end;
end;

end.

Jak vidíte z kódu, můžeme velmi snadno ovlivnit, na které konkrétní komponenty bude efekt použit. Drobnou úpravou kódu pak můžeme aktivovat tento efekt pro všechny komponenty daného druhu.

I tentokrát je pro vás připraven ukázkový projekt (Delphi7) a to i ve zkompilované podobě, takže můžete stahovat zde.