2014-05-03 46 views
1

我需要爲我的Windows窗體控件實現命中測試。我有一個繼承了Control類我的自定義類和我畫畫,在OnPaint方法,折線:命中測試Windows窗體圖形

e.Graphics.DrawLines(myPen, myPoints); 

現在,MouseDown活動期間,我得到鼠標的位置,我實現了命中測試樣遵循:

using (var path = new GraphicsPath()) 
{ 
    path.AddLines(myPoints); 
    return path.IsVisible(pt); 
} 

的問題是,如果有,例如,在圖中折線(這似乎是一個多邊形)的IsVisible方法返回true,即使我單擊代表該多邊形區域內:

enter image description here

我需要不同的行爲,只有當我點擊該行時方法纔會返回true。 我該怎麼辦?

+1

更好的解決方案是創建一個代表您想要的表單的對象/ * *模型*,它將自行繪製。然後,對象將負責檢查它是否被擊中(在哪個區域)而不是主程序。在主應用程序中,您只需爲要檢查的每個對象傳遞鼠標座標。 – pasty

+1

@pasty謝謝你的建議,實際上我就像你說的那樣。這個問題只是一個更簡單的例子。 – Nick

+0

@Nick,因爲我發佈在[答案](http://stackoverflow.com/a/23443391/1207195),你只需要用'IsOutlineVisible'替換'IsVisible'。 –

回答

3

您只需要使用不同的方法進行命中測試:IsOutlineVisible而不是IsVisible

using (var path = new GraphicsPath()) 
{ 
    path.AddLines(myPoints); 
    return path.IsOutlineVisible(pt, Pens.Black); 
} 

您需要提供筆,因爲基於行的命中測試適用於線條和線條可以有特定的寬度。這就是說我會建議使用不同的(更厚的)鋼筆,因爲用鼠標選擇一個像素對許多用戶來說並不那麼容易。