[c#]带圆角 Windows 窗体中创建自定义组合框

标签: windows C#
发布时间: 2013/12/8 17:48:57
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我要创建一个自定义组合框带有圆的角和渐变颜色。在相同的功能,实现了 Button 通过重写 OnPaint 方法。但它不在为工作 ComboBox 。任何帮助将不胜感激。

我使用的重写的代码 OnPaint 下面给出:

protected override void OnPaint(PaintEventArgs paintEvent)
{
     Graphics graphics = paintEvent.Graphics;

     SolidBrush backgroundBrush = new SolidBrush(this.BackColor);
     graphics.FillRectangle(backgroundBrush, ClientRectangle);

     graphics.SmoothingMode = SmoothingMode.AntiAlias;

     Rectangle rectangle = new Rectangle(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width - 1, ClientRectangle.Height - 1);
     GraphicsPath graphicsPath = RoundedRectangle(rectangle, cornerRadius, 0);
     Brush brush = new LinearGradientBrush(rectangle, gradientTop, gradientBottom, LinearGradientMode.Horizontal);
     graphics.FillPath(brush, graphicsPath);

     rectangle = new Rectangle(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width - 1, ClientRectangle.Height - 100);
     graphicsPath = RoundedRectangle(rectangle, cornerRadius, 2);
     brush = new LinearGradientBrush(rectangle, gradientTop, gradientBottom, LinearGradientMode.Horizontal);
     graphics.FillPath(brush, graphicsPath);
}

private GraphicsPath RoundedRectangle(Rectangle rectangle, int cornerRadius, int margin)
{
    GraphicsPath roundedRectangle = new GraphicsPath();
    roundedRectangle.AddArc(rectangle.X + margin, rectangle.Y + margin, cornerRadius * 2, cornerRadius * 2, 180, 90);
    roundedRectangle.AddArc(rectangle.X + rectangle.Width - margin - cornerRadius * 2, rectangle.Y + margin, cornerRadius * 2, cornerRadius * 2, 270, 90);
    roundedRectangle.AddArc(rectangle.X + rectangle.Width - margin - cornerRadius * 2, rectangle.Y + rectangle.Height - margin - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 0, 90);
    roundedRectangle.AddArc(rectangle.X + margin, rectangle.Y + rectangle.Height - margin - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90);
    roundedRectangle.CloseFigure();
    return roundedRectangle;
}

解决方法 1:

我是能够找到解决这个问题的办法。其实,问题是那 OnPaint 事件不叫为组合框。所以我不得不做以下更改。

public CustomComboBox()
{
    InitializeComponent();
    SetStyle(ControlStyles.UserPaint, true);
}

若要调用 setstyle () 方法在构造函数内的,所以,OnPaint() 事件将会被调用了

发现了这篇文章作为 helful:重写 OnPaint 永远不会调用

相同的解决方案可以用于自定义文本框。

官方微信
官方QQ群
31647020