Newsgroup: it.comp.lang.visual-basic
Titolo: [?]Salvare il contenuto di una PictureBox

Ciao a tutti.
Non riesco a risolvere questo problema. Ho una PictureBox in cui disegno
alcune figure "a mano" (nel senso che uso i metodi grafici con coordinate,
tipo Line, Circle, Pset, etc.).
Su queste figure eseguo delle trasformazioni. Ho, però, bisogno di mantenere
memorizzata la figura di partenza, per poterci poi eseguire altre
trasformazioni, se voglio.
Avevo pensato di usare una seconda PictureBox in modo da mantenere in una il
disegno originale e poi ricopiarlo nella Picture di partenza all'occorrenza.
Ho provato a copiare il contenuto della prima PictureBox nell'altra, delle
stesse dimensioni, ma lo riesco a fare solo considerandola come una matrice,
e quindi copiandola punto per punto con due cicli for annidati: lo sfondo
della Picture è bianco, per cui copio tutti i punti non bianchi, definiti
dal colore colore_punto
For i=0 to num_righe
     For j=0 to num_colonne
          if (Picture1.Point(i1,i2)<>bianco) then
             Picture2.Pset(i1,i2),colore_punto
          EndIf
     Next j
Next i
Questo, ovviamente fa rallentare il processo di salvataggio e quello di
"ripristino" della figura.
Esiste un modo per salvare direttamente il contenuto di una Picture in
un'altra, in modo che il tutto sembri immediato?
Altra questione: ho tentato di salvare il contenuto della Picture in un
file. Ritrovo lo stesso problema già espresso sopra. Usando un file
sequenziale, ed un CommandDialogBox, definisco una sub relativa ad un
pulsante "Salva"
Private Sub Command7_Click()
 Dim i, j, temp As Long
 cdbox.Filter = "Files (*.ste)|*.ste"
 cdbox.DefaultExt = "ste"
 cdbox.FileName = ""
 cdbox.DialogTitle = "Salva Figura"
 cdbox.Flags = cdlOFNOverwritePrompt + cdlOFNPathMustExist
 cdbox.ShowSave
 If (cdbox.FileName = "") Then Exit Sub
 Open cdbox.FileName For Output As #1
 For i = 0 To num_righe
      For j = 0 To num_colonne
          temp = Picture1.Point(i, j)
          Write #1, temp
      Next i
 Next j
 Close 1
End Sub
(cdbox è il nome che ho dato al CommonDialogBox). Anche qui il tempo di
salvataggio (e quello di caricamento, ottenuto con una sub simile relativa
ad un pulsante "Carica") è piuttosto elevato.
Inoltre, qui ho un secondo problema. Non riesco ad impedire all'utente di
aprire file con estensioni diverse da quella definita di default (che è
l'unica giusta). Anche usando il flag cdlInvalidFileName (che mi sembrava
potesse far al caso mio) posso specificare estensioni non corrette.
Questo è un problema soprattutto quando ceco di caricare un file con
un'estensione non corretta, cioè se la scrivo direttamente: il fatto è che
l'applicazione mi si blocca, mentre io vorrei utilizzare un msgbox per
indicare che l'estensione è errata.
Sono ormai due giorni che ricerco in rete qualcosa la riguardo, ma non ho
trovato niente. Spero in un aiuto, o almeno in un consiglio su dove trovare
del materiale utile.
Grazie,
Davide.

 trasformazioni, se voglio.
.. MEGA CUT ..
Solo perchè siamo omonimi (o anonimi ?:)
MSDN ... istruzione SavePicture e LoadPicture ...
saluti

 trasformazioni, se voglio.
Se guardi attentamente le prorpietà del controllo picture, ti accorgerai che
esiste una proprietà picture e una image:
    image memorizza la superfice del controllo come la vedi tu, quindi con
tutto quello che ci hai disegnato sopra
    picture ammette solo oggetti picture
in pratica picture matiene la tua immagine invariata, immage restituisce l'
immagine tua + modifiche.
Per non avere problemi con le varie autoredraw, ridimensionamenti, refresh
che potrebbero ripristinarti la picture, perdendo le modifiche effettuate,
ti conviene sempre memorizzare la proprietà image in quella picture; se vuoi
memorizzare la tua immagine iniziale, salvala in un oggetto picture creato a
livello di form.(Poui crearti anche una matrice di oggetti picture a n
elementi per ottenere n Undo !)
Saluti
G.Chieli

 dal colore colore_punto
Form1.PictureBox.Picture = FormN.PictureBoxN.Picture
Ciao

Rispondo a tutti e tre, sperando che il messaggio non venga indentato in
modo incomprensibile.
Grazie per i suggerimenti, in effetti utilizzando il suggerimento di Zanna,
la modalità "image", e tramite le funzioni SavePicture e LoadPicture riesco
a fare quello che volevo in un tempo "umano".
(Comunque, image non la trovo tra le proprietà della PictureBox, ed ho
capito come usarla grazie ad una descrizione trovata in rete dopo estenuanti
ricerche).
Resta a questo punto il secondo problema: come faccio a intercettare
un'estensione sbagliata nel salvataggio e nel caricamento del mio file
immagine?
Mi basta anche un' indicazione di dove reperire materiale utile,
possibilemente in rete (su MSDN giro inutilmente tra gli argomenti relativi
ai file senza trovare nulla di veramente utile).
Grazie di nuovo,
Davide.

immagine?
Intercettare da dove ? Estensione sbagliata rispetto a cosa ?
Se si vuole trovare l' estensione in un nume di file occorre cercare dove
si trova l' ultimo "." (punto) nel nome. Se c'e', tutto quello che segue e'
l' estensione.
-- 
ciao, hal

 immagine?
... ancora, per estensione intendi l'estensione del file?
In genere ogni file ha un'intestazione che indica il formato (es i files zip
iniziano tutti con "PK").
Potrebbe esserti utile il sito 
http://www.wotsit.org/
Ciao


Veramente, cosě non mi funziona. Io ho due picture sulla stessa finestra, e
posso passare l'immagine creata in una delle due all'altra solo in questo
modo:
PictureBox1.Picture=PictureBox2.Image
altrimenti, non mi copia niente. In questo modo, perň, ho il problema che
poi non posso cancellare il contenuto della PictureBox2 semplicemente con un
PictureBox2.Cls
ma ho bisogno di copiarci sopra una Picture bianca, che mi "simula" il Cls.
Dove sbaglio?
Davide.

 PictureBox1.Picture=PictureBox2.Image
E' un po' che non ci gioco, quindi non ti posso rispondere.
Ti consiglio solo di provare a leggere l'help (e a smanettare) con la
proprietà AutoRedraw.
Di solito in questi casi fa miracoli :)
Ciao


Ok.
Grazie mille.