在TrackBar中设置另一个值后,GDI替换图形

问题描述

我想绘制一个图形,当将轨迹栏移动到其他值时,图形将改变形状。例如对于value = 1

pic1

接下来,我为value = 2绘制第二个数字

pic2

我只想要一种形状。我该怎么办?形状应在跟踪栏的每个值中更改。这里是我的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();