Nesta dica veremos como adicionarmos ToolTips em controles de nossas aplicações Delphi, assim podemos usá-los no lugar dos tradicionais, porém visualmente pobres, hints.

 

Para conseguirmos esse efeito, vamos criar as seguintes constantes com alguns valores que serão usados para a criação da toolTip.

 

const

  TOOLTIPS_CLASS = 'tooltips_class32';

  TTS_ALWAYSTIP = $01;

  TTS_NOPREFIX = $02;

  TTS_BALLOON = $40;

  TTF_SUBCLASS = $0010;

  TTF_TRANSPARENT = $0100;

  TTF_CENTERTIP = $0002;

  TTM_ADDTOOL = $0400 + 50;

  TTM_SETTITLE = (WM_USER + 32);

  ICC_WIN95_CLASSES = $000000FF;

 

Após isso, vamos declarar um tipo que encapsulará algumas características da nossa ToolTip, conforme mostrado abaixo:

 

  TOOLINFO = packed record

    cbSize: Integer;

    uFlags: Integer;

    hwnd: THandle;

    uId: Integer;

    rect: TRect;

    hinst: THandle;

    lpszText: PWideChar;

    lParam: Integer;

  end;

 

Agora, vamos criar um método para adicionar uma ToolTip em um controle.

 

procedure TForm1.ShowBalloonTip(Control: TWinControl; Icon: integer; Text: PWideChar);

var

  hWndTip: THandle;

  ti: TOOLINFO;

  hWnd: THandle;

begin

  //Recupera o handle do do controle que receberá a toolTip

  hWnd    := Control.Handle;

  //Cria uma janela para a toolTip e armazena o seu handle

  //Já determina que o controle passado como parâmetro é o parent desta toolTip

  hWndTip := CreateWindow(TOOLTIPS_CLASS, nil,

    WS_POPUP or TTS_NOPREFIX or TTS_BALLOON or TTS_ALWAYSTIP,

    0, 0, 0, 0, hWnd, 0, HInstance, nil);

  //Se tiver conseguido criar a tooltip, então altera as configurações

  if hWndTip <> 0 then

  begin

    SetWindowPos(hWndTip, HWND_TOPMOST, 0, 0, 0, 0,

      SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);

    ti.cbSize := SizeOf(ti);

    ti.uFlags := TTF_CENTERTIP or TTF_TRANSPARENT or TTF_SUBCLASS;

    ti.hwnd := hWnd;

    ti.lpszText := Text;

    Windows.GetClientRect(hWnd, ti.rect);

    SendMessage(hWndTip, TTM_ADDTOOL, 1, Integer(@ti));

  end;

end;

 

O resultado que temos é o seguinte:




É isso aí pessoal, vou ficando por aqui.

Fiquem a vontade para criticar, tirar dúvidas e sugerir novos temas.
Abraço.

Ricardo Coelho