Какой тип MouseEventArgs.X? - PullRequest
       57

Какой тип MouseEventArgs.X?

0 голосов
/ 23 апреля 2011

Работа с C # в Visual Studio 2008 (.NET 3.5). Глядя на System.Windows.Forms.MouseEventArgs.

Я вижу странное поведение с длинной панелью, когда перехватываю обработку события MouseMove. Похоже, что MouseEventArgs.X переходит от 0 до 32767 и оборачивается до -32768.

Когда я наблюдаю переменную в Visual Studio, она утверждает, что она имеет тип int.

Очевидно, это 16-разрядное целое число со знаком, как оно себя ведет. Это правда? Это жесткий лимит?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 17 июня 2011

Вероятно, это связано с тем, что Windows Forms - это, по сути, оболочка .NET вокруг API C Windows.Для WM_MOUSEMOVE и связанных сообщений (WM_LBUTTONDOWN и т. Д.) Координаты мыши отправляются в параметре LPARAM.LPARAM - это typedef для LONG_PTR, который в 32-битной Windows (только), в свою очередь, долго является typedef.Как сказано в документах для WM_MOUSEMOVE, вы можете получить позицию курсора, используя макросы GET_X_LPARAM и GET_Y_LPARAM, которые возвращают младший и высокий старшие порядки соответственно.

Поскольку значение составляет 32 бита дляНачнем с (в 32-битной Windows), единственный способ, которым это имеет смысл, - это чтобы координаты x и y фактически были 16-битными значениями.Основываясь на определении GET_X_LPARAM в windowsx.h, я бы также предположил (но не имею официального источника, который говорит), что даже на x64 только младшие 32 бита LPARAM используются для координат мыши.

0 голосов
/ 10 апреля 2015

Вместо использования позиции в событии перемещения мыши, используйте:

PointToClient(Cursor.Position)

Microsoft может легко сделать это в своей оболочке .Net. Может быть, есть законная причина, почему они этого не делают, но мне кажется, что это работает.

...