Newsgroup: it.comp.lang.visual-basic
Titolo: METODI GRAFICI... AIUTO!

Ho realizzato un diagramma di Gantt in VB6 utilizzando come strumenti
grafici delle picture come contenitori e delle label come oggetti del
diagramma.
Questo risulta essere molto costoso in fatto di occupazione di spazio in
memoria.
Per questa ragione la gestione deve essere ottimizzata caricando/scaricando
i controlli label e ciò rallenta tutto in modo drastico.
Mi chiedevo se qualcuno di Voi è in grado di dirmi quali metodi grafici
leggeri 
posso utilizzare in alternativa tenendo conto che gli oggetti visualizzati
devono 
essere selezionati con il mouse e quindi non possono essere  Linee o 
controlli shape (in quanto non hanno eventi del mouse correlati).
GRAZIE!
--
Posted from 
smtp2.libero.it
 [193.70.192.52] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Io disegnerei tutto su una picturebox, e gestirei il drag degli elementi
tramite evento MouseMove della picturebox e un po' di codice per
identificare l'elemento grafico.
In qualsiasi caso l'uso di controlli windowed (dotati di hwnd) e'
decisamente troppo pesante per questi scopi.
--
Roal Zanazzi

 Mi chiedevo se qualcuno di Voi è in grado di dirmi quali
metodi grafici leggeri posso utilizzare in alternativa tenendo
conto che gli oggetti visualizzati devono essere selezionati
con il mouse e quindi non possono essere Linee o controlli
shape (in quanto non hanno eventi del mouse correlati).
Buttar via tutto e lavorare solo di grafica? Ma temo sia
troppo costoso, vero? Mi spiego con un esempio. Misero.
Option Explicit
Private Const mc_strTEXT    As String = "Clic"
Private Const mc_lngFCOLOR  As Long = vbRed
Private m_blnOnClic As Boolean
Private m_sngCurX   As Single
Private m_sngCurY   As Single
Private m_lngDColor As Long
Private Sub Form_Load( _
)
  Let AutoRedraw = True
  Let m_lngDColor = BackColor 'vbBlue
End Sub
Private Sub Form_MouseDown( _
  Button As Integer _
, Shift As Integer _
, X As Single _
, Y As Single _
)
  Let m_blnOnClic = True
  ForeColor = m_lngDColor
  Let CurrentX = m_sngCurX
  Let CurrentY = m_sngCurY
  Print mc_strTEXT
  Let m_sngCurX = X - TextWidth(mc_strTEXT)
  Let m_sngCurY = Y - TextHeight(mc_strTEXT)
  ForeColor = mc_lngFCOLOR
  Let CurrentX = m_sngCurX
  Let CurrentY = m_sngCurY
  Print mc_strTEXT
End Sub
Private Sub Form_MouseMove( _
  Button As Integer _
, Shift As Integer _
, X As Single _
, Y As Single _
)
  If m_blnOnClic Then
    ForeColor = m_lngDColor
    Let CurrentX = m_sngCurX
    Let CurrentY = m_sngCurY
    Print mc_strTEXT
    Let m_sngCurX = X - TextWidth(mc_strTEXT)
    Let m_sngCurY = Y - TextHeight(mc_strTEXT)
    ForeColor = mc_lngFCOLOR
    Let CurrentX = m_sngCurX
    Let CurrentY = m_sngCurY
    Print mc_strTEXT
  End If
End Sub
Private Sub Form_MouseUp( _
  Button As Integer _
, Shift As Integer _
, X As Single _
, Y As Single _
)
  Let m_sngCurX = X - TextWidth(mc_strTEXT)
  Let m_sngCurY = Y - TextHeight(mc_strTEXT)
  ForeColor = mc_lngFCOLOR
  Let CurrentX = m_sngCurX
  Let CurrentY = m_sngCurY
  Print mc_strTEXT
  Let m_blnOnClic = False
End Sub
Ovviamente tutto questo implicherebbe anche un certo
approfondimento dell'api grafica...
--
Ciao.
Maurizio

Condivido pienamente cio' che dici. Infatti hai esattamente descritto cio'
che io ho fatto per crearmi un gantt. Confermo che il risultato ottenuto non
risulta essere per niente pesante...





Immagina di avere più o meno 2000 oggetti 
nella tua PictureBox da gestire. Quando il periodo impegnato su Gantt è 
di circa un anno e mezzo la picture non può essere ridimensionata in modo 
da contenere tutti i controlli perchè ha un Width massimo di circa 32768 
Pixel. Anche ammesso che la picture riesca a contenerli, non credi sia troppo 
costoso caricare in memoria tutti quei controlli(2000 circa)?


Io per evitare questo ho optato per caricare e 
scaricare i controlli in eccesso nelle aree non visibili, ma questo ha 
ulteriormente rallentato il tutto.


Mi piacerebbe sapere con più precisione 
quali tecniche hai utilizzato per risolvere il problema e quanti oggetti 
gestisce il tuo diagramma e poi, è collegato dinamicamente ad una base 
dati?



Nel mio visualizzato non utilizzo nessun tipo di controllo tranne le barre
di scorrimento..
Ho due collection una per le barre e una per i dati delle ordinate
I dati vengono caricato  in una collection che io chiamo di "barre"  è una
struttura in cui vengono specificati la data iniziale e finale il colore un
testo da visualizzare
Il segreto per essere veloci è di riuscire ad eseguire il filtro e quindi il
ridisegno solo delle barre contenute nell range di date visualizzato
visualizzato in quel momento
Tieni conto che devi costruire una fun che esegue il ridisegno del tutto da
mettere nell'evento paint della finestra..
Altrimenti quando una finestra ci va sopra cancellerebbe il contenuto..
Io cio' messo una quindicina di giorni per sviluppare il tutto inserendo dei
metodi di zoom, operazione di drag & drop, trascinamento delle barre ...
Temo di essere stato breve ma il discorso sarebbe lungo ( e tra l'altro lo
scritto tanto tempo fa dovrei andare a vedermi il codice per essere piu
specifico) ma spero di averi dato delle dritte ...