uses CommCtrl; type TShowBalloonTipIcon = (btIconNone, btIconInfo, btIconWarning, btIconError); procedure ShowBalloonTip( AOwner: TWinControl; AIconType: TShowBalloonTipIcon; AInfoText: PWideChar; ATitle: PAnsiChar = nil; ABackgroundColor: TColor = clInfoBk; ATextColor: TColor = clInfoText); 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; type TOOLINFO = packed record cbSize: Integer; uFlags: Integer; hwnd: THandle; uId: Integer; rect: TRect; hinst: THandle; lpszText: PWideChar; lParam: Integer; end; var hControlWnd : HWND; hWndTooltip : HWND; pToolInfo : TOOLINFO; begin hControlWnd := AOwner.Handle; hWndTooltip := CreateWindow(TOOLTIPS_CLASS, nil, WS_POPUP or TTS_NOPREFIX or TTS_BALLOON or TTS_ALWAYSTIP, 0, 0, 0, 0, hControlWnd, 0, HInstance, nil); if hWndTooltip <> 0 then begin SetWindowPos(hWndTooltip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); ZeroMemory(@pToolInfo, SizeOf(TOOLINFO)); pToolInfo.cbSize := SizeOf(TOOLINFO); pToolInfo.uFlags := TTF_CENTERTIP or TTF_TRANSPARENT or TTF_SUBCLASS; pToolInfo.hwnd := hControlWnd; pToolInfo.lpszText := AInfoText; Windows.GetClientRect(hControlWnd, pToolInfo.rect); PostMessageW(hWndTooltip, TTM_SETTIPBKCOLOR, ColorToRGB(ABackgroundColor), 0); PostMessageW(hWndTooltip, TTM_SETTIPTEXTCOLOR, ColorToRGB(ATextColor), 0); PostMessageW(hWndTooltip, TTM_ADDTOOL, 1, Integer(@pToolInfo)); if Assigned(ATitle) then PostMessageW(hWndTooltip, TTM_SETTITLE, Ord(AIconType) mod 4, Integer(ATitle)); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin ShowBalloonTip(Button1, btIconError, 'Helloworld!', 'Nothing to loose'); end;