Newsgroup: it.comp.lang.visual-basic
Titolo: listview e colore di sfondo in un subitem

Si può fare?
Cambiare il colore di sfondo in un subitem in una listview?
Non il colore del font ma del background!


Che io sappia no, perché la LV non è organizzata in celle.
 
Ho visto pastrocchi che inseriscono una picture, disegnata adeguatamente 
a bande, sullo sfondo di una LV; sono però soluzioni inaffidabili ed 
imprecise, perché calcolare l'altezza di una riga, convertire in bmp ed 
allineare lo sfondo ad una griglia, pensando di azzeccare tutto, è 
*quasi* impossibile: l'interfaccia di W è personalizzabile, e gestire 
tutti i valori in ballo è praticamente impossibile.
 
Nelle LV si può solo accedere ai testi e modificarne il carattere, la 
dimensioni, il colore, aggiungere una immagine; ma non c'è accesso alle 
celle, perché non esistono.
 
Non ho approfondito più di tanto, ma mi è sembrato di capire che i testi 
sono in contenitori trasparenti che espongono poche proprietà (a memoria 
mi sembra top, left e width).
 
Ed infatti agevolmente si riesce a mettere una textbox sopra un testo 
(ad es. per renderlo modificabile), ma non essendoci nulla dietro è 
impossibile impostare e/o modificare il colore dello sfondo.
 
Tutto questo per quel poco che so, ovviamente.
 
NB: esiste una ListView VBAccelerator che fa "di tutto di più".
 
 
-- 
 
/*
/* doc
/*

 mi sembra top, left e width).
 
Se la lv si visualizza in modalità Detail (praticamente l'unico modo in cui
la utilizzo), uso questo codice e non mi ha mai dato problemi con le varie
impostazioni di windows, dotpitch ecc.
 
Chiamata:
| SetListViewColor ListView1, Picture1, vbWhite, RGB(247, 238, 225)
 
Sub:
| 
| Private Sub SetListViewColor(pCtrlListView As ListView, _
|                             pCtrlPictureBox As PictureBox, _
|                             Color1 As Long, _
|                             Color2 As Long)
| '---------------------------------------------------------------------------------------
| ' Procedure : SetListViewColor
| ' DateTime  : 04/09/2008 10.01
| ' Author    : andrea
| ' Purpose   : Funzione ripresa per disegnare le righe di una listview
| '---------------------------------------------------------------------------------------
| '
| 
| On Error GoTo SetListViewColor_Error
| 
|     Dim iLineHeight As Long
|     Dim iBarHeight  As Long
|     Dim lBarWidth   As Long
|     Dim lColor1     As Long
|     Dim lColor2     As Long
|  
|     lColor1 = Color1
|     lColor2 = Color2
|     
|     If pCtrlListView.View = lvwReport Then
|         pCtrlListView.Picture = LoadPicture("")
|         pCtrlListView.Refresh
|         pCtrlPictureBox.Cls
|         
|         pCtrlPictureBox.AutoRedraw = True
|         pCtrlPictureBox.BorderStyle = vbBSNone
|         pCtrlPictureBox.ScaleMode = vbTwips
|         pCtrlPictureBox.Visible = False
|         
|         pCtrlListView.PictureAlignment = lvwTile
|         pCtrlPictureBox.Font = pCtrlListView.Font
|         pCtrlPictureBox.Top = pCtrlListView.Top
|         pCtrlPictureBox.Font = pCtrlListView.Font
|         With pCtrlPictureBox.Font
|             If pCtrlListView.Checkboxes = True Then
|                 .size = pCtrlListView.Font.size + 2.75
|             Else
|                 .size = pCtrlListView.Font.size '+ 2.75
|             End If
|             .Bold = pCtrlListView.Font.Bold
|             .Charset = pCtrlListView.Font.Charset
|             .Italic = pCtrlListView.Font.Italic
|             .Name = 
pCtrlListView.Font.Name
 
|             .Strikethrough = pCtrlListView.Font.Strikethrough
|             .Underline = pCtrlListView.Font.Underline
|             .Weight = pCtrlListView.Font.Weight
|         End With
|         pCtrlPictureBox.Refresh
|         iLineHeight = pCtrlPictureBox.TextHeight("W") + Screen.TwipsPerPixelY
|     
|         iBarHeight = (iLineHeight * 1)
|         lBarWidth = pCtrlListView.Width
|     
|         pCtrlPictureBox.Height = iBarHeight * 2
|         pCtrlPictureBox.Width = lBarWidth
|     
|         'paint the two bars of color
|         pCtrlPictureBox.Line (0, 0)-(lBarWidth, iBarHeight), lColor1, BF
|         pCtrlPictureBox.Line (0, iBarHeight)-(lBarWidth, iBarHeight * 2), lColor2, BF
|         
|         pCtrlPictureBox.AutoSize = True
|         'set the pCtrlListView picture to the
|         'pCtrlPictureBox image
|         pCtrlListView.Picture = pCtrlPictureBox.Image
|     Else
|         pCtrlListView.Picture = LoadPicture("")
|     End If
|     
|     pCtrlListView.Refresh
|     Exit Sub
| SetListViewColor_Error:
|     'clear pCtrlListView's picture and then exit
|     pCtrlListView.Picture = LoadPicture("")
|     pCtrlListView.Refresh
| End Sub

 
 
Conosco quel codice.
Questo è il risultato nel mio portatile:
 
https://imgur.com/0ncMmV8
 
 
Potrebbe avere una (sua) logica, ma mettere una picture come sfondo per 
simulare le righe colorate non è IMHO una soluzione affidabile.
 
Dipende troppo dall'ambiente di lavoro e, si sa, gli utenti sono 
particolarmente abili nel trovare esattamente quello che guasta tutto.
 
Casomai meglio la listview di vbaccelerator.


 particolarmente abili nel trovare esattamente quello che guasta tutto.
 
Non so che dire, credo che su un almeno 4/500 installazioni nessuno mi
abbia mai segnalato nulla, e molti clienti hanno anche font DPI non
standard, oltre a OS eterogenei (come si vede è in uso dal 2008).
 
Sicuramente la utilizzo in griglie di poco conto tipo export al volo di
alcuni dati, per griglie un po' più funzionali abbiamo un componente
esterno.
 
Non conosco quella di vbaccelerator (ho usato comunque alcuni componenti di
loro); il problema è che se hai tante installazioni, aggiungere un OCX e
ridistribuire il programma non è una cosa semplice, non si può usare la
distribuzione XCOPY di .NET, e se i clienti sono utenti limitati all'epoca
non avevo trovato molte soluzioni.

 simulare le righe colorate non è IMHO una soluzione affidabile. 
 
Senza contare che se il colore lo si vuole usare per evidenziare solo particolari listitems, e non semplicemente il classico alternato righe pari/dispari, allora la picture di sfondo non risolve in generale.
 
Sono decenni che non bazzico quei lidi, ma se gli OCX di vbAccelerator ancora funzionano sui Windows moderni, ne farei uso generoso perchè, pur con le inevitabili menate di registrazione librerie, una volta sistemato il setup iniziale davvero tolgono un sacco di mal di testa e necessità di patchare i controlli nativi a suon di trucchi e API di sistema (che, di fatto, è un rifare da capo lo stesso lavoro di vbAccelerator a pezzetti)
 
Per le ListView in particolare, visto che in un sacco di casi venivano usate solo ed esclusivamente in modalità Detail come pseudo-griglie, passare direttamente al controllo S-Grid2 è proprio un altro mondo di comodità e feature, per quello che ricordo