本人想做一个自定义控件,使用双缓存绘制一条可以在刻度中移动的水平直线,定义了一个方法Usepaint来实现,使用定时器测试时(设置100ms),控件显示会出现这种问题,怎么解决,专家们给点解决方法吧,
而本人想要的是
而本人想要的是
public void Usepaint(double jd) { Bitmap bmp = new Bitmap(100, 100);//构造一块虚拟画布 Graphics g= Graphics.FromImage(bmp);//获得虚拟画布的设备 float cw = 100;//控件的大小 float ch = 100; float L = 100; float N = 8; this.Width = (int)cw; this.Height = (int)ch; Pen pen = new Pen(Color.MidnightBlue, 3);//画标尺线的笔 Point point1 = new Point(40, 0); Point point2 = new Point(40, 100); Point point3 = new Point(60, 0); Point point4 = new Point(60, 100); g.DrawLine(pen, point1, point2); g.DrawLine(pen, point3, point4); PointF pointx = new PointF(); PointF pointy = new PointF(); for (float i = 0; i < N + 1; i++)//画刻度 { if (!(i == 0 || i == N)) { pointx.X = 40; pointx.Y = 0 + L / N * i; pointy.X = 35; pointy.Y = 0 + L / N * i; g.DrawLine(pen, pointx, pointy); pointx.X = 60; pointx.Y = 0 + L / N * i; pointy.X = 65; pointy.Y = 0 + L / N * i; g.DrawLine(pen, pointx, pointy); } else { pointx.X = 40; pointx.Y = 0 + L / N * i; pointy.X = 30; pointy.Y = 0 + L / N * i; g.DrawLine(pen, pointx, pointy); pointx.X = 60; pointx.Y = 0 + L / N * i; pointy.X = 70; pointy.Y = 0 + L / N * i; g.DrawLine(pen, pointx, pointy); } } PointF point11 = new PointF();//画指示标尺 PointF point22 = new PointF(); if (jd>=0) { point11.X = 45; point11.Y = (float)(50 - 50 * jd / 90); point22.X = 55; point22.Y = (float)(50 - 50 * jd / 90); } else { point11.X = 45; point11.Y = (float)(50 + 50 * Math.Abs(jd) / 90); point22.X = 55; point22.Y = (float)(50 + 50 * Math.Abs(jd) / 90); } Pen pen0 = new Pen(Color.Black); g.DrawLine(pen0, point11, point22); Font F = new Font("System", 9); g.DrawString("90", F, Brushes.Black, 10, 0); g.DrawString("90", F, Brushes.Black, 68, 0); g.DrawString("0", F, Brushes.Black, 15, 42); g.DrawString("0", F, Brushes.Black, 73, 42); g.DrawString("-90", F, Brushes.Black, 7, 86); g.DrawString("-90", F, Brushes.Black, 63, 86); this.CreateGraphics().DrawImage(bmp, 0, 0); bmp.Dispose(); } private void timer1_Tick(object sender, EventArgs e) { pitching++; Usepaint(pitching); }
解决方案
20
可以将Usepaint(pitching)放到窗体的Paint事件中,定时时间到则用this.Invalidate()来重绘窗体内容
20
是的,你应该是没有在Paint中绘制,这样以前画的没有清除。你应该Paint中实现绘图,然后在计时器中pitching++,然后通过Invalidate触发重绘。Invalidate有一个带参数的重载,表示重绘指定区域,你调用那个会效率更高些。