Delphi: Formulário "ToolTip"

Bem... hoje vou mostrar como criar um formulário no estilo ToolTip, como se fosse um balão com informações (Hint), que é exibido quando passamos o mouse sobre um objeto de nossa escolha. No meu caso, escolhi um TImage.

Ao passar o mouse sobre o TImage, o formulário ToolTip é exibido. E quando o mouse sai dos limites do formulário, o ToolTip é fechado.

E fiz isso da seguinte forma:
Criei a classe TMeuToolTip e o método que quero destacar aqui é o CMMouseLeave, que fará com que o formulário seja fechado.
type
  TMeuToolTip = class(TForm)
  private
    FMemo: TMemo;
    procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  end;

{ TMeuToolTip }

procedure TMeuToolTip.CMMouseLeave(var Msg: TMessage);
begin
  Self.Close;
end;
E a chamada do formulário é realizada através do evento MouseMove do TImage.
procedure TfrmPrincipal.ImageInfoMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if Assigned(frmMeuToolTip) and frmMeuToolTip.Visible then
    Exit;

  {Criar o formulário ToolTip}
  frmMeuToolTip := TMeuToolTip.CreateNew(frmPrincipal);
  frmMeuToolTip.Name := 'frmMeuToolTip';
  {Removemos as bordas}
  frmMeuToolTip.BorderStyle := bsNone;
  {Designamos a sua posição}
  frmMeuToolTip.Position := poDesigned;
  frmMeuToolTip.Left := frmPrincipal.Left + ImageInfo.Left;
  frmMeuToolTip.Top := frmPrincipal.Top + ImageInfo.Top + ImageInfo.Height;

  {Aplico um AlphaBlend para exemplificar}
  frmMeuToolTip.AlphaBlendValue := 200;
  frmMeuToolTip.AlphaBlend := True;

  {Evento que libera o formulário da memória}
  frmMeuToolTip.OnClose := frmMeuToolTip.FormClose;

  {Criando um texto de exemplo}
  frmMeuToolTip.FMemo := TMemo.Create(frmMeuToolTip);
  frmMeuToolTip.FMemo.Parent := frmMeuToolTip;
  frmMeuToolTip.FMemo.Visible := True;
  frmMeuToolTip.FMemo.Align := alClient;
  frmMeuToolTip.FMemo.Lines.Add('Texto de exemplo');
  frmMeuToolTip.FMemo.Lines.Add('abcdef abcdef abcdef abcdef abcdef' +
    'abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef');
  frmMeuToolTip.FMemo.WordWrap := True;
  frmMeuToolTip.FMemo.HideSelection := True;
  frmMeuToolTip.FMemo.ReadOnly := True;
  frmMeuToolTip.FMemo.Color := clYellow;

  frmMeuToolTip.Show;
end;
Para não ter que ficar criando os objetos em tempo de execução, aconselho criar o formulário ToolTip em outra unit, isso facilitará e agilizará todo o trabalho. :)

Código completo:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Commctrl, Menus, StdCtrls, Grids, Vcl.ExtCtrls;

type
  TMeuToolTip = class(TForm)
  private
    FMemo: TMemo;
    procedure CMMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  end;

  TfrmPrincipal = class(TForm)
    ImageInfo: TImage;
    procedure ImageInfoMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    frmMeuToolTip: TMeuToolTip;
  end;

var
  frmPrincipal: TfrmPrincipal;

implementation

{$R *.dfm}

{ TMeuToolTip }

procedure TMeuToolTip.CMMouseLeave(var Msg: TMessage);
begin
  Self.Close;
end;

procedure TMeuToolTip.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeAndNil(Self);
end;

procedure TfrmPrincipal.ImageInfoMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if Assigned(frmMeuToolTip) and frmMeuToolTip.Visible then
    Exit;

  {Criar o formulário ToolTip}
  frmMeuToolTip := TMeuToolTip.CreateNew(frmPrincipal);
  frmMeuToolTip.Name := 'frmMeuToolTip';
  {Removemos as bordas}
  frmMeuToolTip.BorderStyle := bsNone;
  {Designamos a sua posição}
  frmMeuToolTip.Position := poDesigned;
  frmMeuToolTip.Left := frmPrincipal.Left + ImageInfo.Left;
  frmMeuToolTip.Top := frmPrincipal.Top + ImageInfo.Top + ImageInfo.Height;

  {Aplico um AlphaBlend para exemplificar}
  frmMeuToolTip.AlphaBlendValue := 200;
  frmMeuToolTip.AlphaBlend := True;

  {Evento que libera o formulário da memória}
  frmMeuToolTip.OnClose := frmMeuToolTip.FormClose;

  {Criando um texto de exemplo}
  frmMeuToolTip.FMemo := TMemo.Create(frmMeuToolTip);
  frmMeuToolTip.FMemo.Parent := frmMeuToolTip;
  frmMeuToolTip.FMemo.Visible := True;
  frmMeuToolTip.FMemo.Align := alClient;
  frmMeuToolTip.FMemo.Lines.Add('Texto de exemplo');
  frmMeuToolTip.FMemo.Lines.Add('abcdef abcdef abcdef abcdef abcdef' +
    'abcdef abcdef abcdef abcdef abcdef abcdef abcdef abcdef');
  frmMeuToolTip.FMemo.WordWrap := True;
  frmMeuToolTip.FMemo.HideSelection := True;
  frmMeuToolTip.FMemo.ReadOnly := True;
  frmMeuToolTip.FMemo.Color := clYellow;

  frmMeuToolTip.Show;
end;

end.

Nenhum comentário:

Postar um comentário