ヒントの内容をHTML形式で定義して表示する

通常のポップアップヒントでは出来ない強調表示や文字の色変えをHTMLで定義して描画してみる。ただ、ポップアップヒントを表示する目的だけでIEコンポーネントGeckoを使うのはヘビーなので、JVCLが用意してくれている簡易HTMLレンダリングルーチンを使用。これは、TJvHTLabelやTJvHTButtonなどでも使われている。

まずは、標準のヒントウインドウを継承したサブクラスを定義する。

class THtmlHintWindow : public THintWindow
{
public:
  __fastcall THtmlHintWindow(TComponent* AOwner) :
    THintWindow(AOwner)
  {
  }
  void __fastcall Paint(void);
  TRect __fastcall CalcHintRect(int MaxWidth, const UnicodeString AHint, void * AData);
};

オーバーライドする必要があるのは、描画を行うPaintと描画領域を計算するCalcHintRect。

まず、描画領域の計算。JVCLのHTMLTextExtent関数を使用する。HTMLで記述された文字列を渡すと描画領域を計算してくれる。

TRect __fastcall TfrmMain::THtmlHintWindow::CalcHintRect(int MaxWidth, const UnicodeString AHint, void * AData)
{
  TRect R(0,0,0,0);
  TSize S = HTMLTextExtent(Canvas, R, TOwnerDrawState(), AHint, 100);
  
  return TRect(2, 2, S.cx + 8, S.cy + 2);
}

実際に描画するのはPaint関数で行う。HTMLDrawTextはTCanvasにHTMLをレンダリングして描画する関数。

void __fastcall TfrmMain::THtmlHintWindow::Paint(void)
{
  TRect R(2, 2, Width, Height);
  HTMLDrawText(Canvas, R, TOwnerDrawState(), Caption, 100);
}

逆にHTMLタグを除去してくれるのがHTMLPrepareText関数。ただし、全部はやってくれないので、一部は自前で行う必要がある。

オリジナルのポップアップヒントと差し替えるには、メインフォームのコンストラクタで、変数HintWindowClassに、差し替えるポップアップヒントクラスのメタクラス情報を代入する。

__fastcall TfrmMain::TfrmMain(TComponent* Owner)
  : TForm(Owner)
{
  HintWindowClass = __classid(THtmlHintWindow);
  Application->ShowHint = false;
  Application->ShowHint = true;
}

Application->ShowHintをfalse/trueにするのはおまじない。

以下の一覧は、JVCLのレンダリング関数が対応するタグ。

タグ 説明
<A></A> アンカー
<B></B> 太字
<I></I> イタリック
<U></U> 下線
<S></S> 取り消し線
<FONT></FONT> フォント
<HR> 水平線
<BR> 改行

属性

属性 説明
HREF リンク先
ALIGN 位置指定
COLOR 表示色。"clRED", "clGREEN", "clBLUE"といった TColorの定義も使用可能。
BGCOLOR 背景色
SIZE フォントサイズ
IND インデント量

HTMLの特殊文字

表記 文字
&gt; >
&lt; <
&amp; &
&quot; "
&reg; ®
&copy; ©
&trade;
&euro;
&nbsp; 空白

参考記事:http://mrxray.on.coocan.jp/Halbow/Notes/N018.html