2017-04-17 35 views
1

我做了一個名爲BorderControl的類,它繼承了Control並且應該繪製虛線邊框。我往前走了,這就是結果:HatchBrush只在左側和頂部繪製破折號

enter image description here

下面是刪節OnPaint方法:

Protected Overrides Sub OnPaint(e As PaintEventArgs) 
    MyBase.OnPaint(e) 
    Dim Height As Integer = ClientSize.Height 
    Dim Width As Integer = ClientSize.Width 
    With e.Graphics 
     Using HB As New HatchBrush(HatchStyle.DashedVertical, Color.Green, Color.Red) 
      Using P As New Pen(HB) 
       .DrawLine(P, Point.Empty, New Point(0, Height - 1)) 
       .DrawLine(P, Point.Empty, New Point(Width - 1, 0)) 
       .DrawLine(P, New Point(Width - 1, 0), New Point(Width - 1, Height - 1)) 
       .DrawLine(P, New Point(0, Height - 1), New Point(Width - 1, Height - 1)) 
      End Using 
     End Using 
    End With 
End Sub 

這和真正的方法之間的唯一區別是,一個布爾值,決定是否繪製虛線邊框或實線邊框。

任何想法?

編輯 你指出明顯之前,實際的方法也使用HatchStyle.DashedHorizo​​ntal對於頂部和底部的線條,所以這不是問題。

+0

我會嘗試使用'HatchStyle.DarkDownwardDiagonel',或者可能'LargeCheckerBoard'。它應該完全消除來自模式的不正確對齊的任何工件的可能性。這些刷子被錨定的方式,我認爲它正在拾取您正在使用的艙口的圖案間距中的間隙。我敢打賭,如果你慢慢調整矩形的寬度和高度,你將能夠找到正確繪製的大小。 –

+0

@BradleyUffner LargeCheckerBoard/SmallCheckerBoard做了詭計。發佈這個答案,我會接受它。謝謝! – Audiopolis

回答

2

HatchStyle.DashedVerticalenter image description here看起來像它只有每4個單位的像素。像這樣的填充是錨定在它們被繪製的窗口的左上角(而不是線的起始位置),這意味着如果您嘗試在不能被4整除的像素上繪製一條線,您將只獲取背景顏色。

你需要的是在所有列和行中都有前景像素的填充,無論你如何「切片」,它都會看起來虛幻。我會推薦HatchStyle.LargeCheckerBoardenter image description here,因爲它看起來像它會產生最接近您的示例的輸出,儘管其他模式可能會起作用。

這是一張圖像,顯示HatchStyle每個成員的外觀。 enter image description here