c# - 更改 ComboBox 边框轮廓颜色

标签 c# winforms combobox

我正在尝试管理 ComboBox 的颜色。虽然可以更改背景颜色,但我找不到边框轮廓的属性。

由于箭头的原因,在深色主题中仅绘制一个正方形作为边框是行不通的。这使我得出结论,该边框可能是一个实际的图像文件。

这个可以换吗?

enter image description here

更新:
我已经实现了@AhmedAbdelhameed 的解决方案 - 现在看起来好多了。但是对于平面样式,我必须像下面这样调整矩形:

using (var p = new Pen(this.BorderColor, 1))
{
    g.DrawRectangle(p, 0, 0, Width - buttonWidth - 1, Height - 1);
}

我还交换了 'BorderColor' 以匹配我的 UI 的其余部分:
public CustomComboBox()
{
    BorderColor = Color.Gray;
} 

这是迄今为止的结果:
enter image description here
enter image description here

我现在想要做的是仅在黑暗主题中更改实际的下拉按钮(可能带有覆盖 png)

更新:
我已经能够使用以下代码向自定义控件添加一个 pricturebox:
using (var g = Graphics.FromHwnd(Handle))
{
    using (var p = new Pen(this.BorderColor, 1))
    {
        g.DrawRectangle(p, 0, 0, Width - buttonWidth - 1, Height - 1);
    }
    if (Properties.Settings.Default.Theme == "Dark")
    {
        g.DrawImageUnscaled(Properties.Resources.dropdown, new Point(Width - buttonWidth - 1));
    }
}

看起来棒极了!
或多或少是我不明白的巧合,当我在主题组合框中更改主题时,深色下拉按钮甚至消失了。

对比前后:
enter image description here
enter image description here

最佳答案

this answer 的帮助下,我能够想出以下几点:

首先,将以下内容添加到您的表单中以避免闪烁:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams handleParam = base.CreateParams;
        handleParam.ExStyle |= 0x02000000;      // WS_EX_COMPOSITED
        return handleParam;
    }
}

现在,将以下类添加到您的项目中:
public class CustomComboBox : ComboBox
{
    private const int WM_PAINT = 0xF;
    private int buttonWidth = SystemInformation.HorizontalScrollBarArrowWidth;
    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == WM_PAINT)
        {
            using (var g = Graphics.FromHwnd(Handle))
            {
                // Uncomment this if you don't want the "highlight border".
                /*
                using (var p = new Pen(this.BorderColor, 1))
                {
                    g.DrawRectangle(p, 0, 0, Width - 1, Height - 1);
                }*/
                using (var p = new Pen(this.BorderColor, 2))
                {
                    g.DrawRectangle(p, 2, 2, Width - buttonWidth - 4, Height - 4);
                }
            }
        }
    }

    public CustomComboBox()
    {
        BorderColor = Color.DimGray;
    }

    [Browsable(true)]
    [Category("Appearance")]
    [DefaultValue(typeof(Color), "DimGray")]
    public Color BorderColor { get; set; }
}

重建项目,用新的 CustomComboBox 替换 ComboBox 控件,设置 BorderColor属性为您选择的颜色,您就可以开始了。

结果:

ComboBox_BorderColor

更新:

使用以下值似乎会得到更好的结果(特别是在单击下拉按钮时),但您可能仍然需要绘制第一个矩形(上面评论的那个)以避免仅在按钮周围显示“突出显示边框”:
using (var p = new Pen(this.BorderColor, 3))
{
    g.DrawRectangle(p, 1, 1, Width - buttonWidth - 3, Height - 3);
}

关于c# - 更改 ComboBox 边框轮廓颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52541869/

相关文章:

c# - 禁止调整 Windows Forms 窗体的大小

java - Checkbox和ComboBox javaFX

Excel VBA 组合框默认值

c# - FindByName 或 FindByValue set .selected on dropdownlist 返回错误 Object reference not set to an instance of an object

c# - 如果我之后直接使用 `Response.Flush()` `Response.End()` 有意义吗?

javascript - 在ASP.NET上使用JQUERY重定向到asp.net页面。

c# - 使用 Windows 传真发送和接收传真

c# - 处置的控件是否应该能够安全地忽略事件回调?

c# - 使用 Unity IoC 容器解析 C# 中的包装类

c# - 如何在同一应用程序的所有窗口之上显示一个窗口