2017-07-13 57 views
3

我已經構建了一個簡單的程序(到目前爲止),該程序有一個大面板作爲程序的「WorkArea」。我在上面畫一個網格,有一些功能可以將光標對準網格上的最近點。我在窗口底部有一個狀態欄,它顯示了我在面板上的當前位置。但是,無論我在哪裏滾動(假設垂直條相對於頂部爲10%,水平爲25%),它會顯示與實際窗口相關的光標位置。獲取光標在滾動條面板上的位置

我有一個處理這個事件的OnMouseMove:

private void WorkArea_MouseMove(object sender, MouseEventArgs e) 
{ 
    GridCursor = grid.GetSnapToPosition(new Point(e.X, e.Y)); 
    toolStripStatusLabel1.Text = grid.GetSnapToPosition(new Point(e.X, e.Y)).ToString(); 
    Refresh(); 
} 

它的工作原理,我期望得到光標的點,它繪製到正確的地方,等等。但是,如果我滾動出來,我仍然可以得到相同的讀數。我可以在垂直和水平滾動條中間滾動一半,將光標放在左上角,讀取0,0,當它應該更像5000,5000(面板10k乘10k) 。

如何才能獲得關於其滾動條的面板內的絕對位置?

+0

所以'WorkArea'是一個面板,對嗎?什麼是'GridCursor','Grid','GetSnapToPosition'。 AutoScroll是否打開? – TaW

回答

1

您需要通過滾動位置偏移的位置:

private void panel1_MouseMove(object sender, MouseEventArgs e) 
{ 
     Point scrolledPoint = new Point(e.X - panel1.AutoScrollPosition.X, 
             e.Y - panel1.AutoScrollPosition.Y); 

     .. 
} 

請注意,AutoScrollPosition個值爲負..:檢索

X和Y座標值是負如果控制 已滾動從它的起始位置(0,0)的距離。當您設置此屬性時,您必須始終分配正X和Y值以設置相對於起始位置的滾動位置 。例如,如果您的 具有水平滾動條,並且您將x和y設置爲200,則將向右移動200像素的 ;如果您隨後將x和y設置爲100,則 滾動會顯示爲向左跳100像素,因爲您將它設置爲 ,它距離起始位置100個像素。在第一種情況下, AutoScrollPosition返回{-200,0};在第二種情況下,它返回 {-100,0}。

+0

這樣做的伎倆,謝謝! – Zulukas

0

的WinForms:

的方法Control.PointToClient,您可以相對於控制自身的鼠標位置轉換。

Point point = grid.PointToClient(new Point(e.X, e.Y)) 

WPF:

使用Mouse.GetPosition可以得到鼠標相對於到特定控制的位置:

Point position = Mouse.GetPosition(grid); 
+0

從外觀來看,這只是WPF。有沒有辦法與WinForms做到這一點?我看到了「Cursor.Current」的效果,但我似乎無法找到任何有關如何使用此對象的信息(只是試圖讓Point對象脫離它) – Zulukas

+0

啊,錯過了你的winforms標籤,添加了獨立解決方案 – Chrille

相關問題