Когда вы устанавливаете DrawMode элемента управления ListBox
на OwnerDrawVariable или изменяете размер шрифта после создания дескриптора элемента управления (т. Е. После того, как он уже обработан WM_MEASUREITEM
(сообщение)), вам необходимо вручную установить для свойства ItemHeigh новую высоту шрифта.
Свойство ItemHeight
устанавливается при подписке на ListBox
MeasureItem событие и установка свойства MeasureItemEventArgs
e.ItemHeight
.
Кроме того, если вы измените размер шрифта на лету, вам также необходимо принудительно отправить сообщение WM_MEASUREITEM
в элемент управления ListBox
, в противном случае границы элементов не будут обновлены.
Другими словами, когда возникает событие DrawItem
свойство DrawItemEventArgs
e.Bounds
будет сообщать о неверных мерах.
Чтобы заставить элемент управления ListBox
повторно измерить границы элементов, нужно установить ListBox.DrawMode = DrawMode.Normal
и немедленно сбрасывает его обратно на OwnerDrawVariable
.Это приводит к повторной обработке сообщения WM_MEASUREITEM
.
listBox1.DrawMode = DrawMode.Normal
listBox1.DrawMode = DrawMode.OwnerDrawVariable
listBox1.Update()
Здесь я использую Font.Height
для измерения текущего ItemHeight
в событии MeasureItem
, потому что оно округляетсядо меры.Вы можете использовать TextRenderer.MeasureText или Font.GetHeight () ;в итоге вы получите ту же меру, но округленную в меньшую сторону.
Private Sub ListBox1_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ListBox1.DrawItem
Dim ItemForeColor As Color
Dim ItemBackColor As Color
e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
ItemForeColor = Color.FromKnownColor(KnownColor.HighlightText)
ItemBackColor = If(ListBox1.Items(e.Index).ToString().Contains("*"), Color.Red, Color.FromKnownColor(KnownColor.Highlight))
Else
ItemForeColor = ListBox1.ForeColor
ItemBackColor = If(ListBox1.Items(e.Index).ToString().Contains("*"), Color.Red, ListBox1.BackColor)
End If
Using TextBrush As New SolidBrush(ItemForeColor)
Using ItemBrush As New SolidBrush(ItemBackColor)
e.Graphics.FillRectangle(ItemBrush, e.Bounds)
e.Graphics.DrawString(ListBox1.Items(e.Index).ToString(), ListBox1.Font, TextBrush, e.Bounds, StringFormat.GenericTypographic)
End Using
End Using
e.DrawFocusRectangle()
End Sub
Private Sub ListBox1_MeasureItem(sender As Object, e As MeasureItemEventArgs) Handles ListBox1.MeasureItem
e.ItemHeight = ListBox1.Font.Height
End Sub
Проверьте его, изменив размер шрифта:
ListBox1.Font = New Font(ListBox1.Font.FontFamily, ListBox1.Font.SizeInPoints + 2, ListBox1.Font.Style, GraphicsUnit.Point)
ListBox1.DrawMode = DrawMode.Normal
ListBox1.DrawMode = DrawMode.OwnerDrawVariable
ListBox1.Height = '[OriginalHeight]
ListBox1.Update()
![enter image description here](https://i.stack.imgur.com/QffQm.gif)