.NET TIPS

マウス・カーソルの移動可能領域を制限するには?

デジタルアドバンテージ 一色 政彦
2005/12/16

 Windowsアプリケーションでマウス・カーソルが移動できる領域を制限したい場合、Cursorクラス(System.Windows.Forms名前空間)の静的プロパティであるClipプロパティに、その制限領域を指定すればよい。

 なおこのClipプロパティには、スクリーン座標系のRectangle型の値で指定する必要がある(スクリーン座標系の値については、「TIPS:スクリーン座標←→クライアント座標の変換を行うには?」を参照されたい)。

マウス・カーソルの移動範囲を制限する方法

 例えば、何らかのボタンがクリックされたときにマウス・カーソルの移動範囲を制限したいならば、そのボタンのClickイベント・ハンドラ内で、次の例1(C#)のようにCursor.Clipプロパティを設定すればよい(なおこの例では、X座標「100」、Y座標「200」の点から横幅「300」、縦幅「300」の四角い領域を指定している)。

例1:Cursor.Clip = new Rectangle(100, 200, 300, 300);

 しかしCursor.Clipプロパティには使用上の注意点がある。アプリケーション起動直後から移動範囲を制限しようとして、Cursor.ClipプロパティをLoadイベント・ハンドラ内で指定しても利かないのだ。

フォーム表示直後にマウス・カーソルの移動範囲を制限するには?

 それではWindowsアプリケーションが起動してフォームが表示(=Load)された直後に、マウス・カーソルの移動範囲を制限するにはどうすればよいのだろうか? これを実現するためのベスト・タイミングはフォームのActivatedイベントである。これはフォームがアクティブ化されたとき(具体的には、フォームが表示されてアクティブになったときや、アクティブなウィンドウを切り替えた後で再度アクティブになったとき)に呼ばれるイベントだ。

 次のサンプル・プログラムでは、フォームのActivatedイベント・ハンドラで、マウス・カーソルの移動範囲を、フォームのウィンドウ領域のサイズに制限している。なおウィンドウ領域の取得については「TIPS:クライアント領域やウィンドウ領域の座標を取得するには?」を参照してほしい。このフォームのウィンドウ領域(Bounds)はスクリーン座標で取得できるので、クライアント座標とスクリーン座標間の変換は必要ない。

private void Form1_Activated(object sender, System.EventArgs e)
{
  Rectangle limitRect = this.Bounds;
  Cursor.Clip = limitRect;
}
Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Activated
  Dim limitRect As Rectangle = Me.Bounds
  Cursor.Clip = limitRect
End Sub
マウス・カーソルの移動可能領域を制限するサンプル・プログラム(上:C#、下:VB.NET)
フォームがアクティブになったときにマウス・カーソルの移動範囲を制限するには、フォームのActivatedイベント・ハンドラにそれを実装すればよい。

 以上でマウス・カーソルの移動範囲の制限は完了だ。それでは逆に、この制限を解除するにはどうすればよいのだろうか?

マウス・カーソルの移動範囲制限を解除するには?

 これを行うには、次の例2のようにCursor.ClipプロパティにRectangle型の「空」の値を指定すればよい。このRectangle型の「空」の値としては、Rectangle構造体(System.Drawing名前空間)の静的フィールドであるEmptyフィールドを利用する。

例2:Cursor.Clip = Rectangle.Empty;

 前述のように、フォームがアクティブになったときにマウス・カーソルの移動範囲を制限するようにした場合、逆にフォームが非アクティブになったときに(つまりほかのウィンドウがアクティブになったときに)マウス・カーソルの移動制限を解除するとよい。

 こうすることによって、ほかのアプリケーションをアクティブにした場合に再びマウス・カーソルが自由な範囲で使えるように戻るからだ。例えばWindowsアプリケーションの実行中にInternet Explorer(以降、IE)をアクティブにした場合に(=フォームが非アクティブになった場合に)、IE上では再びマウス・カーソルが自由に使える。そしてWindowsアプリケーションのフォームを再度アクティブにすると、Activatedイベントが発生して再びマウス・カーソルの移動範囲が制限される。

 フォームが非アクティブになるタイミングで発生するのが、フォームのDeactivateイベントである。次のサンプル・コードでは、フォームのDeactivateイベント・ハンドラ内でマウス・カーソルの移動制限を解除している。

private void Form1_Deactivate(object sender, System.EventArgs e)
{
  Cursor.Clip = Rectangle.Empty;
}
Private Sub Form1_Deactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Deactivate
  Cursor.Clip = Rectangle.Empty
End Sub
マウス・カーソルの移動制限を解除するサンプル・プログラム(上:C#、下:VB.NET)
フォームが非アクティブになったときにマウス・カーソルの移動制限を解除するには、フォームのDeactivateイベント・ハンドラにそれを実装すればよい。

 マウス・カーソルの移動範囲を制限した場合、極力、Deactivateイベント・ハンドラに移動制限の解除を実装することが望ましい。ここでもし移動制限を解除しないと、ほかのアプリケーションをアクティブにしてもマウス・カーソルの移動範囲は限られたままになってしまう。要するに、ほかのアプリケーションに「マウス・カーソルが一部の領域でしか動かない」という迷惑が掛かってしまうのだ。

 なおマウス・カーソルの移動範囲の制限は、ウィンドウを移動したり、サイズ変更したり、最小化したりすることによっても、自動的に解除されてしまうので、注意してほしい。End of Article

カテゴリ:Windowsフォーム 処理対象:カーソル
使用ライブラリ:Cursorクラス(System.Windows.Forms名前空間)
使用ライブラリ:Rectangle構造体(System.Drawing名前空間)
関連TIPS:スクリーン座標←→クライアント座標の変換を行うには?
関連TIPS:クライアント領域やウィンドウ領域の座標を取得するには?

この記事と関連性の高い別の.NET TIPS
マウス・カーソルを非表示にするには?
スクリーン座標←→クライアント座標の変換を行うには?
ある座標や領域がコントロールの領域内に含まれているかを確認するには?
クライアント領域やウィンドウ領域の座標を取得するには?
マウス・カーソルの位置を取得・設定するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間