マウスオーバー時に画像がホップアップしプレビューできるアプリケーションを作ろうと思い、ToolTipで検索してみたが、.NetFramework2.0では相応な機能がないのでユーザーコントロールで実装することにした。
"Tooltip image"で検索するとすでに実装したソースを載せたサイトを見つけたので、C#からVBに書き直しただけですんだ。まだ動作が不安定なので改善の余地ありなメモ書き。
サンプルソース
Public Class CToolTip : Inherits UserControl ' メンバ変数 Private _img As Image '画像を保持 Private _ctl As Control '親コントロールを保持 いらないかも Private _timer As Timer 'このコントロールの表示させる時間をカウント ' 表示する画像を取得・設定 Public Property ImageFile() As Image Get Return _img End Get Set(ByVal value As Image) If value IsNot Nothing Then _img = value ' 画像サイズを自身のサイズに設定 ' 画像が大きすぎる場合は1/2に 要修正 If _img.Size.Width > 320 Then Me.Size = New Size(_img.Width / 2, _img.Height / 2) Else Me.Size = _img.Size End If End If End Set End Property ' コンストラクタ Public Sub New() ' 表示位置を初期化 Me.Location = New Point(0, 0) ' 非表示に Me.Visible = False ' タイマー起動 _timer = New Timer() ' 表示期間を1秒に _timer.Interval = 1000 ' タイマーイベントをセット AddHandler _timer.Tick, AddressOf ShowTipOff End Sub Public Sub SetToolTip(ByVal ctl As Control) ' 親コントロールを取得 _ctl = ctl ' 親コントロールの親に自身をセット ctl.Parent.Controls.Add(Me) ' インデックスを0に設定 ctl.Parent.Controls.SetChildIndex(Me, 0) ' 親コントロールのマウス移動イベントにセット AddHandler ctl.MouseMove, AddressOf ShowTipOn End Sub Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs) ' 自身のOnPaint関数に画像を描画させるソースを追加 If _img IsNot Nothing Then e.Graphics.DrawImage(_img, 0, 0) End If End Sub Public Sub ShowTipOn(ByVal sender As Object, ByVal e As MouseEventArgs) ' 自身が非表示の場合実行 If Me.Visible = False Then ' タイマーを起動 _timer.Start() ' 自身の位置を親コントロールの座標よりマウス座標を加算した位置に設定 Me.Left = _ctl.Left + e.X Me.Top = _ctl.Top + e.Y ' 自身を表示 Me.Visible = True End If End Sub Public Sub ShowTipOff(ByVal sender As Object, ByVal e As EventArgs) ' タイマーを停止 _timer.Stop() ' 自身を非表示に Me.Visible = False End Sub End Class
また今回はテキストを表示させる予定がなかったので、その辺は割愛させて貰った。さらに元ソースではファイルパスを設定し、パスから画像を取得していたが、ここもImageオブジェクトで直に渡せるように修正。
この方法だと、親コントロールの親からはみ出した領域が表示できないので改善の余地あり。また、描写の最適化も行っていないので少々カクつくのも難点。
いつか改善できたらいいなと思い二度と触らない気がするのはいつもの事です。
使う時はこんな感じで。
' インスタンス作成 Dim tt As New CToolTip ' 画像を設定 tt.ImageFile = Image.FromFile("C:\test.jpg") ' ToolTipを表示させるコントロールを設定 tt.SetToolTip(Me)
実行イメージ