ぽんこつプログラマーの日々のまとめ
12110801

マウスオーバー時に画像がホップアップしプレビューできるアプリケーションを作ろうと思い、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)

実行イメージ

12110800

Add Comments

名前
 
  絵文字
 
 
webmaster

Redmusk

最西端の地で釣りとギターとゲームをこよなく愛する本業ぽんこつプログラマー。今を生きるを座右の銘とし日々快楽だけを求め切磋琢磨しております。

soundcloud