|
.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)はスクリーン座標で取得できるので、クライアント座標とスクリーン座標間の変換は必要ない。
|
||
| マウス・カーソルの移動可能領域を制限するサンプル・プログラム(上: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イベント・ハンドラ内でマウス・カーソルの移動制限を解除している。
|
||
| マウス・カーソルの移動制限を解除するサンプル・プログラム(上:C#、下:VB.NET) | ||
| フォームが非アクティブになったときにマウス・カーソルの移動制限を解除するには、フォームのDeactivateイベント・ハンドラにそれを実装すればよい。 |
マウス・カーソルの移動範囲を制限した場合、極力、Deactivateイベント・ハンドラに移動制限の解除を実装することが望ましい。ここでもし移動制限を解除しないと、ほかのアプリケーションをアクティブにしてもマウス・カーソルの移動範囲は限られたままになってしまう。要するに、ほかのアプリケーションに「マウス・カーソルが一部の領域でしか動かない」という迷惑が掛かってしまうのだ。
なおマウス・カーソルの移動範囲の制限は、ウィンドウを移動したり、サイズ変更したり、最小化したりすることによっても、自動的に解除されてしまうので、注意してほしい。![]()
| カテゴリ:Windowsフォーム 処理対象:カーソル 使用ライブラリ:Cursorクラス(System.Windows.Forms名前空間) 使用ライブラリ:Rectangle構造体(System.Drawing名前空間) 関連TIPS:スクリーン座標←→クライアント座標の変換を行うには? 関連TIPS:クライアント領域やウィンドウ領域の座標を取得するには? |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


