2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Form上でマウスカーソルを表示・非表示。Cursor.Hide()・Show()の罠

Posted at

こんな経験をした

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にセットしたかったけど何故か変わらない。。。
・ライブラリ化、拡張メソッド化はご自由に。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?