ToolTipのバルーンをコントロール以外の図形に表示する

.NetのバルーンツールはToolTipだが、コントロールではないオブジェクト、例えば自作の図形に適用するには、少々細工が必要だ。
バルーンを表示するタイミングはMouseMoveイベントで自作図形の範囲にマウスが侵入する時だろう。

private void MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) {
  System.Drawing.Point pt = new System.Drawing.Point(e.X, e.Y);
  Rectangle rect = myShape.GetExtent();
  if(rect.Contains(pt)) {
    toolTip.Show("こんにちは、図形!", pt, 3000); // 3秒間バルーン表示
  }
}

myShapeは自作図形、GetExtentは図形の存在領域を物理単位で返す関数、toolTipは.netのToolTipコントロールだ。
これを実行してみる。
自作図形の上にマウスを置くと、バルーン「こんにちは、図形!」が表示されるが、チラつきが激しい。
美しくない。
MouseMove発生毎にtoolTip.Showが呼ばれるのがチラつきの原因だろう。
ToolTipコントロールがバルーン表示中に呼ばれるShowを無視してくれることを期待したが、甘かった。
ここは表示制御が必要のようだ。

バルーン表示直後に表示中フラグを設け、Timerイベントのハンドラでこれをクリアする。
このロジックでバルーン表示中のShow呼び出しを抑制してみよう。

bool balloonDisplay = false;
private void MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) {
  System.Drawing.Point pt = new System.Drawing.Point(e.X, e.Y);
  Rectangle rect = myShape.GetExtent();
  if(!balloonDisplay && rect.Contains(pt)) {
    toolTip.Show("こんにちは、図形!", pt, 3000); // 3秒間バルーン表示
    balloonDisplay = true;
    Timer timer = new Timer();
    timer.Tick += new EventHandler(ClearEvent);
    timer.Interval = 5000; // 5秒後にバルーン表示抑制解除
    timer.Start();
  }
}
private void ClearEvent(object sender, EventArgs e) {
  ((Timer)sender).Stop();
  balloonDisplay = false;
}

バルーン表示時間と抑制解除の時間は適宜変更するとよい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です