我在vb.net中有一个Listbox。我能够根据条件使用不同的颜色绘制我的项目(使用DrawItem事件)。它有效。
问题是绘制的字符串的大小比原始字符串宽,如下图所示。我使用等宽字体,现在文本不再与上面的文本框对齐...
Listbox without DrawString
Listbox with Drawstring
我的代码:
Private Sub ListBoxEvIns_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ListBox_EvIns.DrawItem
ListBox_DrawItem(sender, e, Me.DT_EvIns)
End Sub
Public Sub ListBox_DrawItem(sender As Object, e As DrawItemEventArgs, DT As DataTable)
If DT.Rows.Count() = 0 Then Exit Sub
'Dim F As Font = New Font(e.Font.FontFamily, e.Font.Size * 0.965) 'workaround test
Dim F As Font = New Font(e.Font.FontFamily, e.Font.Size)
e.DrawBackground()
If Dic_ParticipEv_Statut_Brush.Keys.Contains(DT(e.Index).Item("Statut")) Then
e.Graphics.FillRectangle(Dic_ParticipEv_Statut_Brush(DT(e.Index).Item("Statut")), e.Bounds)
Else
e.Graphics.FillRectangle(Brushes.Gray, e.Bounds)
End If
e.Graphics.DrawString(sender.Items(e.Index).ToString(), F, Brushes.White, e.Bounds)
e.DrawFocusRectangle()
End Sub
有人可以解释一下我错过了什么吗?
答案 0 :(得分:-1)
首先,每次绘制项目时都停止创建字体,这会浪费宝贵的GDI资源。直接使用e.Font
,无需创建其他副本。
确保您为标签和列表框使用完全相同的字体。
为您的标签设置UseCompatibleTextRendering
= True
。
我认为这已经足够了。
但是,为什么你这样做呢? 如果您要显示一些多列表,为什么不use a ListView instead?