Как сделать элемент управления похожим на ComboBox с включенными визуальными стилями?

У меня есть элемент управления, созданный по образцу ComboBox . Я хочу отобразить элемент управления так, чтобы граница элемента управления выглядела как у стандартного Windows ComboBox . В частности, я следил за документацией MSDN, и вся визуализация элемента управления верна, за исключением отрисовки, когда элемент управления отключен.

Чтобы было ясно, это для системы с включенными визуальными стилями . Кроме того, все части элемента управления отображаются правильно, за исключением границы вокруг отключенного элемента управления, которая не соответствует цвету границы отключенного ComboBox .

Я использую класс VisualStyleRenderer . MSDN предлагает использовать VisualStyleElement.TextBox элемент для части TextBox элемента управления ComboBox, но стандартный отключенный TextBox и стандартный отключенный ComboBox рисуются немного по-разному (один имеет светло-серую границу, другой - светло-синюю).

Как я могу получить правильную визуализацию элемента управления в отключенном состоянии?

Ответов (2)

Полезны ли для этого какие-либо методы ControlPaint ? Это то, что я обычно использую для настраиваемых элементов управления.

Я не уверен на 100%, что это то, что вы ищете, но вам следует проверить VisualStyleRenderer в пространстве имен System.Windows.Forms.VisualStyles.

  1. VisualStyleRenderer класс (MSDN)
  2. Как выполнить визуализацию элемента визуального стиля (MSDN)
  3. VisualStyleElement.ComboBox.DropDownButton.Disabled (MSDN)

Поскольку VisualStyleRenderer не будет работать, если у пользователя не включены визуальные стили (он / она может работать в «классическом режиме» или в операционной системе до Windows XP), вы всегда должны иметь откат к классу ControlPaint.

// Create the renderer.
if (VisualStyleInformation.IsSupportedByOS 
    && VisualStyleInformation.IsEnabledByUser) 
{
    renderer = new VisualStyleRenderer(
        VisualStyleElement.ComboBox.DropDownButton.Disabled);
}

а затем сделайте так при рисовании:

if(renderer != null)
{
    // Use visual style renderer.
}
else
{
    // Use ControlPaint renderer.
}

Надеюсь, это поможет!