Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to show Vista style balloon hints in Delphi?

Tags:

winapi

delphi

On input validation, I'm using balloon tips instead of message boxes. My problem is that on Vista, they have the old XP style with the rounded corners, not the newer more rectangle like appearance.

I've tried creating them using CreateWindowEx and tooltips_class32 or showing the Edit's associated balloontip using SendMessageW and EM_SHOWBALLOONTIP, the result is the same. Doing the same thing in Visual Studio and C# results in a Vista style balloon tip.

You can see an example of the balloon hint I need, when you toggle Caps Lock while in a password edit, like the one on the Windows Logon.

like image 511
Attila Szasz Avatar asked Nov 18 '08 08:11

Attila Szasz


3 Answers

If you're using Delphi 2009, then adding balloon hints is reasonably straightforward, although the documentation is poor. (surprise, surprise)

  • Drop a TBalloonHint on your form
  • Drop a TImageList to contain icons if needed.
  • Link the TIMageList to the TBalloonHint
  • Set the form's CustomHint property to the TBalloonHint
  • Make sure ShowHint and ParentCustomHint are set true for your controls.

This next bit is very non-obvious:

  • Format the "Hint" property of your control as "Title|Hint|ImageIndex"

You're done. This doesn't look 100% vista-like, maybe due to font choice. But it's pretty close.

Delphi 2009
(source: codegear.com) ,

like image 156
Roddy Avatar answered Oct 13 '22 17:10

Roddy


As can be read in Delphi 2009 reviewers guide each VCL component now has a CustomHint property. It can be set to any descendant of TCustomHint.

Be sure to enable baloon hints in Vista else they won't show.

like image 39
Toon Krijthe Avatar answered Oct 13 '22 17:10

Toon Krijthe


The TCustomHint in Delphi 2009 has four protected overloads of ShowHint that when called allow you to place the TCustomHint on demand and in specific locations:

procedure ShowHint; overload;
procedure ShowHint(Point: TPoint); overload;
procedure ShowHint(Rect: TRect); overload;
procedure ShowHint(Control: TControl); overload;

All you need to do is implement a hint in the style you want (or just descend from TBalloonHint if it is close enough) and make those methods public to have the ability to place a hint where-ever and when-ever you want.

Note: Change the Title property of the TCustomHint to change what text is displayed, unless you use the ShowHint that takes a TControl as an argument. In that case it gets it from the control's Hint property (and places it in the Title property of the TCustomHint).

like image 2
Jim McKeeth Avatar answered Oct 13 '22 17:10

Jim McKeeth