问题描述
我想绘制一个图形,当将轨迹栏移动到其他值时,图形将改变形状。例如对于value = 1
接下来,我为value = 2绘制第二个数字
我只想要一种形状。我该怎么办?形状应在跟踪栏的每个值中更改。这里是我的DrawTickedCircle代码:
private void DrawTickedCircle(Graphics gr,Pen circle_pen,Pen tick_pen,float cx,float cy,float rx,float ry,float num_theta,float num_ticks,float tick_fraction)
{
List<PointF> points = new List<PointF>();
float dalpha = (float)(2 * Math.PI / num_theta);
float alpha = 0;
for (int i = 0; i < num_theta; i++)
{
float x = (float)(cx + rx * Math.Cos(alpha));
float y = (float)(cy + ry * Math.Sin(alpha));
points.Add(new PointF(x,y));
alpha += dalpha;
}
gr.Drawpolygon(circle_pen,points.ToArray());
dalpha = (float)(2 * Math.PI / num_ticks);
alpha = 0;
float rx1 = rx * (1 - tick_fraction);
float ry1 = ry * (1 - tick_fraction);
for (int k = 0; k < num_ticks; k++)
{
float x1 = (float)(cx + rx * Math.Cos(alpha));
float y1 = (float)(cy + ry * Math.Sin(alpha));
float x2 = (float)(cx + rx1 * Math.Cos(alpha));
float y2 = (float)(cy + ry1 * Math.Sin(alpha));
gr.DrawLine(tick_pen,x1,y1,x2,y2);
alpha += dalpha;
}
}
对于trackBarScroll函数:
private void trackBar1_Scroll(object sender,EventArgs e)
{
var g = pictureBox1.CreateGraphics();
float cx = ClientRectangle.Width / 2;
float cy = ClientRectangle.Height / 2;
float rx = Math.Min(cx,cy);
float ry = rx;
rx *= 0.8f;
ry *= 0.6f;
if (trackBar1.Value == 1)
{
DrawTickedCircle(g,Pens.Black,cx,cy,rx,ry,8,0.1F);
}
else if (trackBar1.Value == 2)
{
DrawTickedCircle(g,Pens.Red,255,0.1f);
}
g.dispose();
}
我不想在PaintEvent中绘制它们。感谢您的帮助!
解决方法
这个答案可能要迟几天,但是要回答您的问题:您应该使控件无效,并在值更改时强制其立即重新绘制。这可以通过Refresh
方法来完成。在创建Graphics
对象之前,将以下行添加到轨迹栏的Scroll事件中。
pictureBox1.Refresh();