需要两步:
1. 在构造函数里(其他初始化函数里也行)加入一下代码:
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
2. 重绘函数中,使用双缓冲(即先画到Bitmap上,再一次性画到控件上)
Bitmap bm = new Bitmap(this.Width, this.Height);
Graphics g = Graphics.FromImage(bm);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.FillRectangle(new SolidBrush(Color.Transparent), 0, 0, bm.Width, bm.Height);
//外轮廓
int outer_w = this.Width / 2 - _mMargins;
int outer_left = _mMargins + outer_w / 2;
int outer_right = outer_left + outer_w;
int outer_top = _mMargins;
int outer_bottom = (int)(this.Height - _mMargins - (1 + Root3 / 2) * outer_w);
//底部圆的圆心
int center_x = this.Width / 2;
int center_y = this.Height - _mMargins - outer_w;
//内部液柱
int inner_w = outer_w - 2 * _mPaddings;
int inner_left = outer_left + _mPaddings;
int inner_right = inner_left + inner_w;
int inner_top = outer_top + _mPaddings;
int inner_bottom = outer_bottom;
int inner_radius = this.Width / 2 - _mPaddings - _mMargins;
//计算现有的比例
float percent = (_mValue - _mMinimum) / (_mMaximum - _mMinimum);
int h = (int)((inner_bottom - inner_top) * percent);
inner_top = inner_bottom - h;
GraphicsPath outer_path = new GraphicsPath();
GraphicsPath inner_path = new GraphicsPath();
outer_path.AddLine(new Point(outer_left, outer_bottom), new Point(outer_left, outer_top));
outer_path.AddLine(new Point(outer_left, outer_top), new Point(outer_right, outer_top));
outer_path.AddLine(new Point(outer_right, outer_top), new Point(outer_right, outer_bottom));
outer_path.AddArc(new Rectangle(center_x - outer_w, center_y - outer_w, 2 * outer_w, 2 * outer_w), -60, 300);
inner_path.AddLine(new Point(inner_left, inner_bottom), new Point(inner_left, inner_top));
inner_path.AddLine(new Point(inner_left, inner_top), new Point(inner_right, inner_top));
inner_path.AddLine(new Point(inner_right, inner_top), new Point(inner_right, inner_bottom));
inner_path.AddArc(new Rectangle(center_x - inner_radius, center_y - inner_radius, 2 * inner_radius, 2 * inner_radius), -60, 300);
g.DrawPath(new Pen(_mOuterColor, 2.0F), outer_path);
g.FillPath(new SolidBrush(_mInnerColor), inner_path);
g.Dispose();
e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
e.Graphics.DrawImageUnscaled(bm, new Point(0, 0));