繁体   English   中英

更改 NumericUpDown 的边框颜色

[英]Change Border Color of NumericUpDown

我对 C# 很陌生,有一个问题。 我已经能够通过将它们的 FlatStyle 更改为“Flat”来更改按钮的边框 colors 等。 使用NumericUpDown ,我无法更改 FlatStyle。 我希望仍然能够使用向上和向下箭头,因此仅使用其他东西来覆盖边缘是行不通的。 这是我在代码中所做的简化版本:

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace bordertest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            BackColor = Color.Black;
            numericUpDown1.BackColor = Color.Red;
        }
    }
}

您可以从NumericUpDown派生,添加BorderColor属性,覆盖OnPaint并根据边框颜色绘制边框。

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
public class MyNumericUpDown : NumericUpDown
{
    private Color borderColor = Color.Blue;
    [DefaultValue(typeof(Color), "0,0,255")]
    public Color BorderColor
    {
        get { return borderColor; }
        set
        {
            if (borderColor != value)
            {
                borderColor = value;
                Invalidate();
            }
        }
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        if (BorderStyle != BorderStyle.None)
        {
            using (var pen = new Pen(BorderColor, 1))
                e.Graphics.DrawRectangle(pen,
                    ClientRectangle.Left, ClientRectangle.Top,
                    ClientRectangle.Width - 1, ClientRectangle.Height - 1);
        }
    }
}

在此处输入图像描述

注意:作为旁注,此控件引发绘画事件,如果出于任何原因有人想要在没有 inheritance 的情况下实现相同的行为,他们可以处理绘画事件并绘制边框; 然而,作为一种通用解决方案和可重用的解决方案,派生控件更有意义。

private void numericUpDown_Paint(object sender, PaintEventArgs e)
{
    var c = (NumericUpDown)sender;
    ControlPaint.DrawBorder(e.Graphics, c.ClientRectangle,
        Color.Red, ButtonBorderStyle.Solid);
    var r = new Rectangle(1, 1, c.Width - 2, c.Height - 2);
    e.Graphics.SetClip(r);
}

平面数字向上向下

我创建了一个支持BorderColorButtonHighlightColor的 FlatNumericUpDown 。 您可以下载或克隆它:

在此处输入图像描述

覆盖WndProc以使用标准ControlPaint呈现功能绘制 NumericUpDown(但它可以应用于许多其他控件)边框的自定义控件版本。

这允许在不费力的情况下绘制边框(实际上,没有:),并且有多个开箱即用的 styles。

BorderStyle属性是shadowed ,以返回扩展的ButtonBorderStyle值,其中包括例如除了默认的Solid之外的DottedDashed样式。

在 class 中添加了一个公共的BorderColor属性,它当然会出现在 PropertyGrid 中; 它允许更改边框的颜色。
它默认为Color.DarkGray ,类似于SystemColors.ControlDark
您可以使用与Reza Aghaei相同的 Attribute 样式来指定 RGB 值,而不是"DarkGray" ,如果您想要精确的话。


将此 class 添加到项目中,构建项目,在工具箱中找到自定义控件,然后像往常一样将其放在表单上(以防您不知道如何处理它:)

► 请注意,您可以对许多其他标准控件(包括通常不会引发 Paint 事件的 TextBox 控件)和您自己设计的所有自定义控件/组件使用相同的技术

这是它的样子:

NumericUpdown 自定义边框样式 自定义 NumericUpdown PropertyGrid


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

[DesignerCategory("Code"), ToolboxItem(true)]
public class NumericUpDownEx : NumericUpDown
{
    private const int WM_PAINT = 0x000F;
    private ButtonBorderStyle m_BorderStyle = ButtonBorderStyle.Solid;
    private Color m_BorderColor = Color.DarkGray;

    public NumericUpDownEx() { }

    public new ButtonBorderStyle BorderStyle {
        get => m_BorderStyle;
        set {
            if (m_BorderStyle != value) {
                m_BorderStyle = value;
                Invalidate();
            }
        }
    }

    [DefaultValue(typeof(Color), "DarkGray")]
    public Color BorderColor {
        get => m_BorderColor;
        set {
            if (m_BorderColor != value) {
                m_BorderColor = value;
                Invalidate();
            }
        }
    }

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        switch (m.Msg) {
            case WM_PAINT:
                if (IsHandleCreated) {
                    using (var g = Graphics.FromHwndInternal(this.Handle)) {
                        ControlPaint.DrawBorder(g, ClientRectangle, m_BorderColor, m_BorderStyle);
                    }
                    m.Result = IntPtr.Zero;
                }
                break;
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM