C# Winform自定义控件_进度条(Progress)

前言

C# 自带的进度条缺少数值显示,且外观单一,可以通过自定义控件重写一个进度条功能;

一、创建自定义控件项

        1.在项目中新建项(不懂的可以看新建Button那篇文章);

        2.在弹出窗口中,选择Windows Forms -->自定义控件-->修改名称(myProgress.cs)-->添加;

        3.继承类改为Control,当前项就创建完成了。

二、修改代码

        1.显示百分比

bool showPercent = false;
[Category("Behavior1")]
[Description("显示百分比")]
public bool ShowPercent
{
     get { return showPercent; }
     set
     {
         showPercent = value;
         Invalidate();
     }
}
float showPercentPos = 50;
[Category("Behavior1")]
[Description("百分比显示位置(%)")]
public float ShowPercentPos
{
     get { return (int)showPercentPos; }
     set
     {
         showPercentPos = value;
         Invalidate();
     }
}

        2.边框设置

int borderWidth = -1;
[Category("Behavior1")]
[Description("边框宽度")]
public int BorderWidth
{
    get { return borderWidth; }
    set
    {
        borderWidth = value;
        pen.Width = borderWidth;
        Invalidate();
    }
}

Color borderColor = Color.Black;
[Category("Behavior1")]
[Description("边框颜色")]
public Color BorderColor
{
    get { return borderColor; }
    set
    {
        borderColor = value;
        pen.Color = borderColor;
        Invalidate ();
    }
}

        3.值设置

double value = 24;
[Category("Behavior1")]
[Description("当前值")]
public double Value
{
    get { return value; }
    set
    {
        this.value = value;
        Invalidate();
    }
}

private double max = 100;
[Category("Behavior1")]
[Description("最大值")]
public double Max
{
    get { return max; }
    set
    {
        max = value;
        Invalidate();
    }
}

private double min = 0;
[Category("Behavior1")]
[Description("最小值")]
public double Min
{
    get { return min; }
    set
    {
        min = value;
        Invalidate();
    }
}

        4.其他设置

Color bColor = Color.Lime;
[Category("Behavior1")]
[Description("背景颜色")]
public Color BColor
{
    get { return bColor; }
    set
    {
        bColor = value;
        Invalidate();
    }
}

Font strfont = new Font("宋体", 12);
[Category("Behavior1")]
[Description("显示字体")]
public Font StrFont
{
    get { return strfont; }
    set
    {
        strfont = value;
        Invalidate();
    }
}

三、修改功能代码

        添加对应属性的功能代码

protected override void OnPaint(PaintEventArgs pe)
{
    base.OnPaint(pe);

    //显示最大最小值
    double showData = 0;
    if (Max <= 0)
        showData = 1;
    else
    {
        showData = this.Value / Max;
        if (showData > 1) showData = 1;
        if (showData < 0) showData = 0;

        if(value > max) value = max;
        if(value < min) value = min;
    }
    
    //显示百分比
    if (ShowPercent)
    {
        pe.Graphics.FillRectangle(new SolidBrush(bColor), ClientRectangle);
        if(borderWidth > 0)
        {
            pe.Graphics.DrawRectangle(pen, ClientRectangle.X + (pen.Width - 1), ClientRectangle.Y + (pen.Width - 1), ClientRectangle.Width - (2 * pen.Width - 1), ClientRectangle.Height - (2 * pen.Width - 1));
        }
        pe.Graphics.FillRectangle(new SolidBrush(Color.Lime), ClientRectangle.X + pen.Width, ClientRectangle.Y + pen.Width, (float)(showData * ClientRectangle.Width - 2 * pen.Width), ClientRectangle.Height - 2 * pen.Width);

        //显示数字
        SizeF fontSize = pe.Graphics.MeasureString(showData.ToString("p2"), strfont);
        pe.Graphics.DrawString(showData.ToString("p2"), strfont, new SolidBrush(ForeColor), (float)(ClientRectangle.Width - fontSize.Width)*(showPercentPos/100), (ClientRectangle.Height - fontSize.Height) / 2);
        return;
    }
    //不显示百分比
    pe.Graphics.FillRectangle(new SolidBrush(Color.Lime), ClientRectangle.X, ClientRectangle.Y + pen.Width, (float)(showData * ClientRectangle.Width ), ClientRectangle.Height - 2 * pen.Width);
}

四、最终样式

        调用方法和正常控件相同(可以直接调用progress1.Value)。

  

五、声明

        此方法是基于本人现工作内容总结,包括网络查询学习内容,如有侵权请告知。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值