7

C#コードでWM_NCHITTESTメッセージの座標を取得するにはどうすればよいですか?
パフォーマンスが要件であるため、最速の方法を取得したいと思います。

4

3 に答える 3

14

今朝まで、Thomas Levesques の回答に 100% 同意していました。msdn から同じ情報を取得したところ、コードは (一見) 完全に機能していました。しかし、これがあなたを噛むケースが 1 つあります。今日の午後、理由を見つけるのに 3 時間かかりました。

私が経験した症状は、私の開発マシンの 1 つで、VS2010 IDE 内で、特定の y 位置でクリックしたときに、クリックすることによってのみコントロールが選択可能になるということでした。フォームの上部にある非常に小さなコントロールは、クリックしてもまったく選択できませんでした。クリックできない領域のサイズは、Windows フォーム デザイナーを囲む IDE のサイズと同じに見えたので、最初はあまり知られていない奇妙な DesignMode の問題があると思いました。最も紛らわしい点は、まったく同じプロジェクト (別のマシンで TFS からチェックアウトしたもの) がこの動作を示さないことです。

何が起こるかは次のとおりです。

ここに示すように、ダブル モニターのセットアップがあるとします (ドイツ語のスクリーンショットで申し訳ありません。手元に英語の OS がありません)。

ダブルモニター設置

ご覧のとおり、モニター 2 の左上隅は座標 (1280, -256) にあります。上記の解決策を使用すると、マウスが実際に -30 の場合、65505 のような y が得られます。これは、位置がWORDLParam の上位および下位として格納されるためです。したがって、これを行う(lParam.ToInt32() & 0xFFFF0000) >> 16と、y 位置の正しいビットが得られます。ただし、これを int にキャストすると、間違ったデータ型にキャストしているため、65505 が返されます。

解決:

int x = (short)(lParam.ToInt32() & 0x0000FFFF);
int y = (short)((lParam.ToInt32() & 0xFFFF0000) >> 16);
Point pos = new Point(x, y);

にキャストするshortと、正しい位置の値が得られます。2番目のモニターがメインモニターの左にあるようにモニターを配置できるため、xの位置にも同じ問題が発生するため、xもキャストしました。

私は最近、意志の構築者の 1 人がPointあなたのために働くことを発見しました。したがって、短いバージョンは次のとおりです。

Point pos = new Point(lParam.ToInt32());
于 2011-06-17T16:16:15.047 に答える
12

MSDN から:

wParam
このパラメータは使用されません。

lParam
下位ワードは、カーソルの x 座標を指定します。座標は、画面の左上隅を基準にしています。
上位ワードは、カーソルの y 座標を指定します。座標は、画面の左上隅を基準にしています。

したがって、メッセージの から下位および上位の単語を抽出するだけで済みますlParam

int x = lParam.ToInt32() & 0x0000FFFF;
int y = (int)((lParam.ToInt32() & 0xFFFF0000) >> 16)
Point pos = new Point(x, y);

これらの操作はビットレベルの算術演算であるため、パフォーマンスについてはあまり心配しません...

これらの座標は画面に対する相対座標であることに注意してください。コントロール (またはフォーム) に相対的な座標が必要な場合は、次のPointToClientメソッドを使用できます。

Point relativePos = theControl.PointToClient(pos);
于 2010-12-17T14:16:35.950 に答える
9

私はこの質問がすでに回答されていることを知っていますが、すべて...

Point p = new Point(m.LParam.ToInt32());

System.Drawing.Point には、この正確な値を受け入れるように特別に設計されたコンストラクターが含まれるようになりました。厳密に言えば、これがおそらく最も簡単な方法だと思います。

正直なところ、他の回答が投稿されたときにこのコンストラクターが存在していたかどうかはわかりません。

とはいえ、takrl の答えはほぼ確実に前述のコンストラクターが内部で行うことであるため、これはおそらくこれ以上高速ではありません。

于 2014-11-29T21:22:17.987 に答える