У вас есть несколько проблем. Как отмечено, если текст нарисован и ваш код DrawItem
не рисует его, то DrawMode
, вероятно, не установлен в OwnderDrawFixed
.
Затем, как только вы скажете, что будете обрабатывать рисунки, вам необходимо обработать все рисунок. Это включает выделение выделенного элемента, фон и прямоугольник фокуса. Маленькие цветовые поля, которые вы нарисовали, оставляют место для отображения текста, поэтому это покажет, как сделать то и другое.
Private Sub cbox1_DrawItem(sender As Object, e As DrawItemEventArgs) Handles cbox1.DrawItem
If e.Index = -1 Then Return
Dim thisText As String = cbox1.Items(e.Index).ToString()
Dim thisColor As Color = CType(TypeDescriptor.GetConverter(GetType(Color)).
ConvertFromInvariantString(thisText),
Color)
' use HeighLight when needed
Dim foreclr As Color = If(e.State.HasFlag(DrawItemState.Selected),
SystemColors.HighlightText,
cbox1.ForeColor)
e.DrawBackground()
Using br As New SolidBrush(thisColor)
e.Graphics.DrawRectangle(New Pen(Brushes.Black),
e.Bounds.Left + 2, e.Bounds.Top + 2, 30,
e.Bounds.Height - 5)
e.Graphics.FillRectangle(br, e.Bounds.Left + 3, e.Bounds.Top + 3,
29, e.Bounds.Height - 6)
Dim tRect = New Rectangle(e.Bounds.Left + 32, e.Bounds.Top + 2,
e.Bounds.Width - 32, e.Bounds.Height - 4)
TextRenderer.DrawText(e.Graphics, String.Format("255, {0:000}, {1:000}, {2:000}",
thisColor.R, thisColor.G, thisColor.B),
cbox1.Font, tRect, foreclr)
End Using
e.DrawFocusRectangle()
End Sub
Формат строки ARGB, как представляется, формат InvariantString
, который используется во всех видах экспорта и сериализации. Код показывает, как его конвертировать, но String.Split
тоже будет работать. Вам нужно будет сделать то же самое, когда они сделают выбор, чтобы на самом деле создать цвет из текста (или сделать все это спереди и выключить List(Of Color)
)
Важно проверить, является ли элемент Выбранный элемент и используйте правильный forecolor для любого текста, который вы рисуете. Также показан номер FocusRectangle
.
Существует много места как для текста, и образца цвета, но если вы действительно не хотите, чтобы текст ARGB, просто пропустите DrawText
код, и рассмотреть вопрос о заполнении всего прямоугольника с цветом, а не рисунок образчика:
Я предположил, что каждый цвет, чтобы нарисовать определяется 'Color.FromArgb (CB_Color.Items (e.Index))'. Пользователь должен просто выбрать цвет из раскрывающегося списка, и я думаю, что я мог бы знать, что он выбрал, используя индекс выбранного элемента. – Elhendriks