gpt4 book ai didi

c# - 具有圆边的自定义 GroupBox

转载 作者:行者123 更新时间:2023-12-02 18:15:17 31 4
gpt4 key购买 nike

我有一个关于 Visual Studio 中 C# 中的 UI 的问题。我想让我的组框自定义为如下所示:

GROUP BOX DESIGN EXAMPLE

然后,我还希望它的扩展取决于用户的屏幕分辨率,因此组框的大小不是固定的,例如我需要它占屏幕的 80%。

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

  1. 制作 Groupbox 服装
  2. 使其占屏幕宽度(例如)80%。

编辑:感谢这个答案:How to make group box text alignment center in win forms?我设法用颜色做到了我想要的,现在我只是缺少圆角。有什么想法吗?

最佳答案

作为一个选项,您可以创建派生自 GroupBox 的自定义控件:

  • 您需要计算圆角矩形形状。为此,您可以选择使用 AddArc方法并向路径中矩形的四个角添加圆弧。
  • 要使用阴影样式绘制标题背景,您可以使用 HatchBrush 。因此,添加标题填充样式的属性。这样你就可以使用不同的HatchStyle标题背景值。
  • 要拥有不同的标题颜色和标题字体,请添加一些属性来控制。
  • 在更完整的实现中,您应该以这样的方式实现属性:为属性设置新值会导致通过调用 this.Invalidate() 重新绘制控件。
  • 要防止在调整大小时出现闪烁,请通过设置 DoubleBuffered 打开双缓冲。在构造函数中设置为 true
  • 要在角落具有透明背景,请使用 GroupBoxRenderer.DrawParentBackground屏幕截图

enter image description here

代码

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;
}
}

关于c# - 具有圆边的自定义 GroupBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39226946/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com