为什么 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