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