2016-08-30 7 views
1

Моя проблема заключается в следующем:Цвета дисплея в ComboBox из пункта Значение ARGB

У меня есть выпадающий заполнены с кодами ARGB (извлекаемых из файла Excel), как это:

255, 149, 55, 39 
255, 0, 176, 80 
255, 0, 112, 192 
... 

Моя цель для отображения списка цветов вместо их кода rgb. Таким образом, я пытался это сделать, но безуспешно:

Private Sub CB_Color_DrawItem(ByVal sender As System.Object, ByVal e As DrawItemEventArgs) Handles CB_Color.DrawItem 

    If e.Index = -1 Then 
     Exit Sub 
    End If 

    Dim colBrush As Brush = New SolidBrush(Color.FromArgb(CB_Color.Items(e.Index))) 
    'Drawing rectangles for the color values 
    e.Graphics.DrawRectangle(New Pen(Brushes.Black), e.Bounds.Left + 2, 
         e.Bounds.Top + 2, 30, e.Bounds.Height - 5) 
    e.Graphics.FillRectangle(colBrush, e.Bounds.Left + 3, e.Bounds.Top + 3, 
         29, e.Bounds.Height - 6) 

End Sub 

Этот код ничего не меняет. У меня все еще есть коды rbg в списке combobox. Может кто-нибудь, пожалуйста, скажите мне, что не так с этим кодом?

+0

Я предположил, что каждый цвет, чтобы нарисовать определяется 'Color.FromArgb (CB_Color.Items (e.Index))'. Пользователь должен просто выбрать цвет из раскрывающегося списка, и я думаю, что я мог бы знать, что он выбрал, используя индекс выбранного элемента. – Elhendriks

ответ

3

У вас есть несколько проблем. Как отмечено, если текст нарисован и ваш код 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 код, и рассмотреть вопрос о заполнении всего прямоугольника с цветом, а не рисунок образчика:

enter image description here

+0

Это хорошо работает! Мне просто нужно отобразить выбранный цвет, не содержащий текст. – Elhendriks

+0

Для этого требуется только установка backcolor, но здесь будут разбиты решения. – Plutonix

+0

Я изменил DropDownStyle proprety на DropDownList и добавил 'Private Sub CB_Color_SelectedIndexChanged (ByVal-отправитель As System.Object, ByVal e As System.EventArgs) Ручки CB_Color.SelectedIndexChanged Me.CB_Color.BackColor = Цвет.White End Sub', и он отлично работает, не нарушая ваше решение. – Elhendriks

2

Во-первых, в свойствах combobox найдите свойство «DrawMode». Измените это значение на «OwnerDrawFixed». Это значение, указывающее, будет ли код или операционная система обрабатывать чертеж.

Затем вам нужно будет добавить и изменить следующий код:

Dim colorArray() As String = ComboBox1.Items(e.Index).ToString.Split(",") 

Dim colBrush As Brush = New SolidBrush(Color.FromArgb(CInt(colorArray(0)), CInt(colorArray(1)), CInt(colorArray(2)), CInt(colorArray(3)))) 

Мы делаем это потому, что FromArgb принимает только целые значения.

 Смежные вопросы

  • Нет связанных вопросов^_^