0

Visual Studio 2008 (.NET 3.5) で C# を使用する。に探していSystem.Windows.Forms.MouseEventArgsます。

MouseMoveイベントのハンドルをインターセプトすると、長いパネルで奇妙な動作が見られます。MouseEventArgs.X0 から 32767 まで変化し、-32768 にラップします。

Visual Studio で変数を見ると、それが type であると主張していintます。

どうやら、動作している方法は16ビットの符号付き整数です。これは本当ですか?これは厳しい制限ですか?

ありがとう!

4

2 に答える 2

3

これはおそらく、Windows フォームが基本的に C Windows API の .NET ラッパーであるという事実によるものです。WM_MOUSEMOVEおよび関連メッセージ (WM_LBUTTONDOWN など) の場合、マウス座標は LPARAM パラメータで送信されます。LPARAM は LONG_PTR の typedef であり、32 ビット Windows (のみ) では long の typedef です。WM_MOUSEMOVE のドキュメントにあるように、GET_X_LPARAM マクロと GET_Y_LPARAM マクロを使用してカーソル位置を取得できます。これらはそれぞれ下位の int と上位の int を返します。

値は (32 ビット Windows 上で) 最初は 32 ビットであるため、これが意味を持つ唯一の方法は、x 座標と y 座標を実際に 16 ビット値にすることです。windowsx.h の GET_X_LPARAM の定義に基づいて、x64 でも LPARAM の下位 32 ビットのみがマウス座標に使用されると推測します (ただし、公式のソースはありません)。

于 2011-06-16T21:57:23.147 に答える