为什么 Drawstring 会使列表框中的字体变宽?
Why does Drawstring make font wider in Listbox?
我在 vb.net 中有一个列表框。我能够根据条件用不同的颜色绘制我的项目(使用 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
有人能解释一下我错过了什么吗?
首先,停止每次绘制项目时都创建字体,这会浪费宝贵的 GDI 资源。直接使用e.Font
,无需创建另一个副本。
确保您为标签和列表框使用完全相同的字体。
为您的标签设置UseCompatibleTextRendering
= True
。
我觉得够了
但是,您一开始为什么要这样做?
如果您要显示一些多列表,为什么不 use a ListView instead?
我在 vb.net 中有一个列表框。我能够根据条件用不同的颜色绘制我的项目(使用 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
有人能解释一下我错过了什么吗?
首先,停止每次绘制项目时都创建字体,这会浪费宝贵的 GDI 资源。直接使用e.Font
,无需创建另一个副本。
确保您为标签和列表框使用完全相同的字体。
为您的标签设置UseCompatibleTextRendering
= True
。
我觉得够了
但是,您一开始为什么要这样做? 如果您要显示一些多列表,为什么不 use a ListView instead?