Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Immagini in griglia con riduzione automatica

Uso una Grid32.OCX, ma la cosa è marginale.
Per esporre in un certa cella un'immagine, dopo aver assegnato Row e Col,
faccio griglia.Picture=LoadPicture(percorso_e_nome_file). Tutto ok.
Ora, può accadere che l'immagine abbia dimensioni adeguate per altri scopi,
ma che sia troppo grossa (alta/larga) per l'esposizione in griglia.
Mi chiedevo se esisteva qualche truschino per dare in pasto alla griglia
un'immagine proporzionalmente ridotta. Non ho difficoltà ad effettuare tale
riduzione, ma temo che sia necessario salvare su un file temporaneo
l'immagine ridotta per poterlo da dare in pasto alla LoadPicture (con la
bega di doverlo cancellare alla chiusura del form)... Avete idee che mi
consentano di non effettuare tale salvataggio? Grazie.
PS: Il parametro dimensioni della LoadPicture pare riguardare solo le icone
e i cursori...

 griglia un'immagine proporzionalmente ridotta.
caricarla in una picturebox con un paintpicture, che mi sembra possa
modificare le dimensioni, e poi assegnare la sua image alla cella?
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 modificare le dimensioni, e poi assegnare la sua image alla cella?
Ci provo. Grazie.

 [SNIP]
Puoi risolvere rapidamente usando un controllo PictureBox (invisibile):
Nell'esempio:
1 controllo PictureBox : picStretch (Visible = False, AutoRedraw = True)
1 controllo PictureBox : picTest (a simulare la Picture della griglia)
Private Function LoadAndStretchPicture(ByVal NomeFile As String, _
                                       ByVal Width As Long, _
                                       ByVal Height As Long _
                                       ) As IPictureDisp
    Dim ratio As Single
    With picStretch
        .Picture = LoadPicture(NomeFile)
        ratio = .Picture.Width / .Picture.Height
        If ratio < 1 Then
            .Width = Height * ratio
            .Height = Height
        Else
            .Width = Width
            .Height = Width / ratio
        End If
        Call .PaintPicture(.Picture, 0, 0, .Width, .Height)
        Set LoadAndStretchPicture = .Image
    End With
End Function
Private Sub Form_Load()
    With picTest
        .Picture = LoadAndStretchPicture("C:\Test.bmp", _
                                         .Width, _
                                         .Height)
    End With
End Sub
hth,
Lokar
-- 
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
Statuto: 
http://www.it-lang-vb.net/docs/Statuto.txt
UGIdotNET - 
http://www.ugidotnet.org

 (invisibile):
...
Grazie Lokar.
Con l'idea di Sergio ho già parzialmente risolto, devo solo "mettere a
punto", in ogni caso "ti stampo".

 punto", in ogni caso "ti stampo".
direi che l'idea di lockar e quella di sergio sono la stessa.
solo che lui è meno pigro di me.


 solo che lui è meno pigro di me.
Ho fatto quanto segue (tutte le info sono nei commenti) e mi quadra
abbastanza.
Solo (per chi avesse lo sfizio di guardarci) non mi torna perchè nel caso 3
e 8 ho un rapporto L/A=1.85 a fronte di Lr/Ar=1.75, tant'è che l'immagine
appare leggermente tagliata in altezza...
Grazie a tutti.
'Sul form:
'   Una griglia (ho usato Grid32.OCX) con nome griglia
'   Una PictureBox con nome pic_appoggio
'   Un bottone con nome btn_esegui
Private Sub Form_Load()
    pic_appoggio.Visible = 0
    pic_appoggio.AutoRedraw = 1
    griglia.Width = 8500
    griglia.Top = 0
    griglia.Left = 0
 
griglia.Font.Name
 = "MS Sans Serif"
    griglia.Font.Bold = 0
    btn_esegui.Caption = "Esegui"
    btn_esegui.Width = 700
    btn_esegui.Left = griglia.Width + 30
    btn_esegui.Top = 0
    Me.Width = griglia.Width + btn_esegui.Width + 150
    Me.Left = 0
    Me.Top = 0
    griglia.Rows = 1
    griglia.Cols = 4
    griglia.FixedCols = 2
'       Carica righe griglia
    For n = 1 To 13
        griglia.AddItem "R" & n - 1 & vbTab & "Caso" & n - 1
    Next n
    griglia.RemoveItem 1
    griglia.ColWidth(0) = 350
    griglia.ColWidth(1) = 600
End Sub
Private Sub btn_esegui_Click()
    griglia.Col = 2     'Colonna immagine
    colonna_griglia_larghezza_massima_raggiunta = 0
    file_immagine_orizzontale =
"C:\Easywins\Easywin\Files\Immagini\EASY.BMP"   'Immagine piu' larga che
alta: Lr=13256xAr=7594
    file_immagine_verticale = "C:\Easywins\Easywin\Files\Immagini\KELLY.JPG"
'Immagine piu' alta che larga: Lr=9710xAr=13547
'---
    altezza_massima = 1000
    larghezza_massima = 2000
    griglia.Row = 1
    file_immagine = file_immagine_orizzontale
    GoSub assegna
    griglia.Row = 2
    file_immagine = file_immagine_verticale
    GoSub assegna
'---
    altezza_massima = 2000
    larghezza_massima = 1000
    griglia.Row = 3
    file_immagine = file_immagine_orizzontale
    GoSub assegna
    griglia.Row = 4
    file_immagine = file_immagine_verticale
    GoSub assegna
'---
    altezza_massima = 1000
    larghezza_massima = 2000
    griglia.Row = 5
    file_immagine = file_immagine_verticale
    GoSub assegna
    griglia.Row = 6
    file_immagine = file_immagine_orizzontale
    GoSub assegna
'---
    altezza_massima = 2000
    larghezza_massima = 1000
    griglia.Row = 7
    file_immagine = file_immagine_verticale
    GoSub assegna
    griglia.Row = 8
    file_immagine = file_immagine_orizzontale
    GoSub assegna
'---
    altezza_massima = 3000
    larghezza_massima = 2000
    griglia.Row = 9
    file_immagine = file_immagine_verticale
    GoSub assegna
    griglia.Row = 10
    file_immagine = file_immagine_orizzontale
    GoSub assegna
'---
    altezza_massima = 1000
    larghezza_massima = 3000
    griglia.Row = 11
    file_immagine = file_immagine_verticale
    GoSub assegna
    griglia.Row = 12
    file_immagine = file_immagine_orizzontale
    GoSub assegna
'---
    griglia.ColWidth(3) = 4000
    Exit Sub
assegna:
    griglia.Picture = CARICA_E_ADEGUA_IMMAGINE(pic_appoggio, file_immagine,
larghezza_massima, altezza_massima, l_reale, a_reale)
    griglia.RowHeight(griglia.Row) = pic_appoggio.ScaleHeight   'Assegna
l'altezza della riga
    If pic_appoggio.ScaleWidth > colonna_griglia_larghezza_massima_raggiunta
Then
'           Aumenta la larghezza della colonna immagini
        colonna_griglia_larghezza_massima_raggiunta =
pic_appoggio.ScaleWidth
        griglia.ColWidth(griglia.Col) =
colonna_griglia_larghezza_massima_raggiunta
    End If
    salva_col = griglia.Col
    griglia.Col = 3
    griglia.Text = "LM=" & larghezza_massima & "xAM=" & altezza_massima
    griglia.Text = griglia.Text & " L=" & pic_appoggio.ScaleWidth & "xA=" &
pic_appoggio.ScaleHeight
    griglia.Text = griglia.Text & vbCrLf & "Lr=" & l_reale & "xAr=" &
a_reale
    griglia.Text = griglia.Text & " Lr/Ar=" & Round(l_reale / a_reale, 2)
    griglia.Text = griglia.Text & " L/A=" & Round(pic_appoggio.ScaleWidth /
pic_appoggio.ScaleHeight, 2)
    griglia.Col = salva_col
    Return
End Sub
Function CARICA_E_ADEGUA_IMMAGINE(pic_appoggio As PictureBox,
file_immagine_originale, larghezza_massima, altezza_massima, Optional
l_reale, Optional a_reale) As IPictureDisp
    pic_appoggio.Picture = LoadPicture(file_immagine_originale)
    l_reale = pic_appoggio.Picture.Width
    a_reale = pic_appoggio.Picture.Height
    proporzione_la = l_reale / a_reale
    If l_reale > larghezza_massima Or a_reale > altezza_massima Then
'           Una delle due dimensioni (o entrambe) supera il massimo
consentito
'           Fissa il massimo consentito sulla dimensione
'           che in % supera maggiormente il massimo stesso
'           e adegua proporzionalmente l'altra
        sfora_l = l_reale / larghezza_massima
        sfora_a = a_reale / altezza_massima
        If sfora_l > sfora_a Then
'               La larghezza sfora maggiormente (%) dell'altezza
            pic_appoggio.Width = larghezza_massima
'               Adegua l'altezza in modo proporzionale
            pic_appoggio.Height = larghezza_massima / proporzione_la
        Else
'               L'altezza sfora maggiormente (%) della (o uguale alla)
larghezza
            pic_appoggio.Height = altezza_massima
'               Adegua la larghezza in modo proporzionale
            pic_appoggio.Width = altezza_massima * proporzione_la
        End If
    Else
'           Nessuna delle due dimensioni supera il massimo consentito
        If proporzione_la >= 1 Then
'               Larghezza >= Altezza
            pic_appoggio.Width = larghezza_massima
            pic_appoggio.Height = larghezza_massima / proporzione_la
        Else
'               Larghezza < Altezza
            pic_appoggio.Width = altezza_massima * proporzione_la
            pic_appoggio.Height = altezza_massima
        End If
    End If
    Call pic_appoggio.PaintPicture(pic_appoggio.Picture, 0, 0,
pic_appoggio.Width, pic_appoggio.Height)
    Set CARICA_E_ADEGUA_IMMAGINE = pic_appoggio.Image
End Function

 l'immagine appare leggermente tagliata in altezza...
Ho scoperto. Se si mette la pic_appoggio senza bordo tutto è molto più
preciso.
Proverò a pistolare con W/H e Scale<W/H>