72 messaggi dal 18 gennaio 2007
Buongiorno a tutti.
Dovendo disegnare, in un controllo Panel (System.Windows.Forms), la posizione del cursore con due linee perpendicolari, capita che, in modo completamente casuale, persistano in disegno linee o porzioni di esse, anche se cancellate tramite riapplicazione della DrawReveribleLine.
Questo sia applicando lo stile:

SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true)

che senza.

Qualcuno saprebbe darmi un consiglio?
Grazie.
DR
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

dinoerre ha scritto:

persistano in disegno linee o porzioni di esse

Non saprei dire con certezza il perché stia succedendo però ho l'impressione che il programma - in determinate situazioni - non vada a ridisegnare la precedente reversible line per farla scomparire.

Possono restarne dei frammenti quando vengono ridisegnate porzioni di interfaccia, in risposta ad interazioni dell'utente (es. hover su un bottone).
Se l'evento in cui ridisegni la linea non viene sollevato, ecco che ti restano delle tracce nel form.

Ovviamente non ti posso dare consigli precisi perché non ho sottomano il tuo codice sorgente, ma forse proverei a cambiare la strategia di ridisegno. Userei una coda, così da essere sicuro di non perdermi alcuna vecchia linea.
  • Ogni volta che disegni una linea, pompa le sue coordinate in una coda.
  • Ogni volta che devi rimuovere le vecchie linee, scoda tutte le coordinate dalla coda. Non ha importanza quante siano: le scodi tutte finché la coda non è vuota.


Ecco dello pseudocodice, qui sto usando un'istanza della classe generica Queue.
//coda sarà di tipo Queue<Tuple<Point, Point>>
//la ciclo finché contiene elementi
while (coda.Any()){
  //scodo un elemento
  var tupla = coda.Dequeue();

  //qui userai le proprietà Item1 e Item2 di tupla per ridisegnare la linea (omissis)
}

//qui ottieni le coordinate delle nuove linee da disegnare
var ordinata = new Tuple<Point, Point>(new Point(50, 0), new Point(50, 100));
var ascissa = new Tuple<Point, Point>(new Point(0, 50), new Point(100, 50));

//qui le disegni (omissis)

//e qui le pompi nella coda
coda.Enqueue(ordinata);
coda.Enqueue(ascissa);


ciao,
Moreno
Modificato da BrightSoul il 17 settembre 2014 09.03 -

Enjoy learning and just keep making
72 messaggi dal 18 gennaio 2007
Grazie.
Ho poi risolto con un codice piu' accurato.
Avevi probabilmente ragione: il problema doveva essere nel codice, anche se avendo riscritto l'intera gestione non so bene dove.
Carina l'idea delle code, anche se probabilmente un pochino pesante, per me (e' un sw che deve correre).
Ciao e grazie.
Dino
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Dino,

dinoerre ha scritto:

Carina l'idea delle code, anche se probabilmente un pochino pesante

Vorrei chiarire: non si tratta di un servizio di code come può essere MSMQ o altro. Usare la classe Queue<T> non è poi così differente da una List<T>, è solo un tipo di collezione di oggetti in memoria ottimizzata per l'uso first-in first-out. Probabilmente riusciresti a pomparci svariate migliaia di oggetti al millisecondo.

Ho letto anche l'altro tuo post: prima di prendere qualsiasi decisione dovresti usare il Profiler di Visual Studio per capire quali sono i punti "caldi" del tuo programma. Con quello strumento riesci a capire se c'è una particolare routine che rappresenta un collo di bottiglia per l'intero programma. Non è detto che il problema dipenda direttamente dal disegno di una reversible line, magari c'è un punto in cui i thread si stanno contendendo una risorsa, oppure un metodo che viene invocato più del necessario.

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.