Newsgroup: it.comp.lang.visual-basic
Titolo: [?] immagini in griglia (sgrid2)

In una applicazione che fa uso della sgrid2 di vbaccelerator mi e' stato 
chiesto di aggiungere una colonna nelle cui celle dovrebbero essere 
infilate delle immagini.
Sul sito di vbaccelerator si spiega come fare, in particolare creando 
immagini direttamente in memoria con alcune api (un quadratino o una 
progressbar). A me interessa invece caricare le immagini da disco.
Ho fatto alcune prove non molto soddisfacenti per tempi di caricamento e 
sfarfallii.
Ho creato dapprima un picturebox (con autoresize=false e autoredraw=true).
Prima di riempire una cella carico il picturebox con loadPicure e poi 
uso BitBlt per copiare l'immagine dalla picturebox nella cella.
Funziona se le immagini sono piccole (come dimensione in pixel e bytes).
Se le immagini sono di dimensioni maggiori (in pixel) le cose si 
complicano. Non posso aumentare indefinitamente le dimensioni della 
cella ma usando BitBlt l'immagine viene troncata.
Ho quindi provato ad usare StretchBlt ma non ho ottenuto nulla di buono: 
le immagini non vengono ridimensionate (nel senso che non vedo nulla di 
quel che mi aspetto, solo del bianco) e la picturebox continua a 
sfarfallare. L'impressione e' che ci sia qualche operazione eseguita 
molto lentamente.
Potete indicarmi qualche riferimento su come gestire al meglio queste 
cose grafiche?
grazie
	maxx

Guarda, 
per la lentezza e sfarfallamento,
se il tuo controllo lo supporta
(come è possibile fare per la MSFlexGrid),
puoi provare ad impostare 
prima del popolamento
la proprietà "Redraw" 
(o quella che nel tuo caso consente il refresh)
a  'False'
e quando hai popolato rimetterla a 'True'.
esempio:
MSFlexGrid1.Redraw = False
qui popoli
MSFlexGrid1.Redraw = True
Su tale controllo è praticamente un comando 
irrinunciabile.
------------
Se il tuo controllo non lo supporta,
puoi provare a ricavare l'handle relativo 
e con l' API  UpdateWindow
disabilitare e riabilitare l'aggioranmento.
-----------
Spero che faccia
teo



E' supportata una proprieta' equivalente ma non e' questo il problema.
Devo caricare dei file jpg. Quello che faccio e':
picture1.picture=loadPicture(...)
picture1.visible=true
BitBlt(griglia.hdc,...,picture1.hdc,...)
picture1.visible=false
(se la picturebox non e' visibile non funziona)
Questi comandi si trovano nell'evento "redraw" della griglia. Viene 
quindi richiamato spessisimo (basta che il mouse passi su una casella 
della griglia).
Se fosse possibile evitare il passaggio dalla picturebox e caricare 
direttamente l'immagine parte dello sfarfallio (e della lentezza 
sparirebbe).
L'api loadImage pero' permette di caricare solo bitmap e non ho trovato 
altre indicazioni su come risolvere la cosa.
grazie
	maxx

anche io avevo avuto un problemino simile (passaggio temporaneo su una
PictureBox),
ma la risolsi in un attimo:
non mi ricordo come, ma č chiaro che mettere una immagine in un posto
non puň essere cosa difficile
c'č del codice sotto,
ma prima fai magari queste semplici prove:
consigli piccoli: 
prova a tenere la picturebox visibile, ma fuori del form (.left = - 10000)
prova a usare la picturebox con autoresize=true
svuota la picturebox   Load ("")  oppure .cls  prima di ogni caricamento
la griglia ha una sorta di autoredraw?
poi il codice sul Redraw della griglia non č proprio consigliatissimo:
č chiamato in causa troppe volte,
mettilo in punto piů "fermo" sul Form (anche solo per prova)
e va a cambiare la figura solo quando c'č bisogno
al posto del jpg hai provato con una semplice bmp ?
prova a caricare/ridimensionare l'immagine in memoria, vedi codice sotto
------------
CODICE:
io ho trovato questo codice consigiato 
a uno che voleva caricare un jpg cambiandogli le dimensioni
per prova va incollato semplicemente su un form;
esso disegna l'immagine sull' hdc del Form, qualunque dimensione questo
assuma;
disegnarlo quindi sulla grid il passo dovrebbe essere breve
metti al posto di
"C:\Images\pippo.jpg"
una tuo percorso valido
 
-------------------------
You should be able to do that by using the Render method of the IPicture
interface.  Like VB's own PaintPicture the Render method lets you draw the
picture onto another surface (in this case another Device Context).  So,
instead
of assigning the picture directly to the control, draw it on the control
instead.
Here's the info:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/42e3cd0e-2413-494a-8be8-2952089e02d2.asp
Here is an example using the Render method of a StdPicture object.  Note
that
the picture is not loaded onto the form, but rather into a (ClientImage)
variable,
and that is used to draw the image.  You'll need to use a file from your
own
system, but other than that, just paste this into a new form and try it
out....
Option Explicit
Private ClientImage As StdPicture
Private PaintTest As Long  ' Needed for user resizing of form
Private Declare Function SetStretchBltMode Lib "gdi32" _
    (ByVal hdc As Long, ByVal nStretchMode As Long) As Long
Private Const COLORONCOLOR = 3
Private Sub Form_Load()
  ScaleMode = vbPixels     ' Render uses Pixel measurments
  Set ClientImage = LoadPicture("C:\Images\pippo.jpg")
End Sub
Private Sub Form_Paint()
Dim oldMode As Long
' (Form.AutoRedraw must be False to use Paint event)
  ' Avoid errors
  If ScaleHeight > 0 And ScaleWidth > 0 Then
    oldMode = SetStretchBltMode(Me.hdc, COLORONCOLOR)
    With ClientImage
      .Render Me.hdc, 0, ScaleHeight + 1, ScaleWidth, -(ScaleHeight + 2), _
              0, 0, .Width, .Height + ScaleY(1, vbPixels, vbHimetric), 0
    End With
    oldMode = SetStretchBltMode(Me.hdc, oldMode)
 End If
End Sub
Private Sub Form_Resize()
  ' OS catches upsize, code catches downsize to force Paint
  If (Width * Height) < PaintTest Then Form_Paint
  PaintTest = Width * Height
End Sub 
---------------------