Newsgroup: it.comp.lang.visual-basic
Titolo: Affiancare immagine in form

Ciao,
C'è qualcuno che sa dirmi come poter afficancare una piccola immagine su
tutta l'area di un form in modo da ottenere l'effetto di uno sfondo unico?
Daniele

tutta l'area di un form in modo da ottenere l'effetto di uno sfondo unico?
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, _
                        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 --------
Premere F5 ;-)

     Cls
[SNIP]
Giusto una piccola osservazione: dato che la funzione disegna partendo
dall'origine e con le BMP non ci sono problemi di trasparenza si puo'
velocizzare un po' il refresh eliminando l'istruzione 'Cls', perlomeno
fintanto che non si cambia immagine.
...o dico belinate? ;-)
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

...o dico belinate? ;-)
Lo so, lo so che non sei un contamusse ;-)
E' che ho pensato al resize del form, ma, in  effetti,  visto che li' si va in SrcCopy
e si sfrutta gia' la copia che si fa vb per l' autoredraw (non mi sembrava qui il caso 
di andare a toccare l' evento OnPaint), il Cls si puo' eliminare.
Grazie per aver letto il codice :-)
Io, invece, do spesso una scorsa ultrarapida  e faccio finta di aver capito :-PPP
-- 
ciao, hal