Изменение цвета подсветки ComboBox в С#

Привет. У меня проблема с маркером в ComboBox. Недавно мне пришлось сделать некоторые элементы в ComboBox серыми, и я сделал это, вручную (программно) нарисовав строки в ComboBox. В поле со списком .NET под DrawMode.NORMAL подсветка автоматически появится, когда вы нажмете стрелку, а фон подсветки будет по умолчанию синим. Проблема заключается в том, что когда мы наводим указатель мыши на элемент, передний цвет наведенного элемента меняется на белый, но когда мы рисуем элементы вручную (DrawMode.OwnerDrawVariable), это не работает. Можете ли вы помочь мне с этим ??

Вот как я серые элементы,

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    int index = e.Index;
    CombinationEntry aFunction = comboBox1.Items[index] as CombinationEntry;  //CombinationEntry is a custom object to hold the gray info. Gray if not available and black if available
    if (aFunction.myIsAvailable)
    {
        e.Graphics.DrawString(aFunction.ToString(), new Font("Arial", 10, FontStyle.Regular, GraphicsUnit.Pixel), Brushes.Black, new Point(e.Bounds.X, e.Bounds.Y));
    }
    else
    {
        e.Graphics.DrawString(aFunction.ToString(), new Font("Arial", 10, FontStyle.Regular, GraphicsUnit.Pixel), Brushes.Gray, new Point(e.Bounds.X, e.Bounds.Y));
    }
}

person Community    schedule 08.12.2008    source источник


Ответы (3)


По умолчанию текст в ComboBox отображается одним из двух цветов:

SystemColors.WindowText

для невыделенных элементов или

SystemColors.HighlightText

для выделенных элементов.

Эти цвета не являются фиксированными, но могут быть настроены пользователем (например, через панель управления). В типичной цветовой схеме Windows WindowText — черный, а HighlightText — белый, но это не всегда так, если цветовая схема была изменена.

Чтобы убедиться, что вы получаете правильные цвета независимо от того, как пользователь настроил свою систему, а также чтобы получить соответствующий цвет для выделенного и невыделенного текста, вместо использования Brushes.Black для не отключенного текста используйте что-то вроде :

e.State == DrawItemState.Selected ?
    SystemBrushes.HighlightText : SystemBrushes.WindowText

В основном это говорит о том, что если состояние элемента, который вы рисуете (e.State), выбрано (выделено), используйте SystemColors.HighlightText, в противном случае используйте SystemColors.WindowText.

Вы также можете использовать:

SystemBrushes.GrayText

вместо Brushes.Gray, опять же на тот случай, если у пользователя нестандартная цветовая схема и обычный серый выглядит не так. И вам, вероятно, также следует использовать:

comboBox1.Font

вместо создания шрифта Arial, чтобы убедиться, что шрифт соответствует шрифту, определенному для поля со списком в форме. (Также создание объекта Font без его удаления приведет к утечке ресурсов.)

person Eric Rosenberger    schedule 08.12.2008

Да. Это было действительно полезно. Также я пытался сделать:

if (e.State == ((DrawItemState.NoAccelerator | DrawItemState.NoFocusRect) | 
                (DrawItemState.Selected | 
                 DrawItemState.NoAccelerator | 
                 DrawItemState.NoFocusRect)))
{
    e.Graphics.DrawString(aFunction.ToString(), 
                          new Font("Arial", 10, FontStyle.Regular,
                                   GraphicsUnit.Pixel), 
                          SystemBrushes.HighlightText, 
                          new Point(e.Bounds.X, e.Bounds.Y));
}

Что дало мне то, что я ожидал. Я обязательно рассмотрю ваши предложения по использованию системных кистей вместо сплошной. Спасибо за ваше решение.

person Community    schedule 09.12.2008

if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) будет лучше, чем e.State == DrawItemState.Selected или пытаться охватить все возможности

person alex gil    schedule 12.05.2011