C# サンプル集 |
Visual Basic 中学校 > C# サンプル集 > C# サンプル集目次 > Windows フォーム >
マウスカーソルを動的にアニメーションさせる
2022/2/6
この記事は 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; です。