JVCLのTJvBalloonHintを使う

QC#66768によると、TBallonHintは任意の位置にバルーンヒントを表示できないっぽい*1ので、代替としてJVCLのTJvBalloonHintを使ってみる。

TJvBalloonHintはTBallonHintをJVCLが拡張したコンポーネントでは無いので、使い方が根本的に違う。あと、現時点での最新版である3.40では、Windows 7でビジュアルスタイルが有効な場合でヒントが表示されないバグがあるので、$(JVCL)\run\JvBalloonHint.pasをSVNリポジトリの最新版と差し替える必要がある。
使い方は単純でツールパレットのJv Non-VisualにあるTJvBalloonHintをフォームに貼り、ActivateHintを呼び出すだけ。ヒントの表示はActivateHintの他にActivateHintPos、ActivateHintRectがあるので、用途によって使い分けられる。以下は、ActivateHintPosの例。

// ポップアップの表示位置を計算
TForm* pMainForm = Application->MainForm;
TControl* pControl = pMainForm->ActiveControl;
TRect R = pControl->ClientRect;
TPoint P = TPoint(R.Left + R.Width() / 2, R.Bottom);
P = pControl->ClientToScreen(P);
P = pMainForm->ScreenToClient(P);

// ヒント文字列の生成(HTMLタグの除去)
UnicodeString Hint = HTMLPrepareText(pControl->Hint);
Hint = AnsiReplaceText(Hint, L"<html>", UnicodeString());
Hint = AnsiReplaceText(Hint, L"</html>", UnicodeString());

// ヒントの表示
JvBalloonHint1->ActivateHintPos(pMainForm, P,  Key, Hint);

表示結果はこんな感じ。

11/05/26 追記:
ShowHintは問題なく動作。ShowHintの座標系はスクリーン座標系なので、ClientToSceenで変換してやること。*2

*1:ShowHintメソッドとかあるんだけどね…

*2:でもなぁ、フォームに貼れば座標系はフォームの座標系と思っちゃうし、ヘルプにはなんの記述もないし…。