在C#.NET中,我试图以编程方式更改组框中边框的颜色。

更新:在我们切换到.NET之前,当我在winforms系统上工作时,问了这个问题。

===============>>#1 票数:34

只需添加绘画事件。

    private void groupBox1_Paint(object sender, PaintEventArgs e)
    {
        GroupBox box = sender as GroupBox;
        DrawGroupBox(box, e.Graphics, Color.Red, Color.Blue);
    }


    private void DrawGroupBox(GroupBox box, Graphics g, Color textColor, Color borderColor)
    {
        if (box != null)
        {
            Brush textBrush = new SolidBrush(textColor);
            Brush borderBrush = new SolidBrush(borderColor);
            Pen borderPen = new Pen(borderBrush);
            SizeF strSize = g.MeasureString(box.Text, box.Font);
            Rectangle rect = new Rectangle(box.ClientRectangle.X,
                                           box.ClientRectangle.Y + (int)(strSize.Height / 2),
                                           box.ClientRectangle.Width - 1,
                                           box.ClientRectangle.Height - (int)(strSize.Height / 2) - 1);

            // Clear text and border
            g.Clear(this.BackColor);

            // Draw text
            g.DrawString(box.Text, box.Font, textBrush, box.Padding.Left, 0);

            // Drawing Border
            //Left
            g.DrawLine(borderPen, rect.Location, new Point(rect.X, rect.Y + rect.Height));
            //Right
            g.DrawLine(borderPen, new Point(rect.X + rect.Width, rect.Y), new Point(rect.X + rect.Width, rect.Y + rect.Height));
            //Bottom
            g.DrawLine(borderPen, new Point(rect.X, rect.Y + rect.Height), new Point(rect.X + rect.Width, rect.Y + rect.Height));
            //Top1
            g.DrawLine(borderPen, new Point(rect.X, rect.Y), new Point(rect.X + box.Padding.Left, rect.Y));
            //Top2
            g.DrawLine(borderPen, new Point(rect.X + box.Padding.Left + (int)(strSize.Width), rect.Y), new Point(rect.X + rect.Width, rect.Y));
        }
    }

===============>>#2 票数:19 已采纳

在前面的答案的基础上,一个更好的解决方案,包括组框的标签:

groupBox1.Paint += PaintBorderlessGroupBox;

private void PaintBorderlessGroupBox(object sender, PaintEventArgs p)
{
  GroupBox box = (GroupBox)sender;
  p.Graphics.Clear(SystemColors.Control);
  p.Graphics.DrawString(box.Text, box.Font, Brushes.Black, 0, 0);
}

您可能希望调整文本的x / y,但对于我的使用,这是正确的。

===============>>#3 票数:6

只需在此方法的任何对象(不仅仅是按钮)上设置绘制操作以绘制边框。

    private void UserControl1_Paint(object sender, PaintEventArgs e)
    {
        ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, Color.Red, ButtonBorderStyle.Solid);

    }

它仍然不像原版那样漂亮和圆润,但它更简单。

===============>>#4 票数:4

FWIW,这是我使用的实现。 它是GroupBox的子项,但不仅允许设置BorderColor,还允许设置边框的粗细和圆角的半径。 此外,您可以为GroupBox标签设置所需的缩进量,并使用右侧的缩进缩进缩进。

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

namespace BorderedGroupBox
{
    public class BorderedGroupBox : GroupBox
    {
        private Color _borderColor = Color.Black;
        private int _borderWidth = 2;
        private int _borderRadius = 5;
        private int _textIndent = 10;

        public BorderedGroupBox() : base()
        {
            InitializeComponent();
            this.Paint += this.BorderedGroupBox_Paint;
        }

        public BorderedGroupBox(int width, float radius, Color color) : base()
        {
            this._borderWidth = Math.Max(1,width);
            this._borderColor = color;
            this._borderRadius = Math.Max(0,radius);
            InitializeComponent();
            this.Paint += this.BorderedGroupBox_Paint;
        }

        public Color BorderColor
        {
            get => this._borderColor;
            set
            {
                this._borderColor = value;
                DrawGroupBox();
            }
        }

        public int BorderWidth
        {
            get => this._borderWidth;
            set
            {
                if (value > 0)
                {
                    this._borderWidth = Math.Min(value, 10);
                    DrawGroupBox();
                }
            }
        }

        public int BorderRadius
        {
            get => this._borderRadius;
            set
            {   // Setting a radius of 0 produces square corners...
                if (value >= 0)
                {
                    this._borderRadius = value;
                    this.DrawGroupBox();
                }
            }
        }

        public int LabelIndent
        {
            get => this._textIndent;
            set
            {
                this._textIndent = value;
                this.DrawGroupBox();
            }
        }

        private void BorderedGroupBox_Paint(object sender, PaintEventArgs e) =>
            DrawGroupBox(e.Graphics);

        private void DrawGroupBox() =>
            this.DrawGroupBox(this.CreateGraphics());

        private void DrawGroupBox(Graphics g)
        {
            Brush textBrush = new SolidBrush(this.ForeColor);
            SizeF strSize = g.MeasureString(this.Text, this.Font);

            Brush borderBrush = new SolidBrush(this.BorderColor);
            Pen borderPen = new Pen(borderBrush,(float)this._borderWidth);
            Rectangle rect = new Rectangle(this.ClientRectangle.X,
                                            this.ClientRectangle.Y + (int)(strSize.Height / 2),
                                            this.ClientRectangle.Width - 1,
                                            this.ClientRectangle.Height - (int)(strSize.Height / 2) - 1);

            Brush labelBrush = new SolidBrush(this.BackColor);

            // Clear text and border
            g.Clear(this.BackColor);

            // Drawing Border (added "Fix" from Jim Fell, Oct 6, '18)
            int rectX = (0 == this._borderWidth % 2) ? rect.X + this._borderWidth / 2 : rect.X + 1 + this._borderWidth / 2;
            int rectHeight = (0 == this._borderWidth % 2) ? rect.Height - this._borderWidth / 2 : rect.Height - 1 - this._borderWidth / 2;
            // NOTE DIFFERENCE: rectX vs rect.X and rectHeight vs rect.Height
            g.DrawRoundedRectangle(borderPen, rectX, rect.Y, rect.Width, rectHeight, (float)this._borderRadius);

            // Draw text
            if (this.Text.Length > 0)
            {
                // Do some work to ensure we don't put the label outside
                // of the box, regardless of what value is assigned to the Indent:
                int width = (int)rect.Width, posX;
                posX = (this._textIndent < 0) ? Math.Max(0-width,this._textIndent) : Math.Min(width, this._textIndent);
                posX = (posX < 0) ? rect.Width + posX - (int)strSize.Width : posX;
                g.FillRectangle(labelBrush, posX, 0, strSize.Width, strSize.Height);
                g.DrawString(this.Text, this.Font, textBrush, posX, 0);
            }
        }

        #region Component Designer generated code
        /// <summary>Required designer variable.</summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>Clean up any resources being used.</summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
                components.Dispose();

            base.Dispose(disposing);
        }

        /// <summary>Required method for Designer support - Don't modify!</summary>
        private void InitializeComponent() => components = new System.ComponentModel.Container();
        #endregion
    }
}

为了使它工作,你还必须扩展基础Graphics类(注意:这是我在这里尝试创建圆角Panel控件时在这里找到的一些代码派生的,但我找不到原始帖子链接到这里):

static class GraphicsExtension
{
    private static GraphicsPath GenerateRoundedRectangle(
        this Graphics graphics,
        RectangleF rectangle,
        float radius)
    {
        float diameter;
        GraphicsPath path = new GraphicsPath();
        if (radius <= 0.0F)
        {
            path.AddRectangle(rectangle);
            path.CloseFigure();
            return path;
        }
        else
        {
            if (radius >= (Math.Min(rectangle.Width, rectangle.Height)) / 2.0)
                return graphics.GenerateCapsule(rectangle);
            diameter = radius * 2.0F;
            SizeF sizeF = new SizeF(diameter, diameter);
            RectangleF arc = new RectangleF(rectangle.Location, sizeF);
            path.AddArc(arc, 180, 90);
            arc.X = rectangle.Right - diameter;
            path.AddArc(arc, 270, 90);
            arc.Y = rectangle.Bottom - diameter;
            path.AddArc(arc, 0, 90);
            arc.X = rectangle.Left;
            path.AddArc(arc, 90, 90);
            path.CloseFigure();
        }
        return path;
    }

    private static GraphicsPath GenerateCapsule(
        this Graphics graphics,
        RectangleF baseRect)
    {
        float diameter;
        RectangleF arc;
        GraphicsPath path = new GraphicsPath();
        try
        {
            if (baseRect.Width > baseRect.Height)
            {
                diameter = baseRect.Height;
                SizeF sizeF = new SizeF(diameter, diameter);
                arc = new RectangleF(baseRect.Location, sizeF);
                path.AddArc(arc, 90, 180);
                arc.X = baseRect.Right - diameter;
                path.AddArc(arc, 270, 180);
            }
            else if (baseRect.Width < baseRect.Height)
            {
                diameter = baseRect.Width;
                SizeF sizeF = new SizeF(diameter, diameter);
                arc = new RectangleF(baseRect.Location, sizeF);
                path.AddArc(arc, 180, 180);
                arc.Y = baseRect.Bottom - diameter;
                path.AddArc(arc, 0, 180);
            }
            else path.AddEllipse(baseRect);
        }
        catch { path.AddEllipse(baseRect); }
        finally { path.CloseFigure(); }
        return path;
    }

    /// <summary>
    /// Draws a rounded rectangle specified by a pair of coordinates, a width, a height and the radius
    /// for the arcs that make the rounded edges.
    /// </summary>
    /// <param name="brush">System.Drawing.Pen that determines the color, width and style of the rectangle.</param>
    /// <param name="x">The x-coordinate of the upper-left corner of the rectangle to draw.</param>
    /// <param name="y">The y-coordinate of the upper-left corner of the rectangle to draw.</param>
    /// <param name="width">Width of the rectangle to draw.</param>
    /// <param name="height">Height of the rectangle to draw.</param>
    /// <param name="radius">The radius of the arc used for the rounded edges.</param>
    public static void DrawRoundedRectangle(
        this Graphics graphics,
        Pen pen,
        float x,
        float y,
        float width,
        float height,
        float radius)
    {
        RectangleF rectangle = new RectangleF(x, y, width, height);
        GraphicsPath path = graphics.GenerateRoundedRectangle(rectangle, radius);
        SmoothingMode old = graphics.SmoothingMode;
        graphics.SmoothingMode = SmoothingMode.AntiAlias;
        graphics.DrawPath(pen, path);
        graphics.SmoothingMode = old;
    }

    /// <summary>
    /// Draws a rounded rectangle specified by a pair of coordinates, a width, a height and the radius
    /// for the arcs that make the rounded edges.
    /// </summary>
    /// <param name="brush">System.Drawing.Pen that determines the color, width and style of the rectangle.</param>
    /// <param name="x">The x-coordinate of the upper-left corner of the rectangle to draw.</param>
    /// <param name="y">The y-coordinate of the upper-left corner of the rectangle to draw.</param>
    /// <param name="width">Width of the rectangle to draw.</param>
    /// <param name="height">Height of the rectangle to draw.</param>
    /// <param name="radius">The radius of the arc used for the rounded edges.</param>

    public static void DrawRoundedRectangle(
        this Graphics graphics,
        Pen pen,
        int x,
        int y,
        int width,
        int height,
        int radius)
    {
        graphics.DrawRoundedRectangle(
            pen,
            Convert.ToSingle(x),
            Convert.ToSingle(y),
            Convert.ToSingle(width),
            Convert.ToSingle(height),
            Convert.ToSingle(radius));
    }
}

===============>>#5 票数:1

我已经实现了相同的边界,对于新手可能更容易理解:

    private void groupSchitaCentru_Paint(object sender, PaintEventArgs e)
    {
        Pen blackPen = new Pen(Color.Black, 2);
        Point pointTopLeft = new Point(0, 7);
        Point pointBottomLeft = new Point(0, groupSchitaCentru.ClientRectangle.Height);
        Point pointTopRight = new Point(groupSchitaCentru.ClientRectangle.Width, 7);
        Point pointBottomRight = new Point(groupSchitaCentru.ClientRectangle.Width, groupSchitaCentru.ClientRectangle.Height);

        e.Graphics.DrawLine(blackPen, pointTopLeft, pointBottomLeft);
        e.Graphics.DrawLine(blackPen, pointTopLeft, pointTopRight);
        e.Graphics.DrawLine(blackPen, pointBottomRight, pointTopRight);
        e.Graphics.DrawLine(blackPen, pointBottomLeft, pointBottomRight);
    }
  1. 在GroupBox控件上设置Paint事件。 在此示例中,我的控件的名称是“groupSchitaCentru”。 由于参数e,人们需要这个事件。
  2. 使用System.Drawing.Pen类设置笔对象: https//msdn.microsoft.com/en-us/library/f956fzw1(v = vs.110) .aspx
  3. 设置表示控件所代表的矩形角的点。 使用控件的属性ClientRectangle来获取其尺寸。 我用于TopLeft(0,7),因为我想尊重控件的边框,并绘制关于其文本的线条。 要获得有关坐标系统的更多信息,请访问: https//docs.microsoft.com/en-us/dotnet/framework/winforms/windows-forms-coordinates

我不知道,可能有助于有人想要实现这种边界调整的事情。

===============>>#6 票数:1

我不确定这是否适用于所有情况,但是由于这个线程,我们很快就以编程方式使用以下方法连接到Paint事件:

GroupBox box = new GroupBox();
[...]
box.Paint += delegate(object o, PaintEventArgs p)
{
    p.Graphics.Clear(someColorHere);
};

干杯!

  ask by Amy Patterson translate from so

未解决问题?本站智能推荐:

1回复

更改组框的标题颜色,但不更改组框中的文本?

我的winform上有一个groupbox,我想更改标题/标题的颜色但不使用ForeColor因为我不希望组框中的文本发生变化。
3回复

如何继承基本文本框以提供彩色边框

我有一个winform应用程序,我们在内部使用。 它在每个25“页面”(用户控件)上有许多单独的控件。 我们的用户群更喜欢非常技术性的应用......他们希望TextBox在需要的字段中被标记为蓝色(如果输入数据,颜色应该消失)。 他们希望TextBox更改为绿色,如果已更改数据以提醒他们
4回复

禁用组框时如何更改组框的字体颜色

我在c#中使用Groupbox,首先,它已启用。 当我使用Groupbox1.Enabled = false ,它的前景色(以及其中的所有前景色)都更改为默认黑色。 甚至命令label1.Forecolor = Color.White不起作用。 (哪个label1在Groupbox1
1回复

尝试从“组框”中删除控件时出现C#奇怪的错误

我目前面临一个非常奇怪的问题。 我只是想从组框中删除所有控件,但是它并不能删除所有控件。 现在看来,这确实像是Microsoft端上的错误。 我尝试了多种不同的技术来删除这些控件,但没有一个起作用。 我还有另外两种方法,一次只能删除一个控件(不,我不能为所有控件循环调用它),并且在这里工
2回复

如何在C#中更改Windows窗体上Groupbox的边框粗细?

我没有找到任何帮助我解决旧问题的解决方案...是否可以通过改变颜色使它们更厚或更明显? 如果是的话,一些代码会很棒......或者只是提示如何做到这一点......
1回复

输入带有2个组框的下一个文本框

我有两个分组框,第一个分组框有3个文本框,第二个分组框有1个文本框。 我添加了以下代码: 但是Enter仅在第一个组框中起作用,并且跳过按钮并跳过第二个组框中。 我该怎么办?
2回复

如何重设组框项目? [重复]

这个问题已经在这里有了答案: 重置groupBox内成员的方法 3个答案 单击按钮后,我想清洁组框项目。 我尝试了一些代码块,但它们不适用于重置控件。 我不想删除或删除它,我只想重置组框中的项目。 这适用于删除组框项目。 或这个 看
1回复

动态添加和删除组框

我有一个包含两个按钮的表单。 第一个使用此处理程序将一些GroupBoxes添加到表单中: 第二个应该删除窗体中的每个GroupBoxes , 但是单击时并不是所有的 GroupBoxes 都消失了 : 为什么我的删除按钮无法删除每个GroupBox ?
1回复

单击按钮后,使用TAB无法访问组框

我有一个表单有两个组框(和其他控件,它的组框创建问题),一个'SAVE'按钮将表单数据保存到数据库和'NEW FORM'按钮重置表单(ex txtName.clear(); rbCash.checked = false )。 组合框有几个单选按钮并具有tabindex的设置。 现在,用户
3回复

如何在winforms中更改禁用复选框的前景色

我在具有表单的Windows应用程序中工作。此表单包含一个具有一些复选框的组框。 我已将此组框设置为禁用。 现在我的问题是复选框文本的前色。它变成浅灰色,如下图所示。 如何更改复选框文本的前景颜色,使其看起来不像禁用(浅灰色)。