代码之家  ›  专栏  ›  技术社区  ›  Danial Ahmed

如何重新绘制/更新表单的特定部分

c#
  •  0
  • Danial Ahmed  · 技术社区  · 7 年前

    Unsorted

    Sorted

    private float[] values;
    private int m=0;
    public Form1()
    {
        InitializeComponent();
        values =new float[Width];
    }
    
    private void Form1_Load(object sender, EventArgs e)
    {
        Random rnd = new Random();
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = rnd.Next(Height);
        }
    }
    void bubbleSort()
    {
        Task.Run(async () =>
        {
            for (m = 0; m < values.Length; m++)
            {
                for (int j = 0; j < values.Length - m - 1; j++)
                {
                    if (values[j] > values[j + 1])
                    {
                        float temp = values[j];
                        values[j] = values[j + 1];
                        values[j + 1] = temp;
                        Invalidate();
                    }
                }
                await Task.Delay(1000);
            }
        });
        //Update();
    }
    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        //var graphicsObj = this.CreateGraphics();
    
        Pen blackPen = new Pen(Color.Black, (float)0.5);
    
        for (int i = 0; i < values.Length; i++)
        {
                e.Graphics.DrawLine(blackPen, i, 0, i, values[i]);
        }
        if (m<values.Length)
        {
            bubbleSort();
        }
    }
    

    编辑:增加了延迟气泡排序现在我可以看到它重画和排序,但问题是,它再次重画所有的点。

    1 回复  |  直到 7 年前
        1
  •  1
  •   TaW    7 年前

    enter image description here

    float[] values =new float[555];
    int m=0;
    
    private void startButton_Click(object sender, EventArgs e)
    {
        Random rnd = new Random();
        for (int i = 0; i < values.Length; i++)
        {
            values[i] = rnd.Next(Height);
        }
        m=0;
        bubbleSort();
    }
    

    排序本身是不变的(从原来的帖子开始!),仅移动更新触发器:

    void bubbleSort()
    {
        for (m = 0; m < values.Length; m++)
        {
            for (int j = 0; j < values.Length - m - 1; j++)
            {
                if (values[j] > values[j + 1])
                {
                    float temp = values[j];
                    values[j] = values[j + 1];
                    values[j + 1] = temp;
                }
            }
            Refresh();   // Invalidate would be optimized away
        }
    }
    

    这个 Paint

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        for (int i = 0; i < values.Length; i++)
        {
            e.Graphics.DrawLine(Pens.Black, i, 0, i, values[i]);
            e.Graphics.DrawLine(Pens.White, i,  values[i], i, ClientSize.Height);
        }
    }
    

    笔记:

    • 如果我们触发 油漆 在循环的深处,事情变得痛苦 缓慢的
    • 如果我们使用 Invalidate ,通常是推荐的更新图形的方法,这种积累会是瞬间的。
    • 另外:一定要打开 Double-Buffering Form 避免闪烁!