具有圆边的自定义GroupBox

The*_*Jon 2 c# groupbox winforms

我在Visual Studio中有一个关于UI的问题,在C#中.我想让我的groupbox自定义如下:

组合框设计实例

然后,我也希望它的消耗取决于用户的屏幕分辨率,因此组框的大小不固定,我需要它例如80%的屏幕.

所以我的问题实际上是两个问题:

  1. 制作一个groupbox costum
  2. 使其宽80%(例如)宽屏幕.

编辑:感谢这个答案:如何在win表单中制作组框文本对齐中心? 我设法做了我想要的颜色,现在我只是错过了圆角.有任何想法吗?

Rez*_*aei 5

作为选项,您可以创建源自以下内容的自定义控件GroupBox:

  • 您需要计算圆角矩形.为此,作为选项,您可以使用AddArc方法并将弧添加到路径中矩形的四个角.
  • 要使用填充样式绘制标题背景,可以使用a HatchBrush.因此,为标题填充样式添加属性.这样,您可以HatchStyle为标题背景使用不同的值.
  • 要使用不同的标题颜色和标题字体,请添加一些要控制的属性.
  • 在更完整的实现中,您应该以一种将新值设置为属性的方式实现属性,从而通过调用重新绘制控件this.Invalidate().
  • 调整大小时防止闪烁通过在构造函数中设置DoubleBuffered为打开双缓冲true.
  • 要在角落中使用透明背景,请使用GroupBoxRenderer.DrawParentBackground. 截图

在此输入图像描述

using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
public class RoundPanel : GroupBox
{
    public RoundPanel()
    {
        this.DoubleBuffered = true;
        this.TitleBackColor = Color.SteelBlue;
        this.TitleForeColor = Color.White;
        this.TitleFont = new Font(this.Font.FontFamily, Font.Size + 8, FontStyle.Bold);
        this.BackColor = Color.Transparent;
        this.Radious = 25;
        this.TitleHatchStyle = HatchStyle.Percent60;
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        GroupBoxRenderer.DrawParentBackground(e.Graphics, this.ClientRectangle, this);
        var rect = ClientRectangle;
        using (var path = GetRoundRectagle(this.ClientRectangle, Radious))
        {
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
            rect = new Rectangle(0, 0,
                rect.Width, TitleFont.Height + Padding.Bottom + Padding.Top);
            if(this.BackColor!= Color.Transparent)
                using (var brush = new SolidBrush(BackColor))
                    e.Graphics.FillPath(brush, path);
            var clip = e.Graphics.ClipBounds;
            e.Graphics.SetClip(rect);
            using (var brush = new HatchBrush(TitleHatchStyle,
                TitleBackColor, ControlPaint.Light(TitleBackColor)))
                e.Graphics.FillPath(brush, path);
            using (var pen = new Pen(TitleBackColor, 1))
                e.Graphics.DrawPath(pen, path);
            TextRenderer.DrawText(e.Graphics, Text, TitleFont, rect, TitleForeColor);
            e.Graphics.SetClip(clip);
            using (var pen = new Pen(TitleBackColor, 1))
                e.Graphics.DrawPath(pen, path);
        }
    }
    public Color TitleBackColor { get; set; }
    public HatchStyle TitleHatchStyle { get; set; }
    public Font TitleFont { get; set; }
    public Color TitleForeColor { get; set; }
    public int Radious { get; set; }
    private GraphicsPath GetRoundRectagle(Rectangle b, int r)
    {
        GraphicsPath path = new GraphicsPath();
        path.AddArc(b.X, b.Y, r, r, 180, 90);
        path.AddArc(b.X + b.Width - r - 1, b.Y, r, r, 270, 90);
        path.AddArc(b.X + b.Width - r - 1, b.Y + b.Height - r - 1, r, r, 0, 90);
        path.AddArc(b.X, b.Y + b.Height - r - 1, r, r, 90, 90);
        path.CloseAllFigures();
        return path;
    }
}
Run Code Online (Sandbox Code Playgroud)