Creazione rettangolo (disegno) con timer

venerdì 29 gennaio 2010 - 12.10

sarto76 Profilo | Junior Member

Ciao a tutti, il mio problema è il seguente:
voglio che mi si crei un rettangolo nel mio form (dovrei usare l'evento Form1_Paint(object sender, PaintEventArgs e), ma il problema è che non voglio che mi appaia completo subito, voglio che ad ogni secondo ne crei uno con la lunghezza che aumenta ogni secondo
es: secondo 1 la lunghezza del rettangolo è x
secondo 2 la lunghezza sarà x+1
eccetera.
Sarebbe tipo una Progressbar, ad ogni secondo il rettangolo si allunga.
Ho creato un timer, e nell'evento tick volevo inserire la creazione del rettangolo ma non mi accetta il comando Graphics g = e.Graphics, perchè non ho a disposizione e (il PaintEventArgs)
Qualcuno mi può aiutare?
Grazie Ciao Massimo

aiedail92 Profilo | Expert

Ciao

Puoi usare il metodo CreateGraphics:

Graphics g = this.CreateGraphics();

Quando hai finito di usarlo, ricordati di liberare la memoria usando il metodo Dispose:

g.Dispose();

Luca

sarto76 Profilo | Junior Member

Grazie mille, funziona.
L'unico problema è che adesso non mi fa il refresh del rettangolo, c'è quello nuovo ma sotto resta quello vecchio.
Ho provato con this.Invalidate(), ma così non me lo vede più del tutto...
Qualche idea?
Grazie mille ancora

sarto76 Profilo | Junior Member

scusate, sono sempre ancora io che mi auto-rispondo...
Oltre al problema di prima ce n'è un secondo...
io nella mia applicazione, oltre a questo rettangolo che si accorcia, ho un bottone avanti che mi carica delle domande da un database (avanti-->domanda successiva)
Ho notato che se metto il timer quando faccio avanti il programma non funziona più bene, si blocca e segue il ritmo del timer.
Il time non dovrebbe già essere un thread separato? Mi sbaglio?
Grazie ancora
Massimo

aiedail92 Profilo | Expert

Per quanto riguarda il primo problema, hai due soluzioni:

1) Chiami la funzione Clear per pulire lo sfondo, e dopo ci disegni sopra come prima:

Graphics g = this.CreateGraphics(); g.Clear(this.BackColor); // ...

2) All'interno del timer chiami solo la funzione Invalidate, quindi sposti tutto il disegno nel gestore dell'evento Paint

// In tuoTimer_Tick: this.Invalidate(); //// Se vuoi forzare il disegno immediato, decommenta questa riga // this.Update();
// In tuaForm_Paint Graphics g = e.Graphics; // ...

Per quanto riguarda la seconda domanda, invece, non ho capito il problema...

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5