为什么Drawstring在Listbox中使字体更宽?

时间:2015-10-13 13:52:46

标签: vb.net windows fonts listbox drawstring

我在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

有人可以解释一下我错过了什么吗?

1 个答案:

答案 0 :(得分:-1)

首先,每次绘制项目时都停止创建字体,这会浪费宝贵的GDI资源。直接使用e.Font,无需创建其他副本。

确保您为标签和列表框使用完全相同的字体。

为您的标签设置UseCompatibleTextRendering = True

我认为这已经足够了。

但是,为什么你这样做呢? 如果您要显示一些多列表,为什么不use a ListView instead