Newsgroup: it.comp.lang.visual-basic
Titolo: [?] chi ha fatto un client mud? (aiutino per gdi)

scusate il parziale off topic, ma un paio di settimane fa ero in chat
con una persona del ng che mi ha inviato in dcc un "esperimento" di
grafica vettoriale per verificare l'efficienza di alcune funzioni
della gdi e delle operazioni di rotazione matriciale.
l'eseguibile mi era stato presentato come la possibile evoluzione di
un client mud per il momento solo testuale.
volevo chiedere a questa persona se puo' mandarmi i sorgenti o, per lo
meno, l'elenco delle funzioni di disegno della gdi che ha utilizzato,
visto che con msdn proprio non mi ci trovo --ok come consultazione
post mortem, ma per trovare qualcosa non ce la faccio proprio .|--.
il discorso e' che devo disegnare alcuni rettangoli, alcune linee ed
alcuni cerchietti all'interno di una picturebox e ho bisogno di
muoverli in modo molto efficiente. utilizzando le varie picture.line e
picture.circle ho troppo flickering. il movimento puo' essere una
semplice traslazione o anche una rotazione attorno ad un punto.
saluti e scusate ancora.
-- 
Gianni Rondinini
Icem s.r.l.
Tel: 
+39 0545 78036
Fax: 
+39 0545 78727

semplice traslazione o anche una rotazione attorno ad un punto.
Per eliminare il flickering devi utilizzare la tecnica del doppio
buffering: te la posso spiegare a basso livello (perche' cosi' l'ho
realizzata in C++) con le API di Windows, provvedi tu a traslarle in
Visual Basic.
In pratica tu non disegni direttamente nel device context del
picturebox ma su uno creato ex novo partendo da quello del picture
box.
sia hdc il device context del picture box (Picture1.hDC)
con 
hBuf=CreateCompatibleDC(hdc)
ti crei il device context compatibile
le operazioni di disegno le fai con le api di Windows all'interno di
questo hBuf (usi MoveToEx, LineTo, CreatePen, etc.)
quando hai finito copi qs device context nell'originale con
BitBlt(hdc,0,0,p.right,p.bottom,hBuf,0,0,SRCCOPY);
dove p e' una variabile RECT che contiene la dimensione del rettangolo
in cui disegnare (la puoi ottenere con GetClientRect(Picture1.hwnd, p)
Probabilmente c'e' una tecnica simile anche direttamente in Visual
Basic, ma il mio background di programmatore C++ mi porta spesso a
risolvere questi problemi sempre e comunque a basso livello...
Ciao
 
Stefano "HappyMan" (Lago Maggiore - NO)
--
Personal Web 
http://www.sgr.info
Email happyman69 (at) 
libero.it

 anche direttamente in Visual Basic
Si :) AutoRedraw = False a design time, e
a run time:
PictureBox.Cls
'Disegna
PictureBox.Refresh
Il mio consiglio per questo genere di cose
e' di utilizzare le DirectX. La rete, ed il
sito Microsoft, sono pieni di esempi e
tutorial. Con 
VB.NET
 ci sono le DX9 corredate
di un ricco e completo tutorial.
In alternativa puoi usare le API grafiche,
in particolare le ottime Poly* (PolyLine ad
esempio), la Ellipse, ecc., sempre con la
tecnica del double-buffering ovvero
AutoRedraw a False (disegni in memoria) e poi
mandi un refresh.
hth,
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
UGIdotNET - 
http://www.ugidotnet.org

 [SNIP]
P.S. Per quale MUD? Io giocavo su Lumen et Umbra
(Immortale-Santo) ed ho partecipato alla creazione di
Revolution MUD (ancora chiuso al pubblico), in continuo
sviluppo da un paio di anni.


 picture.circle ho troppo flickering.
Guarda sul sito comune.
C'è un mio progetto in un activex che incapsula le funzioni della GDI e fa
(dovrebbe :)) quello che chiedi
Fammi sapere
Ciao