DOBON.NET DOBON.NETプログラミング掲示板過去ログ

マウスポインタの位置の取得について

環境/言語:[VisualBasic2008]
分類:[.NET]

はじめまして。
ネットで探しても分からなかったので、投稿致します。

マウスポインタの位置をコントロールの座標で取得する際に、
値をsingle型で取得したいのですが、方法が分かりません。

なお、やりたいことは、
例えば、pictureboxに描画した四角形にマウスを持って行った時、その座標を取得したいのです。
その四角形を描写する際の座標は、single型で指定したので、マウスを持ってきた時も
同様のsingle型で取得したいという訳です。

以上、お手数ですが、ご教示よろしくお願いいたします。
もしマウスポインタの位置がInteger型で取得できているのでしたら、特に何も意識することなくそのまま使っても、Single型に変更されると思います。例えば、次のような感じです。

Dim p As Point = Control.MousePosition
Dim x As Single = p.X

詳しくは、

ある型の値を別の型に変換(キャスト)する
http://dobon.net/vb/dotnet/beginner/cast.html

をご覧ください。
> 管理人様

ご返信ありがとうございます。
初投稿でしたので、返信を頂けて、非常にありがたいです。

ただ、恐縮ですが、もう少しご教示願います。
説明不足でした。大変申し訳ありません。


確かに、
Dim p As Point = Control.MousePosition
Dim x As Single = p.X

以上で、変数xは、single型となり、p.Xも例えば、csng(p.X)
でsingle型になりますが、MousePositionの型定義を見ましたが、
Xは、integer型でしたので、小数点以下の情報がありません。

取得したいのは、マウスの小数点以下を含めた座標値です。

つまり、
マウス座標値取得(integer)→マウス座標値を変数に代入&型変換(single)
では、なく
マウス座標値取得(single)→マウス座標値を変数に代入(single)
という事です。

説明で、不明点ありましたら、ご指摘下さい。

以上、お手数ですが、よろしくお願いします。
> 取得したいのは、マウスの小数点以下を含めた座標値です。
そんなもんありません。常に .0 です。
微妙に読みづらくなっちゃった。
小数点以下の値は存在しません。常に小数点以下はゼロです。
> Hongliangさま

ご返信ありがとうございまず。

度々質問ですが、
・他の方法で、マウスポインタの座標値の小数点以下を取得する方法は、ありますか?
・それとも、VB.NET系で、マウスポインタの座標値小数点以下を取得する事は、不可能でしょうか?
 (そもそもマウスの座標は、ピクセル単位により少数以下は、ないということでしょうか?)

RectangleF()などでは、X座標の指定が、single型で小数点以下も指定できましたので、
マウスポインタの座標も同様に小数点以下も取得したかったのですが、
マウスの座標系は、別次元で考えろということですかね・・・。
ご質問の意味がよく分からなくなってきたのですが、もしかしたらピクセル単位以外の単位で取得したいということでしょうか?もしそうであれば、

単位を変更して描画する
http://dobon.net/vb/dotnet/graphics/pageunit.html

が参考になると思います。
■No25272に返信(オーマさんの記事)
> 度々質問ですが、
> ・他の方法で、マウスポインタの座標値の小数点以下を取得する方法は、ありますか?
> ・それとも、VB.NET系で、マウスポインタの座標値小数点以下を取得する事は、不可能でしょうか?
>  (そもそもマウスの座標は、ピクセル単位により少数以下は、ないということでしょうか?)
マウスの入力に関しては、VB.NETに限らず、Windowsでは整数(ピクセル)単位でしか扱われていません。従って、どのような方法でも小数点以下の値は得られません。

描画の際に小数を指定できるのは、変換行列で拡大・縮小等もできることから、計算過程で意味があるからではないでしょうか?
> 管理人様
> Azulean様

ご返信、ありがとうございます。

> マウスの入力に関しては、VB.NETに限らず、Windowsでは整数(ピクセル)単位でしか扱われていません。
> 従って、どのような方法でも小数点以下の値は得られません。

マウス座標の小数点以下の値を、取得しようとしていましたが、そもそも出来ない事だったのですね。
そういう訳で本投稿は、締めさせて頂きます。

ご返信して下さった皆様、ありがとうございました。
解決済み!
2009/08/23(Sun) 15:49:33 編集(投稿者)

■No25276に返信(オーマさんの記事)
> マウス座標の小数点以下の値を、取得しようとしていましたが、そもそも出来ない事だったのですね。

Microsoft.DirectX.DirectInput 名前空間を用いることで、
画面上の 1 ピクセルに満たない、微細なマウス移動を検知する事ができます。
http://www.geocities.co.jp/SiliconValley/7406/tips/mouse/mouse3.html
http://wlog.flatlib.jp/item/1310

ただし DirectInput から得られる値は、“現在の座標位置”では無く、
“前回のマウス位置からの移動量”に過ぎないので、これ単体では、
小数以下のマウス座標を得るには至りません。

Control.MousePosition と組み合わせれば、厳密な小数点座標では無いにしろ、
それっぽい値を得ることは出来るかもしれませんが……いずれにせよ今回は、
マウス座標を小数点以下の単位まで求めても、あまり意味が無いように思えます。

通常、画面上の 1 ピクセル単位の描画処理ができれば充分では無いでしょうか。

もしも 1 ピクセル未満の座標位置に描画する必要があったとしても、そこまで緻密な
マウス捌きをユーザーに求めてしまうと、操作しにくくなってしまうかと思います。

それならばむしろ、描画時に拡大表示させるような補助機能などを設けた方が、
ユーザー側には使いやすくなるかと思いますよ。
解決済み!
魔界の仮面弁士様

> もしも 1 ピクセル未満の座標位置に描画する必要があったとしても、そこまで緻密な
> マウス捌きをユーザーに求めてしまうと、操作しにくくなってしまうかと思います。
> それならばむしろ、描画時に拡大表示させるような補助機能などを設けた方が、
> ユーザー側には使いやすくなるかと思いますよ。

仰る通りですね。ユーザーに使いにくいアプリケーションになりつつありました。
描画時の処理を変更しようと思います。

> Microsoft.DirectX.DirectInput 名前空間を用いることで、
> 画面上の 1 ピクセルに満たない、微細なマウス移動を検知する事ができます。
> http://www.geocities.co.jp/SiliconValley/7406/tips/mouse/mouse3.html
> http://wlog.flatlib.jp/item/1310

ただ、ご教示のDirectInput 名前空間は、学習のために、
一度使ってみます。


解決済みフラグを立てたにも関わらず、ご返信ありがとうございまず。
また、ご返信をして下さった皆様、ありがとうございました。
解決済み!
2009/08/23(Sun) 19:27:45 編集(投稿者)

■No25277に返信(魔界の仮面弁士さんの記事)
> Microsoft.DirectX.DirectInput 名前空間を用いることで、
DirectInput は細かい入力を取れるんですね。ないと断言してしまい、申し訳ありません。

1 点気になるとすれば、Managed DirectX は現在も利用できますが、既にサポート外と明言されていることです。
利用される場合はそのことも念頭に置きましょう。

http://blogs.msdn.com/windows_multimedia_jp/archive/2009/03/03/9456151.aspx
> Managed DirectX
> 代替案として、 オープンソースの SlimDX をご紹介しています。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板