29/10/21 11:44
Carlo
La motivazione della differenza che hai rispetto alla mia visualizzazione potrebbe risiedere nella combinazione dei colori del S.O.
Ma i colori li puoi scegliere tu e mettere quelli che meglio risaltano.
Per cambiare il colore del testo selezionato le possibilità sono molteplici, restando nella tipologia scelta è sufficiente al redraw della TreeView controllare se il testo in visualizzazione è selezionato, e scegliere un colore adeguato, anche lo sfondo della selezione può essere colorato a piacere.
alla riga 53 e alla riga 95, i colori che il testo deve avere se selezionato
alla riga 55 traccio un rettangolo pieno che da il colore di fondo della selezione dei soli testi colorati
la riga 55 se omessa, il colore di fondo della selezione sarà quello di default (dipende da win)
Ma i colori li puoi scegliere tu e mettere quelli che meglio risaltano.
Per cambiare il colore del testo selezionato le possibilità sono molteplici, restando nella tipologia scelta è sufficiente al redraw della TreeView controllare se il testo in visualizzazione è selezionato, e scegliere un colore adeguato, anche lo sfondo della selezione può essere colorato a piacere.
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load TVAtt.DrawMode = TreeViewDrawMode.OwnerDrawText AddHandler TVAtt.DrawNode, AddressOf TVAtt_drawNode TVAtt.BackColor = Color.White TVAtt.LineColor = Color.Gray TVAtt.ForeColor = Color.Black TVAtt.HideSelection = False ' la selezione sarà visible anche quando la Treeview o il form perde il fuoco End Sub Private Sub TVAtt_drawNode(sender As Object, e As DrawTreeNodeEventArgs) If e.Node Is Nothing Then Return Dim selected As Boolean = e.State And TreeNodeStates.Selected Dim g As Graphics = e.Graphics Dim colore1 As Brush = New SolidBrush(TVAtt.ForeColor) Dim colore2 As Brush = New SolidBrush(TVAtt.ForeColor) Dim linea = e.Node.Text.Split(";"c) Dim Size As SizeF If e.Node.Bounds.X = 0 Then Exit Sub If linea.GetUpperBound(0) > 1 Then Select Case linea(2).ToLower().Trim() Case "red" colore1 = Brushes.Red Case "gray" colore1 = Brushes.Gray Case "green" colore1 = Brushes.Green Case "blue" colore1 = Brushes.RoyalBlue Case "yellow" colore1 = Brushes.Gold Case "cyan" colore1 = Brushes.DarkCyan Case "magen" colore1 = Brushes.Magenta Case "orange" colore1 = Brushes.Orange Case Else colore1 = New SolidBrush(TVAtt.ForeColor) End Select If selected Then colore1 = New SolidBrush(Color.White) ' colore del testo1 se selezionato ' colore di fondo della selezione e.Graphics.FillRectangle(Brushes.DarkBlue, e.Node.Bounds) End If If linea.GetUpperBound(0) > 2 AndAlso linea(3).ToLower.Trim = "true" Then Size = g.MeasureString(linea(0), New Font(TVAtt.Font, FontStyle.Bold)) g.DrawString(linea(0), New Font(TVAtt.Font, FontStyle.Bold), colore1, e.Node.Bounds) Else Size = g.MeasureString(linea(0), TVAtt.Font) g.DrawString(linea(0), TVAtt.Font, colore1, e.Node.Bounds) End If End If If linea.GetUpperBound(0) > 3 Then Select Case linea(4).ToLower().Trim() Case "red" colore2 = Brushes.Red Case "gray" colore2 = Brushes.Gray Case "green" colore2 = Brushes.Green Case "blue" colore2 = Brushes.RoyalBlue Case "yellow" colore2 = Brushes.Gold Case "cyan" colore2 = Brushes.DarkCyan Case "magen" colore2 = Brushes.Magenta Case "orange" colore2 = Brushes.Orange Case Else colore2 = New SolidBrush(TVAtt.ForeColor) End Select If selected Then colore2 = New SolidBrush(Color.White) ' colore del testo2 se selezionato If linea.GetUpperBound(0) > 4 AndAlso linea(5).ToLower.Trim = "true" Then g.DrawString(linea(1), New Font(TVAtt.Font, FontStyle.Bold), colore2, e.Node.Bounds.X + Size.Width + 2, e.Node.Bounds.Y) Else g.DrawString(linea(1), TVAtt.Font, colore2, e.Node.Bounds.X + Size.Width + 2, e.Node.Bounds.Y) End If End If If linea(0) <> "" And linea.GetUpperBound(0) = 0 Then e.DrawDefault = True End If End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim treeNode1 As New TreeNode("PrimoNodo ") treeNode1.Nodes.Add(" testo1Arancio;testo2Giallo;orange;true;yellow;true") treeNode1.Nodes.Add(" testo1Rosso;testo2Blue;red;;blue;true") treeNode1.Nodes.Add(" testo1Nero;testo2Grigio;black;true;gray;") TVAtt.Nodes.Add(treeNode1) Dim treeNode2 As New TreeNode("SecondoNodo ") treeNode2.Nodes.Add(" testo1Verde;testo2Giallo;green;;yellow;") treeNode2.Nodes.Add(" testo1Rosso;testo2Blue;red;true;blue;") treeNode2.Nodes.Add(" testo1Nero;testo2Grigio;black;;gray;true") TVAtt.Nodes.Add(treeNode2) TVAtt.Nodes.Add(" testoStandard") TVAtt.Nodes.Add(" testoStandard") Dim treeNode3 As New TreeNode("TerzoNodo ") treeNode3.Nodes.Add(" Testo;123;cyan;;red;") treeNode3.Nodes.Add(" Testo;456;cyan;;red;True") treeNode3.Nodes.Add(" Testo;789;cyan;;red;True") Dim treeNode4 As New TreeNode("QuartoNodo ") treeNode4.Nodes.Add(" testo1Verde;testo2Giallo;green;true;yellow;true") treeNode4.Nodes.Add(" testo1Rosso;testo2Nero;red;;black;true") treeNode4.Nodes.Add(" testo1Magenta;testo2Arancio;magen;true;orange;") treeNode3.Nodes.Add(treeNode4) TVAtt.Nodes.Add(treeNode3) End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click If TVAtt.Nodes.Count > 2 Then TVAtt.Nodes.Item(3).Text = " TV scadenza;-123-;green;;red;true" End If End Sub End Class
alla riga 53 e alla riga 95, i colori che il testo deve avere se selezionato
alla riga 55 traccio un rettangolo pieno che da il colore di fondo della selezione dei soli testi colorati
la riga 55 se omessa, il colore di fondo della selezione sarà quello di default (dipende da win)
Ultima modifica effettuata da Carlo 29/10/21 12:28
in programmazione tutto è permesso