Как сделать элемент управления похожим на ComboBox с включенными визуальными стилями?
У меня есть элемент управления, который моделируется на ComboBox. Я хочу отобразить элемент управления так, чтобы граница элемента управления была похожа на стандартную область Windows ComboBox. В частности, я следовал документации MSDN, и вся визуализация элемента управления является правильной, за исключением визуализации, когда элемент управления отключен.
Просто чтобы быть понятным, это для системы с включенными визуальными стилями. Кроме того, все части элемента управления отображаются правильно, за исключением границы вокруг отключенного элемента управления, который не соответствует цвету отключенной границы ComboBox.
Я использую класс VisualStyleRenderer. MSDN предлагает использовать VisualStyleElement.TextBox
элемент для элемента TextBox элемента управления ComboBox, но стандартный отключенный TextBox и стандартный отключенный ComboBox рисуют немного по-другому (один имеет светло-серую рамку, другой - голубую).
Как я могу получить правильную визуализацию элемента управления в отключенном состоянии?
3 ответа
Я не уверен на 100%, если это то, что вы ищете, но вы должны проверить VisualStyleRenderer в пространстве имен System.Windows.Forms.VisualStyles-name.
- Класс VisualStyleRenderer (MSDN)
- Как визуализировать элемент визуального стиля (MSDN)
- 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.
}
Надеюсь, поможет!
Являются ли какие-либо методы ControlPaint полезными для этого? Это то, что я обычно использую для пользовательских элементов управления.
В дополнение к ответу , предоставленному user936 я также пытался использовать класс VisualStyleRenderer , но не смог получить именно то, что хотел.
Я обнаружил, что вместо этого вы можете использовать некоторые недокументированные имена классов. VisualStyleRenderer()
конструктор допускает значение строкового класса. Если вам посчастливилось найти тот, который вам нужен (как я сделал ниже), вы можете использовать стили, отличные от тех, которые определены вVisualStyleElement
сорт.
_renderer = new VisualStyleRenderer("WindowsForms10::COMBOBOX", 1, 1);
ПОЛНЫЙ ПРИМЕР
protected override void OnPaint(PaintEventArgs e)
{
// Process the base painting events
base.OnPaint(e);
// Check for visual support
bool vStyleRender = false;
if (VisualStyleInformation.IsSupportedByOS && VisualStyleInformation.IsEnabledByUser)
vStyleRender = true;
bool standardComboBoxRender = ComboBoxRenderer.IsSupported;
if (!vStyleRender && !standardComboBoxRender)
{
this.Parent.Text = "Visual Styles Disabled";
return;
}
this.Parent.Text = "CustomComboBox Enabled";
// Always draw the main text box and drop down arrow in their current states
if (vStyleRender)
{
// Use visual style renderer
VisualStyleRenderer _renderer = null;
// Draw the base text box
_renderer = new VisualStyleRenderer(VisualStyleElement.TextBox.TextEdit.Normal);
_renderer.DrawBackground(e.Graphics, topTextBoxRectangle);
// Draw the arrow
//_renderer = new VisualStyleRenderer(VisualStyleElement.ComboBox.DropDownButton.Normal);
_renderer = new VisualStyleRenderer("WindowsForms10::COMBOBOX", 1, 1);
_renderer.DrawBackground(e.Graphics, arrowRectangle);
}
}