Изменить границу ToolStripComboBox с плоским стилем - PullRequest
5 голосов
/ 05 марта 2012

Я хотел бы иметь возможность изменять цвет границы элементов управления ToolStripComboBox в некоторых моих наборах инструментов, поскольку по умолчанию для цвета ComboBox при использовании с плоским стилем используется SystemColors.Window, который в основном невидим для стандартного цвета элемента управления панель инструментов. После долгих поисков в Reflector я не вижу очевидного способа сделать это, поскольку вся инфраструктура рендеринга ComboBox надежно защищена внутренними и частными интерфейсами.

Помимо ToolStrips, распространенное решение для исправления цвета границ в ComboBoxes, которое я видел, состоит в создании подкласса ComboBox, переопределении WndProc и рисовании границы вручную. Это не может работать для элементов управления ToolStripComboBox, поскольку внутренний элемент управления ComboBox является его собственным частным подклассом ComboBox, и я не вижу способа заменить экземпляр элемента управления.

Альтернативное решение, которое я рассматриваю, - это поместить один из расширенных объектов ComboBox в ToolStripControlHost, который позволяет мне рисовать границу, но затем я должен отказаться от некоторых настроек профессиональных рендереров. Вторичный недостаток, который я заметил, это то, что при наведении курсора я иногда мерцаю.

Переключение моего дизайна на WPF не является приемлемым решением. Обтекание элементов управления в родительских элементах управления для границ рисования также недопустимо, так как это ничего не дает по сравнению с альтернативой ToolStripControlHost.

Есть ли у кого-нибудь умное решение, чтобы победить эту проблему, или существует существующая (разрешительно лицензированная) повторная реализация стека рендеринга плоского стиля ComboBox в дикой природе, которая исправляет некоторые недостатки в существующей реализации

Ответы [ 3 ]

3 голосов
/ 15 декабря 2013

Вот способ заставить его работать ... вроде:)

Создать обработчик события для Paint события ToolStrip .Затем переберите все ToolStripComboBoxes и нарисуйте прямоугольник вокруг них.

    private Color cbBorderColor = Color.Gray;
    private Pen cbBorderPen = new Pen(SystemColors.Window);

    private void toolStrip1_Paint(object sender, PaintEventArgs e)
    {            
        foreach (ToolStripComboBox cb in toolStrip1.Items)
        {
            Rectangle r = new Rectangle(
                cb.ComboBox.Location.X - 1,
                cb.ComboBox.Location.Y - 1,
                cb.ComboBox.Size.Width + 1,
                cb.ComboBox.Size.Height + 1);

            cbBorderPen.Color = cbBorderColor;
            e.Graphics.DrawRectangle(cbBorderPen, r);
        }
    }

Вот как это выглядит (обратите внимание, что вам может потребоваться отрегулировать высоту ToolStrip, чтобы предотвратитьзакрашенная граница от обрезки):

enter image description here

2 голосов
/ 07 мая 2014

* 1001 улучшение : проверьте тип элемента toolstrip, поэтому программа не сломается, если это, например, toolstipLabel.

foreach (var item in toolStrip1.Items)
{
      var asComboBox = item as ToolStripComboBox;
      if (asComboBox != null)
      {
          var location = asComboBox.ComboBox.Location;
          var size = asComboBox.ComboBox.Size;
          Pen cbBorderPen = new Pen(Color.Gray);
          Rectangle rect = new Rectangle(
                  location.X - 1,
                  location.Y - 1,
                  size.Width + 1,
                  size.Height + 1);

          e.Graphics.DrawRectangle(cbBorderPen, rect);
       }

}

0 голосов
/ 27 июня 2019
toolStrip1.ComboBox.FlatStyle = FlatStyle.System;

Устанавливает стандартную рамку в стиле ОС вокруг поля со списком.Это светло-серая и тонкая рамка в Windows 10. Хотя, в зависимости от фона, это может не отображаться.В этом случае вы можете попробовать другие варианты, такие как FlatStyle.Popup.

Если пресеты не соответствуют вашим требованиям, другие ответы позволят вам нарисовать пользовательскую границу.Однако, поскольку прямоугольник нарисован с размером +1 пиксель вокруг поля со списком, граница на 1 пиксель больше, чем поле со списком.Удаление +1 и -1 также не работает.

...