Newsgroup: it.comp.lang.visual-basic
Titolo: Help API-API

Chiedo aiuto per un problemino.
Ho fatto un programma che sposta e ruota un oggetto in 3D, naturalmente
colorato.
L'oggetto lo possiamo spostar e ruotare rispetto al proprio sistema di
riferimento.
Tutto questo funziona, ma....il problema nasce dal fatto che in esecuzione
noto uno sfarfallio dell'immagine.
Premetto che ho usato la funzione API
Esempio:
Dim punto(1 To 3) As PointApi
Dim Pp(1 To 3) As PointApi
Dim Q(1 To 3) As TDPoint
Dim Qr(1 To 3) As TDPoint
Dim I As Integer
punto(1).X = 100
punto(1).y = 100
punto(2).X = 0
punto(2).y = 100
punto(3).X = 0
punto(3).y = 0
Q(1).X = punto(1).X
Q(1).y = punto(1).y
Q(1).z = 0
Q(2).X = punto(2).X
Q(2).y = punto(2).y
Q(2).z = 0
Q(3).X = punto(3).X
Q(3).y = punto(3).y
Q(3).z = 0
Pp(1).X = Qr(1).X
Pp(1).y = Qr(1).y
Pp(2).X = Qr(2).X
Pp(2).y = Qr(2).y
Pp(3).X = Qr(3).X
Pp(3).y = Qr(3).y
'.....
Pic.FillStyle = 0
Pic.ForeColor = vbWhite
Pic.FillColor = RGB(225, 25, 247)
'Dim J As Integer
Dim JJ As Integer
Dim Start As Double
Dim dTime As Double
For J = 0 To 360
Pic.Refresh
  '  For I = 1 To 3
  '      Qr(I) = RotatePoint(Q(I), 1)
  '      Q(I) = Qr(I)
  '      Pp(I).X = Qr(I).X
  '      Pp(I).y = Qr(I).y
  '  Next
    RotateTriangle Q(), Pp()
    DrawTriangle Pic, Pp(), RGB(50, 20, 220)
    Start = Timer
    dTime = 0#
    Do While Timer < Start + dTime
    DoEvents
    Loop
Next
Public Function DrawTriangle(Pic As Object, punto() As PointApi, Color As
Long)
Dim Ppunto(1 To 3) As PointApi
Dim Wx As Double, Wy As Double
Wx = WindowX / 2
Wy = WindowY / 2
Ppunto(1).X = Wx + punto(1).X
Ppunto(1).y = Wy - punto(1).y
Ppunto(2).X = Wx + punto(2).X
Ppunto(2).y = Wy - punto(2).y
Ppunto(3).X = Wx + punto(3).X
Ppunto(3).y = Wy - punto(3).y
Pic.FillStyle = 0
Pic.ForeColor = vbWhite
Pic.FillColor = Color
Polygon Pic.HDC, Ppunto(1), 3
End Function
.......... qualcuno può darnmi una mano a risolvere il problema?
Grazie Ric

Non ho la minima idea di quale possa essere la soluzione al tuo problema...
una domanda: sei per caso di Brescia?.... Magari hai fatto L'ITIS?
Salutoni
Sergio

Per evitare lo sfarfallio devi creare un ContextDevice virtuale dove
disegnare il tuo oggetto con CreateCompatibleDC ( funzione API) , e poi
trassferirlo sul tuo contesto grafico con comandi di trasferimento tipo
BitBlt ( funzione API )
Ciao Biagio.

 ha scritto nel messaggio
news:UO8u9.31395$aL4.9...@news1.tin.it...

Ti ringrazio per la risposta, ma sono un vero principiante con le API.
Potresti  farmi un esempio?
Grazie e a presto.
By ric

 Ti ringrazio per la risposta, ma sono un vero principiante con le API.
Creare un device compatibile non č cosě banale (non č difficilissimo, ma uno
alle prime armi non ne uscirebbe).
Puoi ottenere automaticamente lo stesso risultato usando la picture con
AutoRedraw = true (unico caso in cui si dovrebbe usare il Refresh della
picture), disegni e poi porti tutto a video con un picture.Refresh.
Questo si chiama "double-buffering" dell'immagine, cioč la si disegna in
background e solo quando il disegno č finito lo si butta di colpo in primo
piano.
Ciao
--
' // Initialize the expression evaluator
Engines.Evaluator = CreateObject("
http://www.neodatatype.net
")
' // you can find resources for and from the NG here!
Me.SitoComune = "
http://www.it-lang-vb.net
"

 ha scritto nel messaggio
news:UO8u9.31395$aL4.9...@news1.tin.it...

Sono stato per lungo tempo impegnato con il lavoro, e non ho potuto fare
altro, ma scusa se ti scrivo adesso.
Il problema che avevo proposto tempo fa è questo : ho una serie di triangoli
(molti triangoli) che devo far muovere velocemente
ma devo anche colorarli.
Utilizzare le funzioni standard del VB risulta lento oltreché lo sfarfallio.
Mi hai consigliato di creare un  ContextDevice virtuale dove disegnare il
mio oggetto.
Ad esempio, in un modulo ho inserito.... oltre alla dichiarazioni delle
funzioni usate
Dim R As RECT
Dim SizeX As Long
Dim SizeY As Long
Public Const pi = 3.14159265358979
Public tHdc As Long
Public tBit As Long
Public Sub CreaBit(Pic As PictureBox)
tPen = CreatePen(0, 1, vbRed)
tHdc = CreateCompatibleDC(Pic.hdc)
tBit = CreateCompatibleBitmap(tHdc, Pic.ScaleWidth, Pic.ScaleHeight)
SizeX = Pic.ScaleWidth
SizeY = Pic.ScaleHeight
DeleteObject SelectObject(tHdc, tPen)
DeleteObject SelectObject(tHdc, tBit)
SetRect R, 0, 0, SizeX, SizeY
End Sub
inoltre ho creato la sub
Public Sub Render(hdc As Long)
Dim points(0 To 2) As POINTAPI ' vertici del poligono
Dim retval As Long  ' valore di ritorno della funzione
Dim I As Integer
FillRect tHdc, R, 255   'GetSysColorBrush (5)
'definizione delle coordinate dei vertici e caricamento nell'array.
points(0).X = 200 : points(0).Y = 100  ' primo vertice
points(1).X = 250 : points(1).Y = 150  ' secondo vertice
points(2).X = 200 : points(2).Y = 200  ' terzo vertice
FrmMain.Pic.ForeColor = vbBlue
retval = Polygon(hdc, points(0), 3)
End Sub
poi......
Render tHdc
BitBlt Pic.hdc, 0, 0, Pic.ScaleWidth, Pic.ScaleHeight, tHdc, 0, 0, vbSrcCopy
.............................
Il problema è : come posso ora colorare i miei triangoli?
Infatti anche se disegno un altro triangolo ovviamente il contorno viene
colorato con lo stesso colore di
FrmMain.Pic.ForeColor = vbBlue
Ti sarei grato per un esempio poichè non sono molto esperto in VB.
Saluti 
Ricca...@tiscalinet.it

 ma devo anche colorarli.
Ho creato una dll activex (in vb) con un insieme di classi che sfrutta le
funzioni API della GDI per queste cose (compreso il double buffering).
Non č ancora testata al 100% (causa tempo mancante), ma mi riprometto di
inviarla ugualmente al sito comune nel fine settimana :)
Se ti interessa ti posso mandare un'anteprima.
Ciao
--
using System.Gtk.Forms = "
http://www.neodatatype.net/windowsforms/sgf.aspx
"
mathParser = "
http://www.neodatatype.net
"
sitoComune = "
http://www.it-lang-vb.net
"