ヘッダー
C# サンプル集
 

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

2022/2/6

→ Visual Basic のサンプルに切り替える

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

 

 

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

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

var timer = new System.Windows.Forms.Timer();
timer.Interval = 1; //1回目のTickイベントはすぐ発生させる。

int count = 0;
Cursor[] frames = new Cursor[2]; //1度描画した内容を保存しておく配列
object id = new object(); //ここで生成したカーソルを識別するための目印用オブジェクト

timer.Tick += 
    (object? tSender, EventArgs tArgs) =>
    {
        var tTimer = (System.Windows.Forms.Timer)tSender!;

        if (tTimer.Interval > 1 && this.Cursor.Tag != id)
        {
            //2回目以降で現在のマウスカーソルに目印がない場合、
            //別の場所でマウスカーソルが変更されたことを意味するのでこのアニメーションは終了する。
            tTimer.Enabled = false;
            return;
        }

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

        if (frames[count] is null)
        {
            //まだこのcountに対するカーソルが生成されていない場合、カーソルを描画する
            using (var bmp = new Bitmap(32, 32))
            using (var g = Graphics.FromImage(bmp))
            {
                if (count == 0)
                {
                    g.FillEllipse(Brushes.Red, 0, 8, 32, 24); //楕円を描画
                }
                else if (count == 1)
                {
                    g.FillEllipse(Brushes.Red, 0, 0, 32, 32); //正円を描画  
                }

                //マウスカーソルの生成。Tagプロパティには目印を付けておく。
                frames[count] = new Cursor(bmp.GetHicon()) {Tag = id};
            }
        }

        //実際にマウスカーソルを変更する
        this.Cursor = frames[count];

        count += 1;
        if (count == 2)
        {
            count = 0;
        }
    };

timer.Enabled = true;

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

 

 

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

var timer = new System.Windows.Forms.Timer();
timer.Interval = 1; //1回目のTickイベントはすぐ発生させる。

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

timer.Tick += 
    (object? tSender, EventArgs tArgs) =>
    {
        var tTimer = (System.Windows.Forms.Timer)tSender!;

        if (tTimer.Interval > 1 && this.Cursor.Tag != id)
        {
            //2回目以降で現在のマウスカーソルに目印がない場合、
            //別の場所でマウスカーソルが変更されたことを意味するのでこのアニメーションは終了する。
            tTimer.Enabled = false;
            return;
        }

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

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

            using (var bmp = new Bitmap(64, 64))
            using (var g = 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()) {Tag = id});
            }
        }

        //実際にマウスカーソルを変更する
        this.Cursor = frames[start];

        start += stepValue;
        if (start >= 360)
        {
            start = 0;
        }
    };

timer.Enabled = true;

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

 

 

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

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

var timer = new System.Windows.Forms.Timer();
timer.Interval = 1; //1回目のTickイベントはすぐ発生させる。

int count = 5;
var cursorFont = new Font(this.Font.FontFamily, 58.0F, GraphicsUnit.Pixel);
object id = new object(); //ここで生成したカーソルを識別するための目印用オブジェクト

timer.Tick += 
    (object? tSender, EventArgs tArgs) =>
    {
        var tTimer = (System.Windows.Forms.Timer)tSender!;

        if (tTimer.Interval > 1 && this.Cursor.Tag != id)
        {
            //2回目以降で現在のマウスカーソルに目印がない場合、
            //別の場所でマウスカーソルが変更されたことを意味するのでこのアニメーションは終了する。
            tTimer.Enabled = false;
            return;
        }

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

        using (var bmp = new Bitmap(64, 64))
        using (var g = Graphics.FromImage(bmp))
        {
            //countの値の数字を描画する
            g.DrawString(count.ToString(), cursorFont, Brushes.Red, 0, 0);

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

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

        count -= 1;
    };

timer.Enabled = true;

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