こんな経験をした
Cursor.Show()で表示でCursor.Hide()で非表示か。
カタカタカタ
あれ、カーソル表示・非表示繰り返してたら何故か上手く表示・非表示の制御できなくなった。。。
このイベント(Loadイベント等)で非表示しても効果なし?
ひとまず、いろんなところでHideを実行。
あれ、Showしてもカーソル全然出てこない。。。
原因
実は、 Cursor.Show()・Cursor.Hide()の効果は重ねられるようです。
Cursor.Hide メソッド (System.Windows.Forms) https://goo.gl/8m121H
Show メソッドおよび Hide メソッドの呼び出しは、均等化する必要があります。
つまり、Hideメソッドを二回実行したらShowメソッドを2回実行しないと表示されない。
HideとShowのそれぞれの実行回数が分からなくなると終わり。
しかも、HideとShowはCursorクラスの静的メソッドだから、アプリケーション全体で実行回数を監視しないと。。。それは面倒。
代用
Cursor.Show・Hideは使わない!!!
マウスカーソルを消したいForm(Control継承してればok)で下記を定義して
非表示したければHideCursor、表示したければShowCursorを実行。
これで均等化とはおさらば!
private void HideCursor()
{
// マウスカーソル用画像を作成
Bitmap bitmap = new Bitmap(1, 1);
Graphics g = Graphics.FromImage(bitmap);
g.FillRectangle(Brushes.Black, g.VisibleClipBounds);
g.Dispose();
bitmap.MakeTransparent();
// 作成した画像でCursorのインスタントを作成
IntPtr handle = bitmap.GetHicon();
var icon = Icon.FromHandle(handle);
var cursor = new Cursor(icon.Handle);
// セット
this.Cursor = cursor;
}
private void ShowCursor()
{
// デフォ値にセット
this.Cursor = Cursors.Default;
}
最後に
・本当は、this.CursorではなくてCursor.Currentにセットしたかったけど何故か変わらない。。。
・ライブラリ化、拡張メソッド化はご自由に。