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

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

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

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

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

Спасибо!


person John    schedule 22.04.2011    source источник


Ответы (2)


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

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

person Joel    schedule 16.06.2011
comment
Спасибо Джоэл! Тогда возникает вопрос, почему типы MouseEventArgs.X и MouseEventArgs.Y не имеют 16-битной подписи, если это все, чем они могут быть на самом деле. - person John; 17.06.2011
comment
Аналогичная проблема с WM_VSCROLL. У вас могут быть 32-битные позиции полосы прокрутки, но сообщение содержит только 16 бит данных. Ограничение 16-битной позиции мыши со знаком на самом деле не задокументировано для Windows Forms, поэтому, возможно, они хотели оставить открытой возможность предоставления позиции курсора, возвращаемой чем-то вроде GetCursorInfo? Точно сказать не могу. - person Joel; 17.06.2011

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

PointToClient(Cursor.Position)

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

person Jim Balkwill    schedule 10.04.2015