ヘッダー
Visual Basic サンプル集
VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 VB2022対応

マウスカーソルを動的にアニメーションさせる

2022/2/6

→ C# のサンプルに切り替える

この記事は Windows フォーム アプリ を対象にしています。

 

 

マウスカーソルを円が歪む単純なアニメーションにする

0.4秒ごとに楕円と正円を交互にマウスカーソルに描画することで、円がぺこぺこするアニメーションにします。

VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 VB2022対応

Dim timer As New Timer
timer.Interval = 1 '1回目のTickイベントはすぐ発生させる。

Dim count As Integer = 0
Dim frames(1) As Cursor '1度描画した内容を保存しておく配列
Dim id As New Object 'ここで生成したカーソルを識別するための目印用オブジェクト

AddHandler timer.Tick,
    Sub(tSender As Object, tArgs As EventArgs)
        Dim tTimer As Timer = DirectCast(tSender, Timer)

        If tTimer.Interval > 1 AndAlso Me.Cursor.Tag IsNot id Then
            '2回目以降で現在のマウスカーソルに目印がない場合、
            '別の場所でマウスカーソルが変更されたことを意味するのでこのアニメーションは終了する。
            tTimer.Enabled = False
            Return
        End If

        tTimer.Interval = 400 '次回0.4秒後にTickイベントを発生させる

        If frames(count) Is Nothing Then
            'まだこのcountに対するカーソルが生成されていない場合、カーソルを描画する
            Using bmp As New Bitmap(32, 32), g As Graphics = Graphics.FromImage(bmp)
                If count = 0 Then
                    g.FillEllipse(Brushes.Red, 0, 8, 32, 24) '楕円を描画
                ElseIf count = 1 Then
                    g.FillEllipse(Brushes.Red, 0, 0, 32, 32) '正円を描画
                End If  

                'マウスカーソルの生成。Tagプロパティには目印を付けておく。
                frames(count) = New Cursor(bmp.GetHicon) With {.Tag = id}
            End Using
        End If

        '実際にマウスカーソルを変更する
        Me.Cursor = frames(count)

        count += 1
        If count = 2 Then
            count = 0
        End If

    End Sub

timer.Enabled = True

メモ:通常のマウスカーソルに戻す方法は、Me.Cursor = Cursors.Default です。

 

 

マウスカーソルを扇型がぐるぐる回るアニメーションにする

VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 VB2022対応

Dim timer As New Timer
timer.Interval = 1 '1回目のTickイベントはすぐ発生させる。

Dim start As Integer = 0 '扇型の描画開始角度
Dim stepValue As Integer = 360 \ 30 '1フレーム当たりの回転角度
Dim frames As New Dictionary(Of Integer, Cursor) '1度描画した内容を保存しておくコレクション
Dim id As New Object 'ここで生成したカーソルを識別するための目印用オブジェクト

AddHandler timer.Tick,
    Sub(tSender As Object, tArgs As EventArgs)
        Dim tTimer As Timer = DirectCast(tSender, Timer)

        If tTimer.Interval > 1 AndAlso Me.Cursor.Tag IsNot id Then
            '2回目以降で現在のマウスカーソルに目印がない場合、
            '別の場所でマウスカーソルが変更されたことを意味するのでこのアニメーションは終了する。
            tTimer.Enabled = False
            Return
        End If

        tTimer.Interval = 40 '次回0.04秒後にTickイベントを発生させる

        If frames.ContainsKey(start) = False Then
            'まだこのcountに対するカーソルが生成されていない場合、カーソルを描画する

            Using bmp As New Bitmap(64, 64), g As Graphics = Graphics.FromImage(bmp)
                '中心角100度の扇型を描画。
                '開始位置をstart度にすることでstartの変化に伴い扇が移動するように見える。
                g.FillPie(Brushes.DarkRed, 0, 0, 64, 64, start, 100)

                '描画した内容をカーソル化してDictionaryに保存。
                'これにより同じstartの値のときは再描画せず保存されたカーソルを使用する。
                '(周期的に同じ画像を描画するのはCPUがもったいないので。)
                'カーソルのTagプロパティには目印を付けておく。
                frames.Add(start, New Cursor(bmp.GetHicon) With {.Tag = id})
            End Using
        End If

        '実際にマウスカーソルを変更する
        Me.Cursor = frames(start)

        start += stepValue
        If start >= 360 Then
            start = 0
        End If

    End Sub

timer.Enabled = True

メモ:通常のマウスカーソルに戻す方法は、Me.Cursor = Cursors.Default です。

 

 

マウスカーソルを5,4,3,2,1とカウントダウンするアニメーションにする

この例を実行するとマウスカーソルが「5」になり1秒ごとにカウントダウンします。0になると「ゼロになりました!」とメッセージを表示し通常のカーソルに戻します。

VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応 VB2022対応

Dim timer As New Timer
timer.Interval = 1 '1回目のTickイベントはすぐ発生させる。

Dim count As Integer = 5
Dim cursorFont As New Font(Me.Font.FontFamily, 58.0F, GraphicsUnit.Pixel)
Dim id As New Object 'ここで生成したカーソルを識別するための目印用オブジェクト

AddHandler timer.Tick,
    Sub(tSender As Object, tArgs As EventArgs)
        Dim tTimer As Timer = DirectCast(tSender, Timer)

        If tTimer.Interval > 1 AndAlso Me.Cursor.Tag IsNot id Then
            '2回目以降で現在のマウスカーソルに目印がない場合、
            '別の場所でマウスカーソルが変更されたことを意味するのでこのアニメーションは終了する。
            tTimer.Enabled = False
            Return
        End If

        tTimer.Interval = 1000 '1秒ごとにマウスカーソルを置き換える。

        Using bmp As New Bitmap(64, 64), g As Graphics = Graphics.FromImage(bmp)
            'countの値の数字を描画する
            g.DrawString(count.ToString, cursorFont, Brushes.Red, 0, 0)

            'マウスカーソルを生成して置き換える。
            'カーソルのTagプロパティには目印を付けておく。
            Me.Cursor = New Cursor(bmp.GetHicon) With {.Tag = id}
        End Using

        If count = 0 Then
            'ゼロを描画したらtimerを停止し、メッセージを表示する。
            'この部分を置き換えて任意の処理を実行させてください。
            timer.Enabled = False
            MsgBox("ゼロになりました!")
            Me.Cursor = Cursors.Default '通常のカーソルに戻す
        End If

        count -= 1

    End Sub

timer.Enabled = True

メモ:カウントダウンを中止して通常のマウスカーソルに戻す方法は、Me.Cursor = Cursors.Default です。