Questo semplice programma visualizza un grafico che scorre lungo l'asse delle Y. Utilizza DUE PictureBox ed un commandButton.
E' da giorni che tento di avere il medesimo risultato utilizzando però UNA SOLA PictureBox. Non vale il trucco di ridurre la dimensione del form perchè il tal caso BitBlt non copia l'immagine corretta.
Il programma è un adattamento semplificato di un progetto più complesso che utilizza una PictureBox larga circa 800 pixel e che quindi non può essere duplicata senza superare la larghezza del monitor.
Si riuscirà a trovare la soluzione, utilizzando cioè una sola picturebox ?
Grazie per l'aiuto


Option Explicit

Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x _
As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As _
Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As _
Long, ByVal dwRop As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim CentroX As Single

Private Sub Command1_Click()
Dim gradi As Single, y As Single
Dim Pi180 As Single
Const Scala = 100
Dim ret As Long
Pi180 = 3.14159 / 180
gradi = 0
y = 0
Do
DoEvents
Picture1.PSet (CentroX, y), vbBlack ' asse Y
Picture1.PSet (Sin(gradi * Pi180) * Scala + CentroX, y), vbRed
If y <= Picture1.ScaleHeight Then
Call Copia
Sleep 1: DoEvents ' un breve intervallo
Call RiCopia
y = Picture1.ScaleHeight - 1
Else
y = y + 1
End If
gradi = gradi + 1
Loop Until gradi > 500
End Sub

Private Sub Form_Load()
Width = Picture1.Width * 2 + 640
With Command1
.Caption = "Avvia"
.Left = 120
.Top = Picture1.Height + 360
End With
With Picture1
.Appearance = 0
.ScaleMode = 3 ' pixel
.AutoRedraw = True
.Top = 120
.Left = 120
End With
With Picture2
.Appearance = 0
.ScaleMode = 3 ' pixel
.AutoRedraw = False
.Width = Picture1.Width
.Height = Picture1.Height
.Top = 120
.Left = 120 + Picture1.Width + 240
End With
CentroX = Picture1.ScaleWidth / 2
Picture1.Line (CentroX, 0)-(CentroX, Picture1.ScaleHeight), vbBlack ' asse Y
'--- con la seguente istruzione il programma non funziona !!!
' Width = Picture1.Width + 360
End Sub

Private Sub Copia()
Dim ret As Long
Dim srcHDC As Long, dstHDC As Long
Dim xDst As Long, yDst As Long
Dim dxDst As Long, dyDst As Long
Dim xSrc As Long, ySrc As Long

srcHDC = Picture1.hDC
dstHDC = Picture2.hDC
xDst = 0: yDst = -1
dxDst = Picture2.ScaleWidth
dyDst = Picture2.ScaleHeight
xSrc = 0: ySrc = 0
ret = BitBlt(dstHDC, xDst, yDst, dxDst, dyDst, srcHDC, xSrc, ySrc, &HCC0020)
End Sub

Private Sub RiCopia()
Dim ret As Long
Dim srcHDC As Long, dstHDC As Long
Dim xDst As Long, yDst As Long
Dim dxDst As Long, dyDst As Long
Dim xSrc As Long, ySrc As Long

srcHDC = Picture2.hDC
dstHDC = Picture1.hDC
xDst = 0: yDst = 0
dxDst = Picture1.ScaleWidth
dyDst = Picture1.ScaleHeight
xSrc = 0: ySrc = 0
ret = BitBlt(dstHDC, xDst, yDst, dxDst, dyDst, srcHDC, xSrc, ySrc, &HCC0020)
End Sub