在C#中减慢动画

时间:2011-06-03 23:01:28

标签: c# winforms user-interface animation bezier

我有一个类项目,它使用Windows窗体创建一个控制第二个窗体的GUI。第二种形式是带有位图的DrawingForm。使用背景工作者,我在位图上绘制随机的连续Bezier曲线。这是一个简单的程序,因此它能够快速绘制它们,每秒数百个。我想添加一个滑块,让我可以控制线条绘制的速度。换句话说,我不想设置要在计时器上绘制的每条曲线,这会导致它看起来停止并每秒启动数百次。我已经筋疲力尽地搜索谷歌,任何有关如何做到这一点的提示都会很棒。谢谢!

编辑:这是一段代码段。这段代码在我的班级中用于我的绘图表格。它的构造函数是从我的主GUI /用户控件类调用的。

    // this is the code executed by the background thread
    // it can run continously without hanging the user interface thread
    // except that it draws to a bitmap (with the bMapDC) instead of to the form
    private void backgroundWorkerDrawing_DoWork(object sender, DoWorkEventArgs e)
    {

        for (int i = 0; i < 100000000; i++)
        {
            if (scribbleOn == true)
            {
                curveColor = changeColor(curveColor);
                Pen pen = new Pen(curveColor, penThickness);

                if (i == 0) // initial curve should start in center, the rest of the points will be random
                {
                    lastX = GUI.rand.Next(0, bMapWidth); //used to store the x coordinate where the curve ends
                    lastY = GUI.rand.Next(0, bMapHeight); //used to store the y coordinate where the curve ends

                    bMapDC.DrawBezier(pen, initialX, initialY, GUI.rand.Next(0, bMapWidth), GUI.rand.Next(0, bMapHeight),
                    GUI.rand.Next(0, bMapWidth), GUI.rand.Next(0, bMapHeight), lastX, lastY);
                }

                if (i > 0) // used for all curves after the first one. 
                {
                    int tempX = GUI.rand.Next(0, bMapWidth); //used to store the x coordinate where the curve ends
                    int tempY = GUI.rand.Next(0, bMapHeight); //used to store the y coordinate where the curve ends

                    bMapDC.DrawBezier(pen, lastX, lastY, GUI.rand.Next(0, bMapWidth), GUI.rand.Next(0, bMapHeight),
                    GUI.rand.Next(0, bMapWidth), GUI.rand.Next(0, bMapHeight), tempX, tempY);

                    lastX = tempX; // sets the last x coordinate of the last curve for next loop
                    lastY = tempY;  // sets the last y coordinate of the last curve for next loop
                }
                pen.Dispose(); // free up resources from the pen object
            }   
            else i = 0;
        }
    }

    // timer event handler causes the form to be repreatedly invalidated
    // This causes the paint event handler to keep going off,
    // which causes the bMap that is continously being drawn to
    // by the background thread to be continously redisplayed in the form.
    // We will see other ways to do this that may be better.
    private void timerInvalidate_Tick(object sender, EventArgs e)
    {
        Invalidate();
    }

    private void DrawingForm_Shown(object sender, EventArgs e)
    {
        lock (bMap)
        {
            bMapHeight = bMap.Height;  // set the vars that keep track of the size of the bMap
            bMapWidth = bMap.Width;

            initialX = bMapWidth / 2; // start the curve at the center of the bMap
            initialY = bMapHeight / 2;
            bMapDC = Graphics.FromImage(bMap);  // setup the DC (device context) to allow drawing to the bMap)
            backgroundWorkerDrawing.RunWorkerAsync();   // start the background thread
            timerInvalidate.Enabled = true;  // start the timer that will cause periodic Invalidates
        }
    }

1 个答案:

答案 0 :(得分:0)

你可以制作线程并使用睡眠

private Thread SimulaciaArts;
public Animation(){
public SpleepValue { get; set;}

SimulaciaArts = new Thread(new ThreadStart(simuluj));
}

public void simuluj(){

//anything
Thread.Sleep(SleepValue);

}

并且在gui中你必须使用委托

 delegate void Invoker();
 private void setSpeed()
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new Invoker(setSpeed));
                return;
            }
 Simulation.SleepValue=Speed;
}

希望它很好。