Newsgroup: it.comp.lang.visual-basic
Titolo: Images su Form diversi

Avrei questo problema:
1) alcune, o anche una sola, Image sul Form1
2) dispongodi routine funzionanti per la rotazione e l'ingrandimento
    di porzioni di schermo, pixel per pixel, con Pset/Point,
    oppure con SetPixel/GetPixel.
3) vorrei trasferire una di queste Image sul Form2
4) vorrei anche poter seguire il trasferimento, ossia l'elaborazione
    della nuova immagine su Form2
Non ci sono mai riuscito.
Mi riesce di effettuare tutte queste operazioni soltanto alla pesante
condizione di usare un solo form sia per le Image sorgente sia per
le Image destinazione.
Ho provato ad usare SetFocus, ho dichiarato Public la Sub Form_Load
di Form1 ( images sorgenti ), senza risultato.
Qualcuno mi sa dare, gentilmente, spiegazioni in merito ?
ramarro.

 wrote in message
PZVi5.19098$dF5.3...@news.infostrada.it...


(...)
Avviata la copia dell'immagine da una form all'altra, posso anche ridurre ad
icona la form di origine (settata con AutoRedraw=True) senza conseguenze
negative per l'immagine.
Questo è il codice che ho usato nella Form1:
(NB.: Form1 e Form2 con ScaleMode = 3 'Pixels; Form1.Picture=...)
Private Sub Form_Click()
    Form2.Show
    Form2.Cls
    For x = 0 To Me.ScaleWidth
        For y = 0 To Me.ScaleHeight
            Form2.PSet (x, y), Me.Point(x, y)
        Next y
        DoEvents
    Next x
    Beep
End Sub
NB.: il DoEvents serve solo per mantenere il controllo delle form durante il
disegno dell'immagine.
    Ciao, Silvio.

 disegno dell'immagine.
vedo che il doevents l'hai messo tra un For/next e l'altro,
altrimenti viene Natale prima di riuscire a vedere qualcosa.
e purtroppo non si può mettere esterno anche all'altro
for next, il che sarebbe notevolmente meglio.
le mie routine sono più complicate, ma sostanzialmente equivalenti
per quanto riguarda le funzioni Pset / Point ( si possono usare
gli equivalenti Api  SetPixel & GetPixel, circa 2 volte più
veloci, ma non cambia la sostanza del problema, che
qui da me rimane invariato nei due casi)
l'unica differenza essendo il Me.  anzichè Form1.
ritieni che possa essere sufficiente una quisquiglia simile a
fare la differenza. ? lo dico per l'uditorio, per fare casistica mnemonica.
Io ovviamente proverò la sostituzione domani.
ti ringrazio.
ramarro.


Non credo che il Me possa fare tutta questa differenza.
    Ciao, Silvio.

(...)
Ho provato con una Image e anch'io ho avuto lo stesso risultato che hai
avuto tu tranne che, quando il controllo non è coperto, riesco comunque a
vedere
l'immagine mentre si disegna sulla Form2.
Se poi rendo Form1.AutoRedraw, l'Image comincia a "Flikkerare" e sulla Form2
viene copiato solo lo sfondo della Form1 :-(
L'unico modo per ovviare a questi problemi è, secondo me, quello di
utilizzare la proprietà Picture delle Form, oppure utilizzare i controlli
PictureBox (come le Form hanno .HDC e .AutoRedraw) invece delle Image.
Per tagliare la testa al toro, ho inserito una terza Form (Form3) che dovrà
caricare di volta in volta il contenuto della Image cliccata sulla Form1
(presuppongo che sulla Form1 ci sia una matrice di controlli Image)
    La Form3 la setto, in fase di progettazione, Appearence=0 (flat),
AutoRedraw=True, BorderStyle=0 (none)
    Nella Form1, quella con la matrice di controlli Image1, scrivo il
seguente codice:
Private Sub Image1_Click(Index As Integer)
    Disegna Image1(Index)
End Sub
Sub Disegna(img As Image)
    Dim k As Long
    Form2.Show
    Form2.Cls
    Form3.Picture = img.Picture
    Form3.Width = ScaleX(img.Picture.Width, 8, 1)
    Form3.Height = ScaleY(img.Picture.Height, 8, 1)
    For x = 0 To Form3.ScaleWidth
        For y = 0 To Form3.ScaleHeight
            Form2.PSet (x, y), Form3.Point(x, y)
                'oppure
            'SetPixel Form2.hdc, X, Y, GetPixel(Form3.hdc, X, Y)
        Next y
        ' Form2.Refresh '<- solo se usi le API _e_ Form2.Autoredraw=True
        DoEvents
    Next x
    Beep
End Sub
NB: al posto di SetPixel puoi usare anche SetPixelV che è più veloce
"because this function does not need to return the actual color used by the
device" (
http://www.vbapi.com
):
Declare Function SetPixelV Lib "gdi32.dll" (ByVal hdc As Long, ByVal X As
Long, ByVal Y As Long, ByVal crColor As Long) As Long
    Ciao, Silvio.