Newsgroup: it.comp.programmare.win32
Titolo: [MFC] Problema con la modalità ad icone grandi di una CListView

Ho creato una vista nella mia applicazione derivata da CListView in cui
voglio visualizzare alcuni oggeti aventi informazioni dello stesso tipo.
Visto che la vista ad elenco ha quattro tipi di visualizzazione (icone
grandi, icone piccole, ad elenco e dettagli) imposto che la visualizzazione
di default (quella all'avvio dell'applicazione) sia quella report. Fin qui
tutto va bene ma nel momento in cui voglio "switchare" dalla vis. report
alla vis. icone grandi (tramite un click del tasto SX del mouse) c'è un
problema...le icone non mi vengono visualizzate. Qualcuno sa dirmi dove
sbaglio o se ometto qualche istruzione? Questo il codice da me utilizzato:
// CMyView è derivata da CListView
// Nella funzione virtuale CWnd::PreCreateWindow imposto lo stile di
default, la vis. a report
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
 cs.style |= LVS_SHOWSELALWAYS | LVS_REPORT;
 return CListView::PreCreateWindow(cs);
}
// Nella funzione virtuale OnInitialUpdate imposto il codice per il
riempimento della vis.
void CMyView::OnInitialUpdate()
{
 CImageList bmpLargeIcons;
 bmpLargeIcons.Create (IDB_LARGEICONS, 32, 1, RGB (255, 255, 0));
// IDB_LARGEICONS è una risorsa bitmap a 256 colori max composta da 8
"porzioni" di immagini a 32 pixel
// Ciascuna porziona verrà utilizzata come icona grande di un elemento della
vis.
// associo all'oggetto CListCtrl l'imagelist da utilizzare come vis. ad
icone grandi
 GetListCtrl().SetImageList(&bmpLargeIcons, LVSIL_NORMAL);
 #define NUM_COLUMNS  7 // nr. di Header della List View
 #define NUM_ELEMENTS 8 // nr. di elementi
 // array contenente la descrizione degli Header
 static _TCHAR* strHeader [NUM_COLUMNS] =
 {
  _T("Colonna1"), _T("Colonna2"), _T("Colonna3"),
  _T("Colonna4"), _T("Colonna5"), ("Colonna6"), _T("Colonna7")
 };
 // array contenente la larghezza in pixel di ciascun Header
 static int nWidthHeader [NUM_COLUMNS] =
 {
  100, 120, 100, 135, 135, 130, 130
 };
 // array contenente l'allineamento della label di ciascun Header
 static int nFormat [NUM_COLUMNS] =
 {
  LVCFMT_LEFT, LVCFMT_CENTER, LVCFMT_RIGHT, LVCFMT_RIGHT,
  LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_RIGHT
 };
 // *** INSERIMENTO DEGLI HEADER ***
 // LV_COLUMN indica la struttura dell'Header
 LV_COLUMN lvc;
 lvc.mask = LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
 // LVCF_SUBITEM = il membro iSubItem (indice della colonna) è valido
 // LVCF_TEXT = il membro pszText è valido
 // LVCF_WIDTH = il membro cx è valido
 // LVCF_FMT = il membro fmt è valido
 int cont;
 for (cont = 0; cont < NUM_COLUMNS; cont++)
 {
  lvc.iSubItem = cont;
  lvc.pszText = strHeader[cont];
 
lvc.cx
 = nWidthHeader[cont];
  lvc.fmt = nFormat[cont];
  GetListCtrl().InsertColumn(cont, &lvc);
 }
 // *** INSERIMENTO DEGLI ITEM ***
 // LV_ITEM indica la struttura dell'Item
 LV_ITEM lvi;
 for (cont = 0; cont < NUM_ELEMENTS; cont++)
 {
  lvi.mask = LVIF_TEXT | LVIF_IMAGE;
  lvi.iItem = cont;
  lvi.iSubItem = 0;
  lvi.iImage = cont;
  lvi.pszText = _T("questo è un item");    // imposto, come prova, la stessa
stringa di testo a ciascun elemento
  GetListCtrl().InsertItem(&lvi);
 }
 // *** INSERIMENTO DEI SUBITEM ***
 int i;
 for (cont = 0; cont < NUM_ELEMENTS; cont++)
 {
  for (i = 1; i < NUM_COLUMNS; i++)
  {
   GetListCtrl().SetItemText(cont, i, _T("questo è un subitem")); //
imposto, come prova, la stessa stringa di testo a ciascun subitem
  }
 }
}
// Gestisco, quindi, il click del tasto SX del mouse per il cambio della
vis., ovvero dalla report a quella ad icone grandi
void CMyView::OnLButtonDown(UINT nFlags, CPoint point)
{
 ModifyStyle (LVS_TYPEMASK, LVS_ICON);
 CListView::OnLButtonDown(nFlags, point);
}
Ma le icone grandi non vengono visualizzate, solamente il testo!!
Inoltre, come si visualizzano icone in questo tipo di visualizzazione con
più di 256 colori?
Grazie 1000 a tutti
Buon lavoro
Sergio Mola

Problema risolto. Grazie lo stesso.
Sergio Mola