34

C#.NETで、グループボックスの境界線の色をプログラムで変更しようとしています。

更新:この質問は、.NETに切り替える前にwinformsシステムで作業していたときに尋ねられました。

4

7 に答える 7

42

ペイントイベントを追加するだけです。

    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));
        }
    }
于 2013-11-18T07:10:51.350 に答える
24

前の回答に基づいて、グループ ボックスのラベルを含むより良いソリューション:

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 を調整したいかもしれませんが、私の使用ではこれで十分です。

于 2011-04-29T02:12:52.813 に答える
6

境界線を描画するには、このメソッドに任意のオブジェクト (ボタンだけでなく) のペイント アクションを設定するだけです。

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

    }

元のようにきれいで丸みを帯びているわけではありませんが、はるかにシンプルです.

于 2012-11-30T21:32:05.693 に答える
1

これがすべてのケースに当てはまるかどうかはわかりませんが、このスレッドのおかげで、次を使用してプログラムで Paint イベントにすばやくフックしました。

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

乾杯!

于 2011-04-12T03:06:56.343 に答える
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

わかりませんが、この境界調整を達成しようとしている人に役立つかもしれません。

于 2018-05-21T15:19:03.450 に答える