Newsgroup: it.comp.lang.visual-basic
Titolo: [?] StdPicture, hDC & c.

Qualcuno mi sa dire come accidenti posso fare a salvare un'immagine di cui
conosco solo l'hDC?
Non voglio passare attraverso oggetti "fisici" come PictureBox, quindi la
Call BitBlt(Picture1.hDC, ...)
non vale.
E poi come accidenti si usa la StdPicture.Render? Non mi riesce di usarla
:(e esempi zero)
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.it
"

 ha scritto nel messaggio
news:alabpk$ph0$1...@monty.lombardiacom.it...

Felice di aiutarti per la prima volta !
Da post di "hal" su google
Occorre fare un doppio loop basato sulle dimensioni dell' immagine e del
form.
Per disegnare l' immagine puoi usare il metodo PaintPicture del form oppure
il metodo Render della Picture.
Dato che su internet ci sono un sacco di esempi che usano PaintPicture
o BitBlt (cerca con le parole "tile", "bitmap" e "visual basic"), ma non
sono
riuscito a trovare niente (in vb) che usasse Render, neanche su MSDN :-(
ti posto un esempio che usa quest' ultimo.
ciao, hal
----------------- inizio codice ----------
'// in un form vuoto:
Option Explicit
'// qui facciamo il disegno nel resize in modo che, qualsiasi cosa faccia
'// l' utente, noi abbiamo sempre il nostro sfondo bello affiancato
'//
Private Sub Form_Resize()
    ' se il form e' iconizzato non serve sbattersi ;-)
    If WindowState = vbMinimized Then Exit Sub
    Dim oldRedraw As Boolean    ' salva lo stato di AutoRedraw
    oldRedraw = AutoRedraw
    AutoRedraw = True
    Cls
    '// viene caricata l' immagine da un file che dovrebbe essere
    '// nella maggior parte delle installazioni di windows
    '// eventualmente sostituire con un altro file
    Tile Me, LoadPicture(Environ$("windir") & "\Coffee Bean.bmp")
    AutoRedraw = oldRedraw      ' ripristina lo stato di AutoRedraw
End Sub
'// n.b. la funzione puo' essere messa pubblica in un modulo e ricevere
'// come parametro qualsiasi cosa abbia un hDC e i vari ScaleMode ecc.
'// 
p.es
.: Form, PictureBox, Printer ...
'//
Private Sub Tile(a_Canvas As Object, a_Pic As IPicture)
    Dim X As Long, Y As Long
    Dim wDest As Long, hDest As Long
    Dim wSrc As Long, hSrc As Long
    Dim maxX As Long, maxY As Long
    Dim minX As Long, minY As Long
    Dim oldscalemode As VBRUN.ScaleModeConstants
    Dim mi_hDC As Long
    With a_Canvas
        oldscalemode = .ScaleMode
        .ScaleMode = vbPixels
        wDest = .ScaleX(a_Pic.Width, VBRUN.ScaleModeConstants.vbHimetric,
.ScaleMode)
        hDest = .ScaleY(a_Pic.Height, VBRUN.ScaleModeConstants.vbHimetric,
.ScaleMode)
        minX = .ScaleLeft
        minY = .ScaleTop
        maxX = .ScaleWidth
        maxY = .ScaleHeight
        mi_hDC = .hDC
    End With    '// a_Canvas
    With a_Pic
        wSrc = .Width
        hSrc = .Height
        Y = minY
        While Y < maxY
            X = minX
            While X < maxX
                .Render mi_hDC, _                  <--- ECCOLA LA CAROGNA
!!!
                        X, Y, wDest, hDest, _
                        0, hSrc, wSrc, -hSrc, _
                        0
                X = X + wDest
            Wend    '// X
            Y = Y + hDest
        Wend    '// Y
    End With    '// a_Pic
    a_Canvas.ScaleMode = oldscalemode
End Sub '// Tile
-------- fine codice --------

Non ho capito bene. il Render agisce allo stesso modo di PaintPicture?
Se è così perché due metodi per la stessa funzione?
Fabio

 Se è così perché due metodi per la stessa funzione?
Forse dopo aver letto l'help la cosa sarà più chiara...
*************************************
Render
Disegna l'immagine di origine o una sua parte in un oggetto
di destinazione. Si applica a: Oggetto Picture.
Sintassi:
oggetto.Render(hdc, destx, desty, largdest, altdest, origx,
origy, largorig, altorig, limiti)
[STRACUT, nota bene quanto segue:]
Osservazioni
Il metodo migliore per disegnare parte di un elemento grafico
in un oggetto di destinazione consiste nell'utilizzare il metodo PaintPicture.
---------------------------------------
PaintPicture
Disegna il contenuto di un file grafico (.bmp, .wmf, .emf, .ico
o .dib) su un oggetto Form, PictureBox o Printer. Non supporta
argomenti predefiniti.
Sintassi:
oggetto.PaintPicture immagine, x1, y1, larghezza1, altezza1,
x2, y2, larghezza2, altezza2, codiceop
[STRACUT]
codiceop Facoltativa. Valore lungo o codice utilizzato soltanto
con bitmap. Definisce un'operazione bit per bit, ad esempio
vbMergeCopy o vbSrcAnd, eseguita mentre immagine viene
disegnata su oggetto.
*************************************
Ti è più chiaro adesso, vero ? Bene... allora SPIEGAMELO ! :-)))))))
_________________________________
Per quel poco che ho capito io, serve per evitare di usare
PictureBox nascoste o trucchi simili, perché lavora
direttamente sugli oggetti Picture. In compenso, non gestisce
i RasterOps. Spero di averci azzeccato :-).
Bye, G.


che sappia io i RasterOps sono supportati a basso livello dal GDI e il fatto
che non li supporti non credo che sia un'ottimizzazione. Semplicemente si
sono scordati di metterceli! :))
ad ogni modo mi sembra di aver capito il concetto, proverò ad usare questo
Render, perché mi ricordo di aver pensato di darci un'occhiata e questo mi
sembra il momento giusto, visto che a occhio sembra anche utile :)
Zanna, se scopri come si salva su disco un bitmap con profondità di colore
imposta fammi un fischio perché sarebbe mooolto utlie anche a me!
grazie
Fabio

 Ti è più chiaro adesso, vero ? Bene... allora SPIEGAMELO ! :-)))))))
La PaintPicture è un wrapper della StretchBlt() e agisce sulla picturebox.
La Render agisce su oggetti "non fisici" come StdPicture, IPictureDisp ecc.
La Render() non è elastica come al PaintPicture() (almeno da quello che dice
l'help perchè fin'ora non sono riuscito a usarla, proverò con il metodo
suggerito da JKLJKL).
C'è anche da dire che fino alla ver. 4 di VB la prop. Picture non restituiva
un oggetto, ma solo l'handle della Picture, quindi non c'era a disposizione
la render.
