Dibuje múltiples dibujos a mano alzada de Polilínea o Curva - Agregar función Deshacer

Estoy tratando de crear una aplicación de dibujo simple con funciones de deshacer y rehacer. Supongo que puede agregar lo que está dibujando en una lista y recurrir a la lista para dibujar todo. Luego, deshacer debería eliminar el último elemento agregado y volver a dibujar todo nuevamente. El problema es, ¿cómo agrego lo que he dibujado en una lista y uso esa lista para deshacer?

Estoy usando el método de redibujo de mapa de bits. Así es como dibujo:

    Point start, end;
    bool painting;
    private List<PointF> myPoints = new List<PointF>();

    private void pnlMain_MouseDown(object sender, MouseEventArgs e)
    {
        start = e.Location;
        painting = true;
    }

    private void pnlMain_MouseUp(object sender, MouseEventArgs e)
    {
        painting = false;
    }

    private void pnlMain_MouseMove(object sender, MouseEventArgs e)
    {
        if (painting == true)
        {
            end = e.Location;
            g.DrawLine(p, start, end);
            myPoints.Add(e.Location);
            pnlMain.Refresh();
            start = end;
        }
    }

    private void btnUndo_Click(object sender, EventArgs e)
    {
        g.Clear(cldFill.Color);
        if (myPoints.Count > 2)
        {
            myPoints.RemoveAt(myPoints.Count - 1);
            g.DrawCurve(p, myPoints.ToArray());
        }
        pnlMain.Refresh();
        //This works but you have to spam it to get rid of
        //a line and does some weird connections.
    }

Respuestas a la pregunta(1)

Su respuesta a la pregunta