Newsgroup: it.comp.lang.visual-basic
Titolo: StretchBlt e MDI Form

Salve, ho la necessità di usare una immagine di sfondo per una finestra 
MDI (non child).
Ora... siccome alcuni monitor su cui gira la mia applicazione vanno a 
1024x768 e altri a 800x600 avevo pensato bene di ridisegnare l'immagine 
di sfondo al MDI al FORM_Resize, ma solo se lo stato fosse vbMaximized.
Quindi ho posto sul form MDI due picture box:
  I - picSfondo
II - picTmp
Il codice incriminato è questo:
Private Sub MDIForm_Resize()
Dim DimX As Long, DimY As Long
Dim DestX As Long, DestY As Long
     With picSfondo
         DimX = .ScaleX(.Picture.Width, vbHimetric, vbPixels)
         DimY = .ScaleY(.Picture.Height, vbHimetric, vbPixels)
     End With
     If Me.WindowState = vbMaximized Then
         picTmp.Cls
         picTmp.Height = Height
         DestX = picTmp.ScaleX(picTmp.Width, vbTwips, vbPixels)
         DestY = picTmp.ScaleY(picTmp.Height, vbTwips, vbPixels)
         StretchBlt picTmp.hdc, 0, 0, DestX, DestY, picSfondo.hdc, 0, 0, 
DimX, DimY, SRCCOPY
         Set Me.Picture = picTmp.Image
     End If
End Sub
In pratica se sono in massimizzata allora disegno lo sfondo (preso da 
picSfondo) sulla picTmp allargata alle dimensioni dell'MDI e assegno la 
picture ottenuta alla proprietà picture dell'MDI.
Ci tengo a sottolineare che entrambe le picturebox sono invisibili, 
altrimenti quando massimizzo picTmp le MDIChild non hanno spazio per loro.
Il problema che si verifica è che compare come immagine di sfondo 
soltanto una fascia orizzontale di immagine, quella superiore.
Ora... come mai ciò?
C'è un modo per utilizzare bene l'MDIForm in questo modo?
Non mi va di usare due picture diverse (800x600 e 1024x768) da caricare 
in runtime nè tantomeno di integrarle e usarlo al momento... perchè mi 
interessa risolvere il problema del disegno in runtime.
Soluzioni?
Thx in anticipo!
-- 
Rivolterò il mondo per trovarlo, e anche se andasse in Indocina uno dei 
nostri starà nascosto in una ciotola di riso pronto a sparargli nel culo.
(Pulp Fiction)

Soluzioni?
Hai provato ad usare un controllo Image, con Stretch a True?
Ciao!

 Hai provato ad usare un controllo Image, con Stretch a True?
l'image non puoi metterlo sull'mdi, ci vuole un picbox, che comunque, image
o no dentro di se', non legge lo scaleheight nel resize. l'effetto e' quello
che dice darkbyte. direi non sia l'unico caso in cui il picbox da' problemi
al resize.
gianluca cannalire sul ng ms suggeriva di subclassare e usare wmpaint.
se vuoi provare, metti un picbox contenente un image, poi v. sotto.
ciao, j.
Private Sub MDIForm_Resize()
    Picture1.Move 0, 0, ScaleWidth, ScaleHeight
    Image1.Move 0, 0, ScaleWidth, ScaleHeight
'    StretchBlt Picture1.hWnd, 0, 0, Image1.Width, Image1.Height,
frmMain.hWnd, 0, 0, _
'        ScaleWidth, ScaleHeight, SRCCOPY
'    oW = ScaleWidth: oH = ScaleHeight
    Debug.Print "W " & Width
    Debug.Print "H " & Height
    Debug.Print "SW " & ScaleWidth
    Debug.Print "SH " & ScaleHeight
    Debug.Print "PW " & Picture1.Width
    Debug.Print "PH " & Picture1.Height
    Debug.Print "IW " & Image1.Width
    Debug.Print "IH " & Image1.Height
    Debug.Print "----------------------------"
End Sub

se vuoi provare, metti un picbox contenente un image, poi v. sotto.
[cut]
Si, cmq. se usare Height anzichč ScaleHeight non crea grossi problemi
all'immagine di sfondo, si potrebbe usare una picture invisibile con
un image sopra che ridimensione l'immagine di sfondo.
L'image va poi passata alla proprietą picture del MDI.
    Picture1.Height = Me.Height
    Image1.Width = Picture1.ScaleWidth
    Image1.Height = Picture1.ScaleHeight
    Me.Picture = Image1.Picture
Ciao!

    Me.Picture = Image1.Picture
Cazzata! Immensa! Lo sfondo resterà sempre delle sue dimensioni!
Ok ci rinuncio! >:-(