winforms 在Windows窗体中更改组合框边框颜色

js81xvg6  于 2023-03-09  发布在  Windows
关注(0)|答案(3)|浏览(350)

在我的应用程序中,我添加了组合框,如下图所示

我已将组合框属性设置为

cmbDatefilter.FlatStyle = System.Windows.Forms.FlatStyle.Flat;

现在我的问题是如何将边框样式设置为组合框,这样看起来会很漂亮。
我在下面的链接中验证
Flat style Combo box
我的问题与下面链接的不同。
Generic ComboBox in Windows Forms Application
How to override UserControl class to draw a custom border?

xurqigkl

xurqigkl1#

您可以从ComboBox继承并覆盖WndProc,处理WM_PAINT消息并为组合框绘制边框:

using System;
using System.Drawing;
using System.Windows.Forms;

public class FlatCombo : ComboBox
{
    private const int WM_PAINT = 0xF;
    private int buttonWidth = SystemInformation.HorizontalScrollBarArrowWidth;
    Color borderColor = Color.Blue;
    public Color BorderColor
    {
        get { return borderColor; }
        set { borderColor = value; Invalidate(); }
    }
    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == WM_PAINT && DropDownStyle != ComboBoxStyle.Simple)
        {
            using (var g = Graphics.FromHwnd(Handle))
            {
                using (var p = new Pen(BorderColor))
                {
                    g.DrawRectangle(p, 0, 0, Width - 1, Height - 1);

                    var d = FlatStyle == FlatStyle.Popup ? 1 : 0;
                    g.DrawLine(p, Width - buttonWidth - d,
                        0, Width - buttonWidth - d, Height);
                }
            }
        }
    }
}
    • 注:**
  • 在上面的例子中,我使用了前景色作为边框,你可以添加一个BorderColor属性或者使用另一种颜色。
  • 如果你不喜欢下拉按钮的左边框,你可以注解DrawLine方法。
  • 控件为RightToLeft时,需要从(0, buttonWidth)(Height, buttonWidth)画线
  • 要了解有关如何呈现平面组合框的更多信息,您可以查看. Net Framework的内部ComboBox.FlatComboAdapter类的源代码。
    • 平面组合框**

您可能还喜欢Flat ComboBox
第一节第一节第一节第二节第一节

rt4zxlrg

rt4zxlrg2#

CodingGorilla有正确的答案,从ComboBox中派生出自己的控件,然后自己绘制边框。
下面是一个绘制1像素宽的深灰色边框的工作示例:

class ColoredCombo : ComboBox
{
    protected override void OnPaintBackground(PaintEventArgs e)
    {
        base.OnPaintBackground(e);
        using (var brush = new SolidBrush(BackColor))
        {
            e.Graphics.FillRectangle(brush, ClientRectangle);
            e.Graphics.DrawRectangle(Pens.DarkGray, 0, 0, ClientSize.Width - 1, ClientSize.Height - 1);
        }
    }
}

左边是正常的,右边是我的例子。

ergxz8rk

ergxz8rk3#

另一种方法是在Parent控件的Paint Event中自己绘制边框:

Private Sub Panel1_Paint(sender As Object, e As PaintEventArgs) Handles Panel1.Paint
        Panel1.CreateGraphics.DrawRectangle(Pens.Black, ComboBox1.Left - 1, ComboBox1.Top - 1, ComboBox1.Width + 1, ComboBox1.Height + 1)
    End Sub

相关问题