winforms 如何在启用视觉样式的情况下呈现控件以使其看起来像ComboBox?

qgzx9mmu  于 2023-03-09  发布在  其他
关注(0)|答案(3)|浏览(268)

我有一个以ComboBox为模型的控件。我希望呈现该控件,使控件border看起来像标准Windows ComboBox的控件。具体来说,我已按照MSDN文档进行了操作,除了控件被禁用时的呈现之外,控件的所有呈现都是正确的。
需要说明的是,这是针对启用了Visual Styles的系统。此外,除了禁用控件周围的边框(与禁用的ComboBox边框颜色不匹配)之外,控件的所有部分都能正确呈现。
我正在使用VisualStyleRenderer类。MSDN建议对ComboBox控件的TextBox部分使用VisualStyleElement.TextBox元素,但标准禁用的TextBox和标准禁用的ComboBox绘制方式略有不同(一个有浅灰色边框,另一个有浅蓝色边框)。
如何正确呈现处于禁用状态的控件?

vhmi4jdf

vhmi4jdf1#

我不能100%确定这是否是您要查找的内容,但您应该检查System. Windows. Forms. VisualStyles-namespace中的VisualStyleRenderer

  1. VisualStyleRenderer class(MSDN)
  2. How to: Render a Visual Style Element(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.
}

希望能有所帮助!

ar7v8xwq

ar7v8xwq2#

ControlPaint方法对此有用吗?这是我通常用于定制呈现控件的方法。

sxissh06

sxissh063#

添加到Patrik提供的answer,我试图使用VisualStyleRenderer class以及,但无法得到正是我想要的。
我发现你可以使用一些没有记录的类名来代替。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);
    }
}

相关问题