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); } }

Rispondi quotando