Изменение цвета, подсветки, размера фона ListBox? - PullRequest
0 голосов
/ 06 июня 2018

https://i.imgur.com/2LTdcR2.png

Итак, я искал и сумел выделить значения в моем ListBox, но я пытаюсь увеличить размер шрифта длятекст внутри ListBox, но в результате получается следующее изображение:

enter image description here

Это мой текущий код:

Private Sub ListBox1_DrawItem(sender As System.Object, e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem

    e.DrawBackground()

    If ListBox1.Items(e.Index).ToString().Contains("*") Then
        e.Graphics.FillRectangle(Brushes.Red, e.Bounds)
    End If

    e.Graphics.DrawString(ListBox1.Items(e.Index), e.Font, Brushes.Black, New System.Drawing.PointF(e.Bounds.X, e.Bounds.Y))
    e.DrawFocusRectangle()

Я пробовал возиться с "e.Bounds.X, e.Bounds.Y", чтобы увеличить прямоугольник / размер выделенного значения, но ничего не получалось.

Как можно увеличить выделенный прямоугольник в соответствии с размером шрифта?

1 Ответ

0 голосов
/ 07 июня 2018

Когда вы устанавливаете 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...