本人想做一个自定义控件,使用双缓存绘制一条可以在刻度中移动的水平直线,定义了一个方法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有一个带参数的重载,表示重绘指定区域,你调用那个会效率更高些。