Newsgroup: it.comp.lang.visual-basic
Titolo: Problema con ImageList

Mi capita una cosa strana nella gestione delle ImageList.
Dunque, ho tre imagelist in un form condivise in tutto il progetto
tramite un modulo:
- MainForm -
'Carico le immagini
ModImages.LoadImageList Images16
ModImages.LoadImageList Images32
ModImages.LoadImageList Images48
- Modulo ModImages -
Public Enum EImageListType
    IMGLIST_16
    IMGLIST_32
    IMGLIST_48
End Enum
ImgList16 As ImageList
ImgList32 As ImageList
ImgList48 As ImageList
Public Sub LoadImageList (ImgList As ImageList, _
                          ImgListType As EImageListType)
  With ImgList.ListImages
     Select Case ImgListType
        Case IMGLIST_16
          Set ImgList16 = ImgList
          ImgList16.UseMaskColor = False
          'Carico le immagini
          .Add , "IMAGE_1", LoadResPicture("IMAGE_1", vbResIcon)
          [......]
     End Select
  End With
end Sub
Ora, quando recupero un'immagine tramite il riferimento all'ImageList
nel Modulo, le icone non hanno lo sfondo trasparente...come se la
proprietà UseMaskColor fosse True!!!
Avete qualche suggerimento?
-- 
Free As In Freedom
www.fsf.org

 Avete qualche suggerimento?
Posta il codice con cui recuperi un'immagine dall'imagelist...
Bye
Raf

 Posta il codice con cui recuperi un'immagine dall'imagelist...
In pratica il modulo viene usato come interfaccia comune per gestire
tutte le immagini.
Dunque, se per esempio voglio associare l'ImageList 16x16 ad un TabStrip
faccio:
- Form -
Set TabStrip.ImageList = ModImages.ImgList(IMGLIST_16)
TabStrip.Tabs.Add , , "PIPPO", ModImages.ImgKey(IMG_1)
- Modulo ModImages -
Public Enum EImages
   IMG_1
   IMG_2
   ...
   IMG_N
End Enum
Public Property Get ImgList(ImgListType As EImageListType) As ImageList
    Select Case ImgListType
      Case IMGLIST_16
        Set ImgList = ImgList16
      Case IMGLIST_32
        Set ImgList = ImgList32
      Case IMGLIST_48
        Set ImgList = ImgList48
    End Select
End Property
Public Property Get ImgKey(Index As EImages) As String
   ...
   ImgKey = ImgList16.ListImages(Index).Key
   ...
   ...
End Property
Il problema è che lo sfondo dell'icona è del colore della proprietà
BackColor dell'ImageList.
Inoltre il 'problema' si presenta solo per le icone 16x16!!


 Posta il codice con cui recuperi un'immagine dall'imagelist...
Dimenticavo....
Se invece l'immagine la carico direttamente, il problema non sussiste:
- Form -
Image1.Picture = ModImages.LstImage(IMG_1).Picture
- Modulo ModImages -
Public Enum EImages
   IMG_1
   IMG_2
   ...
   IMG_N
End Enum
Public Property Get LstImage(Index As EImages) As ListImage
   ...
   Set LstImage = ImgList16.ListImages(CInt(Index))
   ...
End Property


 Inoltre il 'problema' si presenta solo per le icone 16x16!!
Prova ad isolare il "problema" in un progetto con solo il form con la tabstrip e
l'imagelist da associarle, già caricata a design time con le icone 16x16.
Bye
Raf

 
Adesso provo....
Sembra che quando si associa una ImageList ai controlli (usando una
variabile oggetto diversa da quella creata a design), venga impostata a
true la proprietà UseMaskColor.
Se per esempio l'IL ha backcolor grigio, e la associo ad un'ImageCombo,
le icone compaiono con lo sfondo grigio anche se UseMaskColor è False!!


 l'imagelist da associarle, già caricata a design time con le icone 16x16.
Sul form ho una ImageList con un'immagine caricata a design...le altre
le carico dal file di risorse...
Private Sub Form_Load()
  ImageList1.ListImages.Add , "IMG_1", _
                              LoadResPicture("IMG_2", vbResIcon)
  ImageList1.ListImages.Add , "IMG_2", _
                              LoadResPicture("IMG_2", vbResIcon)
  ImageList1.ListImages.Add , "IMG_2", _
                              LoadResPicture("IMG_2", vbResIcon)
  TabStrip1.ImageList = ImageList1
  TabStrip1.Tabs(1).Image = "IMG_1"
  TabStrip1.Tabs.Add , , , "IMG_2"
  TabStrip1.Tabs.Add , , , "IMG_3"
  TabStrip1.Tabs.Add , , , "IMG_DESIGN"
End Sub
Lo sfondo dell'icona è uguale al colore impostato in BackColor!!!!!
-- 
*******************
Free As In Freedom
-= 
www.fsf.org
 =-

 
Googlagando ho trovato questo post:
http://groups.google.it/group/it.comp.lang.visual-basic/search?group=it.comp.lang.visual-basic&q=imagelist+backcolor&qt_g=1&searchnow=Ricerca+in+questo+gruppo
Nel quale è esposto esattamente il mio problema!!
Quindi ho provato a seguire il consiglio:
ImageList1.BackColor = vbButtonFace 'il TabStrip non ha BackColor
Set TabStrip1.ImageList = ImageList1
Ma nemmeno così funge!!!
Non mi dite che devo trasformare le mie ICO in BMP!!!!!


 Ma nemmeno così funge!!!
Cioè con che colore di sfondo appaiono le icone?
Ho fatto la stessa prova e da me funziona.
Form con 1 TabStrip e 1 ImageList, file di risorse caricato con icone 16x16
Private Sub Form_Load()
    With ImageList1
        .BackColor = vbButtonFace
        .ImageHeight = 16
        .ImageWidth = 16
        .ListImages.Add , "PROVA", LoadResPicture(101, vbResIcon)
    End With
    Set TabStrip1.ImageList = ImageList1
    TabStrip1.Tabs(1).Image = "PROVA"
End Sub
Ma che tipo di icone sono quelle che usi tu? Cioè 16 o 256 o Truecolor (che tra
l'altro non riesci nemmeno a caricare nel file di risorse)?
Bye
Raf

 l'altro non riesci nemmeno a caricare nel file di risorse)?
Come non riesci a caricarle?!?
Le mie sono TrueColor (24 bit).
Il file di risorse lo creo con il compilatore RC.EXE non con l'editor di
VB...
La cosa strana è che se associo l'icona direttamente tramite la
proprietà picture (per esempio ad un pulsante):
Button1.Picture = ImageList1.ListImages(1).Picture
L'icona compare correttamente con lo sfondo 'trasparente'!!


 L'icona compare correttamente con lo sfondo 'trasparente'!!
Così però ti dà sempre una *bitmap* (tra l'altro "stretchata" a 32x32,
indipendentemente da ImageWidth e ImageHeight).
Per ottenere l'icona "vera" devi fare in questo modo:
Button1.Picture = ImageList1.ListImages(1).ExtractIcon
Che però ha ovviamente l'effetto di mostrarla con lo sfondo "bianco", a meno di
non impostare ImageList.BackColor...
Bye
Raf