2012-10-14 34 views
4

当选中节点并且具有焦点时,我需要更改选定节点的背面颜色 - 背景颜色在选中时变绿,但没有焦点时变为红色。我无法区分所选节点和专注于树视图而没有。位于TabPage对象中的树视图。如何使用TreeViewDrawMode.OwnerDrawAll更改TreeView中选定节点的背景颜色?

//... 
this.myTreeView.HideSelection = false; 
//... 
private void myTreeView_drawNode(object sender, DrawTreeNodeEventArgs e) 
{ 
     Color backColorSelected = System.Drawing.Color.Green; 
     Color backColor = System.Drawing.Color.Red; 
     // node selected and has focus 
     if (((e.State & TreeNodeStates.Selected) != 0) 
     && (this.myTabControl.Focused)) // this doesn't work, node is always red 
     { 
      using (SolidBrush brush = new SolidBrush(backColorSelected)) 
      { 
       e.Graphics.FillRectangle(brush, e.Bounds); 
      } 
     } 
     // node selected but doesn't have focus 
     else if ((e.State & TreeNodeStates.Selected) != 0) 
     { 
      using (SolidBrush brush = new SolidBrush(backColor)) 
      { 
      e.Graphics.FillRectangle(brush, e.Bounds); 
      } 
     } 
     // not selected at all 
     else 
     { 
      e.Graphics.FillRectangle(Brushes.White, e.Bounds); 
     } 

     e.Graphics.DrawRectangle(SystemPens.Control, e.Bounds); 

     TextRenderer.DrawText(e.Graphics, 
          e.Node.Text, 
          e.Node.TreeView.Font, 
          e.Node.Bounds, 
          e.Node.ForeColor); 
} 
+0

如何使用'myTreeView.Focused'而不是'this.myTabControl.Focused'? – aliassce

+0

@aliassce,那也行不通 –

+0

只是想让你知道,你的代码完美地为我需要做的事情工作。感谢您发布它。 – raddevus

回答

4

只要检查节点的属性,它的工作原理(测试)。我也建议缓存任何自定义画笔做个像以下。(当然你也可以使用Brushes.Red和Brushes.Green)

SolidBrush greenBrush = new SolidBrush(Color.Green); 
    SolidBrush redBrush = new SolidBrush(Color.Red); 

    private void myTreeView_drawNode(object sender, DrawTreeNodeEventArgs e) 
    { 
     if (e.Node.IsSelected) 
     { 
      if (treeView1.Focused) 
       e.Graphics.FillRectangle(greenBrush, e.Bounds); 
      else 
       e.Graphics.FillRectangle(redBrush, e.Bounds); 
     } 
     else 
      e.Graphics.FillRectangle(Brushes.White, e.Bounds); 

     e.Graphics.DrawRectangle(SystemPens.Control, e.Bounds); 

     TextRenderer.DrawText(e.Graphics, 
           e.Node.Text, 
           e.Node.TreeView.Font, 
           e.Node.Bounds, 
           e.Node.ForeColor); 
    } 

附:你可能需要渲染一些东西,你点击展开节点等。

相关问题