Buongiorno a tutti,

sto realizzando uno usercontrol che dovrebbe visualizzare un manico di chitarra e la pressione di alcune corde, in base ad alcuni metodi che settano una lista di corde da premere sui vari tasti del manico.

ora, ho scritto nell'evento guitarcontrol_paint tutte le primitive grafiche per realizzare una rudimentale chitarra (con line ho disegnato le corde e i tasti), e con dei cerchietti fillellipse realizzo i tasti da premere sulle relative corde. e fin qua funziona tutto bene. ora il problema è il metodo pubblico play, che permette di cambiare tasti e corde da premere quando viene chiamato. play setta la nuova lista di tasti e corde e chiama il metodo refresh, che dovrebbe ridisegnare il controllo con la nuova configurazione. e si nota ogni qual volta viene chiamato play() uno sfarfallio molto fastidioso. vi scrivo i metodi come li ho implementati, badate che vi ho descritto una versione semplificata, in realtà i miei metodi realizzano con dei pallini grigi le corde da premere "dopo" e con dei pallini rossi le corde da premere in quel momento. play permette di scambiare i pallini grigi con quelli rossi e di impostare i nuovi pallini grigi. tramite il codice sarà tutto più chiaro.

codice:
 public void Play(List<tasto> next)
        {
            PremiNow = PremiDopo;
            PremiDopo = next;
            this.Refresh();
        }
       
        private void GuitarControl_Load(object sender, EventArgs e)
        {

        }

        private void GuitarControl_Paint(object sender, PaintEventArgs e)
        {
            Pen p = new Pen(Color.Silver);
            SolidBrush r = new SolidBrush(Color.Red);
            SolidBrush g = new SolidBrush(Color.Gray);
            e.Graphics.FillRectangle(new SolidBrush(Color.Brown), new Rectangle(0, 0, 1020, 140));
            e.Graphics.DrawLine(p, new Point(20, 20), new Point(1000, 20));
            e.Graphics.DrawLine(p, new Point(20, 40), new Point(1000, 40));
            e.Graphics.DrawLine(p, new Point(20, 60), new Point(1000, 60));
            e.Graphics.DrawLine(p, new Point(20, 80), new Point(1000, 80));
            e.Graphics.DrawLine(p, new Point(20, 100), new Point(1000, 100));
            e.Graphics.DrawLine(p, new Point(20, 120), new Point(1000, 120));
            for (int i = 0; i < 10; i++)
            {
                e.Graphics.DrawLine(p, new Point(i*40 -20, 10), new Point(i*40-20, 125));
            }
            foreach (tasto t in PremiDopo)
            {
                e.Graphics.FillEllipse(g, t.tastiera * 40 - 12, t.corda * 20 - 7, 14, 14);
            }
            
            foreach( tasto t  in PremiNow){
                e.Graphics.FillEllipse(r,t.tastiera* 40 -10, t.corda *20 - 5,10,10);
            }
   
        }