2014-02-12 47 views
1

當嘗試自定義繪製我的coloumn標題和列表視圖項目時,出現鋸齒形文字(不是反鋸齒),看起來很糟糕。我遇到了以下代碼片段,以便更好地呈現文本和顯示 - 這很有效。但是,我無法弄清楚如何將文本置於列中。目前,將我的標誌設置爲Horizo​​ntalCentre實際上是將文本置於整個列表視圖控件中。使用OwnerDrawn時無法居中列表視圖項目

Private Sub lsvOverdueCalls_DrawItem(sender As Object, e As DrawListViewItemEventArgs) Handles lsvOverdueCalls.DrawItem 
    If e.Item.Selected AndAlso e.Item.ListView.Focused Then 
     e.Item.BackColor = SystemColors.Highlight 
     e.Item.ForeColor = e.Item.ListView.BackColor 
    ElseIf e.Item.Selected AndAlso Not e.Item.ListView.Focused Then 
     e.Item.BackColor = SystemColors.Control 
     e.Item.ForeColor = e.Item.ListView.ForeColor 
    Else 
     e.Item.BackColor = e.Item.ListView.BackColor 
     e.Item.ForeColor = e.Item.ListView.ForeColor 
    End If 

    e.DrawBackground() 

    ' Draw the header text. 
    Dim rec As New Rectangle(e.Bounds.X + 2, e.Bounds.Y + 2, e.Bounds.Width - 4, e.Bounds.Height - 4) 
    Dim flags As TextFormatFlags = TextFormatFlags.HorizontalCenter Or TextFormatFlags.EndEllipsis Or TextFormatFlags.ExpandTabs Or TextFormatFlags.SingleLine 
    TextRenderer.DrawText(e.Graphics, e.Item.Text, e.Item.ListView.Font, rec, e.Item.ForeColor, flags) 
End Sub 

我的結果是這樣的: enter image description here

我需要的呼叫號碼(26155)坐呼叫ID列的中心。

+0

' e.Bounds'是整個寬度。您的Call ID列的寬度是多少? – LarsTech

+0

Call ID列的寬度是80.我可以引用列的邊界還是需要對值進行硬編碼?我已經嘗試使用e.Item.Bounds,但我仍然得到相同的結果。 – Riples

+0

如果你給你的列鍵,你可以只引用寬度:'listView1.Columns(「callID」).Width',否則,索引順序'listView'.Columns(0).Width'等 – LarsTech

回答

0

e.Bounds是整個寬度。要獲得列的寬度,請嘗試引用ListView列的Width屬性。

如果你給你列鍵,通過鍵引用它們:

listView1.Columns("callID").Width 

或指數:

listView1.Columns(0).Width 

然後您繪製矩形會是這個樣子:

Dim colWidth As Integer = listView1.Columns("callID").Width 
Dim rec As New Rectangle(e.Bounds.X, e.Bounds.Y, _ 
         colWidth, e.Bounds.Height) 
+0

謝謝拉爾斯。你的回答非常有幫助。不知道我是否應該在這方面啓動一個新的主題,但最後一個問題是當我將鼠標懸停在我的子項目上時,它們會消失。第一項仍然存在,但行的其餘部分消失。 – Riples

+0

沒關係....通過這個線程修復[鏈接](http://www.vbdotnetforums.com/graphics-gdi/17696-custom-drawn-listview-issues.html) – Riples

相關問題