Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Хинт любой формы

01.01.2007

Borland Delphi 4, Руководство разработчика", К. Пачеко и С.

Тейксер

З.Ы. Пристегните (uses CoolHint) к любой форме с hint'ами и любуйтесь

подсказками.

unit CoolHint 
 
interface 
 
uses Windows, Classes, Controls, Forms, Messages, Graphics 
type 
TddgHintWindow = class(THintWindow) 
private 
  FRegion: THandle 
  procedure FreeCurrentRegion 
public 
  destructor Destroy override 
  procedure ActivateHint(Rect: TRect const AHint: string);override ;
  procedure Paint; override ;
  procedure CreateParams(var Params: TCreateParams); override ;
end 
 
implementation 
 
destructor TddgHintWindow.Destroy 
begin 
FreeCurrentRegion; 
inherited Destroy; 
end 
 
procedure TddgHintWindow.CreateParams(var Params: TCreateParams) 
{ We need to remove the border created on the Windows API-level } 
{ when the window is created. } 
begin 
inherited CreateParams(Params) ;
Params.Style := Params.Style and not ws_Border // remove border ;
end;
 
procedure TddgHintWindow.FreeCurrentRegion 
{ Regions, like other API objects, should be freed when you are } 
{ through using them. Note, however, that you cannot delete a } 
{ region which is currently set in a window, so this method sets } 
{ the window region to 0 before deleting the region object. } 
begin 
if FRegion <>0 then 
begin // if Region is alive... 
SetWindowRgn(Handle, 0, True) // set win region to 0 
DeleteObject(FRegion) // FRegion := 0 // zero out field 
end 
end 
 
procedure TddgHintWindow.ActivateHint(Rect: TRect const AHint: string); 
{ Called when the hint is activated by putting the mouse pointer } 
{ above a control. } 
begin 
with Rect do 
Right := Right + Canvas.TextWidth('WWWW') // add some slop 
BoundsRect := Rect 
FreeCurrentRegion 
with BoundsRect do 
{ Create a round rectangular region to display the hint window } 
FRegion := CreateRoundRectRgn(0, 0, Width, Height, Width, Height) 
if FRegion <>0 then 
SetWindowRgn(Handle, FRegion, True) // set win region 
inherited ActivateHint(Rect, AHint) // call inherited 
end 
procedure TddgHintWindow.Paint 
{ This method gets called by the WM_PAINT handler. It is } 
{ responsible for painting the hint window. } 
var R: TRect 
begin 
R := ClientRect // get bounding rectangle 
Inc(R.Left, 1) // move left side slightly 
Canvas.Font.Color := clInfoText // set to proper color 
{ paint string in the center of the round rect } 
DrawText(Canvas.Handle, PChar(Caption), Length(Caption), R, 
DT_NOPREFIX or DT_WORDBREAK or DT_CENTER or DT_VCENTER) 
end 
 
var 
OldHintClass: THintWindowClass 
 
function SetNewHintClass(AClass: THintWindowClass): THintWindowClass 
var 
DoShowHint: Boolean 
begin 
Result := HintWindowClass // return value is old hint 
window 
DoShowHint := Application.ShowHint 
if DoShowHint then 
Application.ShowHint := False // destroy old hint window 
HintWindowClass := AClass // assign new hint window 
if DoShowHint then 
Application.ShowHint := True // create new hint window 
end 
initialization 
OldHintClass := SetNewHintClass(TddgHintWindow) 
finalization 
SetNewHintClass(OldHintClass) 
end.

Взято с сайта https://blackman.wp-club.net/