Colore Item Selezionato Listbox

venerdì 06 gennaio 2006 - 23.00

lore84 Profilo | Newbie

Ciao a tutti!
Avevo bisogno di sapere se qualcuno conosce un modo (anche utilizzando le API) per modificare il colore dell'elemento selezionato all'interno di una listbox (lo standard Win è sfondo blu con testo bianco).

Inoltre, già che ci siamo, qualcuno sa qual è il modo (ammesso che esista) per modificare il colore del bordo (non 3d) sempre di una listbox? di default è nero e stona un po' con il colore dell'applicazione =)

Grazie a tutti in anticipo!

Cteniza Profilo | Guru

Questo esemplificato cambia il colore in base al valore dell'item.
...
AddHandler Me.listBox1.DrawItem, AddressOf Me.ListBox1DrawItem
...
..
Private Sub ListBox1DrawItem(sender As System.Object, e As System.Windows.Forms.DrawItemEventArgs)
Dim list As ListBox = DirectCast(sender, ListBox)
Dim row As DataRow = DirectCast(list.Items(e.Index), DataRowView).Row
Dim textBrush As Brush
e.DrawBackground()
Try
Me.statusBar1.Text = row("Valore").ToString
Select Case (DirectCast(row("Valore"), Integer))
Case 0
textBrush = Brushes.Red
Case 1
textBrush = Brushes.Green
Case 2
textBrush = Brushes.Blue
Case 3
textBrush = Brushes.Orange
End Select

e.Graphics.DrawString(DirectCast(row("Descrizione"), String), list.Font, textBrush, _
New RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, _
e.Bounds.Height))

e.DrawFocusRectangle()
Catch
End Try

End Sub


lore84 Profilo | Newbie

Ciao,
innanzitutto grazie per la risposta!

purtroppo il codice sembra non avere effetto, probabilmente sono io che sbaglio da qualche parte. Innanzitutto, la riga:

AddHandler lstTipi.DrawItem, AddressOf lstTipi_DrawItem

dove devo posizionarla?

grazie mille ancora


________________________________

Smell the flowers (while you can)

lore84 Profilo | Newbie

ho risolto il problema del testo, ho trovato questo codice sulla MSDN online e funziona SOLO se si imposta la proprietà DrawMode con uno dei valori OwnerDraw (Fixed o Variable):

' Disegna lo sfondo del singolo elemento della lista
e.DrawBackground()
' Crea un nuovo oggetto brush, per scrivere il testo
' relativo al singolo elemento
Dim bTool As Brush

' Seleziona il colore del singolo elemento, a seconda
' dell'elemento stesso
Select Case (e.Index)
Case 0
bTool = Brushes.Red
Case 1
bTool = Brushes.Orange
Case 2
bTool = Brushes.Purple
End Select

' Disegna l'elemento corrente, specificando testo, carattere,
' oggetto brush, e il rettangolo di layout
e.Graphics.DrawString(lstTipi.Items(e.Index), e.Font, bTool, New RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height))
' Disegna il fuoco attorno all'elemento selezionato, se la
' listbox è attiva
e.DrawFocusRectangle()

ora proverò a vedere se in questo modo posso anche cambiare il colore del rettangolo del fuoco, se trovo la soluzione la posto nel caso a qualcuno interessasse!

Se avete suggerimenti, postate pure grazi mille

Lore

________________________________

Smell the flowers (while you can)

lore84 Profilo | Newbie

per chi fosse interessato, posto la soluzione al mio problema =)


Dim tBrush As Brush ' Tavola per il colore del testo
Dim fBrush As Brush ' Tavola per il colore di sfondo
Dim iRect As RectangleF ' Rettangolo per la gestione delle aree di colore
Dim iText As String ' Testo da visualizzare
Dim i As Integer ' Indice per lo scorrimento degli elementi della lista

' Pulisci la lista
e.Graphics.Clear(Color.Linen)

' Disegna il bordo del controllo
ControlBorder(lstTipi, Drawing2D.DashStyle.Solid, Color.RosyBrown)

' Scorri tutti gli elementi della lista
For i = 0 To (lstTipi.Items.Count - 1)
' Crea l'oggetto rettangolo delle dimensioni dell'elemento corrente
iRect = New RectangleF(lstTipi.GetItemRectangle(i).X + 1, lstTipi.GetItemRectangle(i).Y + 1, lstTipi.GetItemRectangle(i).Width - 2, lstTipi.GetItemRectangle(i).Height - 2)

' Se l'elemento corrente è quello selezionato
If lstTipi.Items.IndexOf(lstTipi.Items(i)) = e.Index Then
' Imposta le tavole con i colori relativi all'elemento selezionato
fBrush = Brushes.RosyBrown ' Colore sfondo
tBrush = Brushes.Linen ' Colore testo
iText = " » " & lstTipi.Items(i) ' testo da visualizzare
Else
' Altrimenti imposta le tavole con i colori relativi all'elemento non selezionato
fBrush = Brushes.Linen ' Colore sfondo
tBrush = Brushes.RosyBrown ' Colore testo
iText = " " & lstTipi.Items(i) ' Testo da visualizzare
End If

' Riempi l'area del rettangolo
e.Graphics.FillRectangle(fBrush, iRect)

' Scrivi il testo da visualizzare
e.Graphics.DrawString(iText, lstTipi.Font, tBrush, iRect)

' Annulla l'oggetto rettangolo
iRect = Nothing
Next


a presto!

lore

________________________________

Smell the flowers (while you can)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5