2011-04-22 156 views
0

在Visual Studio 2008(.NET 3.5)中使用C#。展望System.Windows.Forms.MouseEventArgs什麼是MouseEventArgs.X的類型?

當我攔截處理MouseMove事件時,我看到奇怪的行爲與長面板。看起來MouseEventArgs.X從0到32767,並回到-32768。

當我在Visual Studio中觀察變量時,它聲稱它是int類型。

顯然它是一個16位有符號整數的行爲方式。這是真的?這是一個硬限制嗎?

謝謝!

回答

1

這可能來自Windows窗體基本上是圍繞C Windows API的.NET包裝。對於WM_MOUSEMOVE和相關消息(WM_LBUTTONDOWN等),鼠標座標在LPARAM參數中發送。 LPARAM是LONG_PTR的typedef,它在32位Windows(僅)上反過來是longdef的一個typedef。正如WM_MOUSEMOVE的文檔所述,您可以使用GET_X_LPARAM和GET_Y_LPARAM宏來獲取遊標位置,這些宏分別返回低位int和高位int。

由於該值爲32位(在32位Windows上),唯一有意義的方法是x和y座標實際上是16位值。根據windowsx.h中GET_X_LPARAM的定義,我也猜測(但沒有一個官方消息來源說),即使在x64上,只有LPARAM的低32位用於鼠標座標。

+0

謝謝喬爾!讓人奇怪的是,爲什麼MouseEventArgs.X和MouseEventArgs.Y類型不是16位有符號的,如果這就是他們所能做到的。 – John 2011-06-16 22:19:31

+0

WM_VSCROLL存在類似的問題。您可以擁有32位滾動條位置,但該消息僅包含16位數據。有簽名的16位鼠標位置限制實際上並未記錄在Windows窗體中,因此他們可能希望保留提供從GetCursorInfo之類返回的光標位置的可能性?不確定。 – Joel 2011-06-17 15:17:23

0

不是使用鼠標移動事件的位置,使用方法:

PointToClient(Cursor.Position) 

微軟可以很容易地做到這一點在他們的.NET包裝。可能有一個合法的原因,他們爲什麼不這樣做,但它似乎爲我工作。