自己动手写ProgressBar[带百份比,水平/垂直显示]

本文介绍如何动手创建一个自定义的ProgressBar控件,该控件具备水平和垂直显示、渐变颜色以及显示百分比的功能。通过使用Graphics类的画图函数,如DrawRectangle、FillRectangle和DrawString,实现了控件的绘制,包括边框、填充和文本显示。在OnPaint事件中处理了水平和垂直布局的绘制,并特别提到Invalidate()函数在更新显示中的作用。由于条件限制,源代码未能一同提供。

大家好,.net默认的ProgressBar控件是没有百份比的...所以我也动手自己写一个(完成后的效果如下图):

(一)实现目的:

1.实现渐变颜色设置

2.边框颜色,

3.垂直,水平显示

3.可以自定义百份比

(二)实现关键

     简单点来说,控件是画出来的...

     Graphics类里有很多的画图函数...

     (1)画四边框函数:g.DrawRectangle(Pen, Rectangle);

     (2)画四方体函数:g.FillRectangle(Brush, Rectangle);

      画渐变的画刷是这样:

      LinearGradientBrush    brush_1 = new LinearGradientBrush(tmp1,this.ColorIn, this.ColorOut, LinearGradientMode.Vertical);

     (3)写文本函数:g.DrawString(string,Font,Brush,x,y,StringFormat);

 

                System.Drawing.StringFormat drawFormat = new StringFormat(StringFormatFlags.DirectionVertical);//画垂直文本的设置模式

                SizeF Str_size = g.MeasureString(this.Text, this.Font);
                float x = (this.ClientRectangle.Width - Str_size.Height) / 2 + this.ClientRectangle.X;
                float y = (this.ClientRectangle.Height - Str_size.Width) / 2 + this.ClientRectangle.Y;
                if (this.isShadow)//画阴影
                {
                    SolidBrush ShadowBrush = new SolidBrush(Color.FromArgb(150, Color.Black));//特殊画刷,画阴影
                    g.DrawString(this.Text, this.Font, ShadowBrush, x + 1, y + 1,drawFormat);//这是画文本函数
                    ShadowBrush.Dispose();
                }
                SolidBrush TextBrush = new SolidBrush(this.ForeColor);
                g.DrawString(this.Text, this.Font, TextBrush, x, y,drawFormat);
                TextBrush.Dispose();

 

 

(三)画图一般都是再重写OnPaint函数里来实现:

        protected override void OnPaint(PaintEventArgs e)
        {
            if (!this.IsDisposed)
            {

                if (this.Sketchpad == null)
                {
                    this.DrawBorder();//初始化与画边
                }


                Image img = new Bitmap(this.Sketchpad);
                Graphics g = Graphics.FromImage(img);

               
                if (this.DisplayStyle == ProgressDisplayStyle.Horizontal)//水平
                {
                    this.DrawHorizontal(g);
                    g.TextRenderingHint = TextRenderingHint.AntiAlias;
                    this.DrawStringV(g);
                }
                else //垂直
                {
                    this.DrawVertical(g);
                    g.TextRenderingHint = TextRenderingHint.AntiAlias;
                    this.DrawStringH(g);
                }

                e.Graphics.DrawImage(img, this.ClientRectangle);

                img.Dispose();
                g.Dispose();
            }
        }

 

还要注意一个问题:this.Invalidate();函数会引发OnPaint函数

 

现在我还不能上传文件的地方,源代码先不上传。。
有什么问题大家请留言。。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值