2009-09-10 60 views
0

我需要用閃爍的TreeNode實現自己的TreeView。我的原型是:如何在TreeView中重繪節點(WinForms)

public class BlinkTreeView : TreeView 
    { 
     private int blinkInterval; 

     private bool blinkState; 

     [Category("Behavior"), Browsable(true)] 
     public Icon BlinkIcon { get; set; } 

     [Category("Behavior"), Browsable(true)] 
     public Icon SelectedBlinkIcon { get; set; } 

     [Category("Behavior"), Browsable(true), DefaultValue(1000)] 
     public int BlinkInterval { 
      get 
      { 
       return blinkInterval; 
      } 
      set 
      { 
       blinkInterval = value; 
       if (value > 0) 
       { 
        blinkTimer.Interval = value; 
        blinkTimer.Start(); 
       } 
       else 
       { 
        blinkTimer.Stop(); 
        blinkState = false; 
        Invalidate(); 
       } 
      } 
     } 

     private Timer blinkTimer; 

     public BlinkTreeView() 
      : base() 
     { 
      blinkTimer = new Timer(); 
      blinkTimer.Tick += new EventHandler(blinkTimer_Tick); 
      blinkState = false; 
      this.DrawMode = TreeViewDrawMode.OwnerDrawAll; 
     } 

     void blinkTimer_Tick(object sender, EventArgs e) 
     { 
      if (BlinkInterval > 0) 
      { 
       blinkState = !blinkState; 
      } 
      else 
      { 
       blinkState = false; 
      } 
      Invalidate(); 
     } 

     protected override void OnDrawNode(DrawTreeNodeEventArgs e) 
     { 
      e.DrawDefault = true; 
      base.OnDrawNode(e); 
      if (blinkState) 
       { 
//here i want to draw blinked item, but i can't redraw item icons and text. 
       } 
      } 
     } 

在OnDrawNode我不能重繪節點的圖標和文本。 任何想法如何解決這個問題?

+0

這是什麼問題?你有什麼例外嗎? – 2009-09-10 08:13:16

+0

不,剛纔e.Graphics我可以在base.OnDrawNode(e)繪製的圖像下繪製; – Chernikov 2009-09-10 08:22:30

回答

2

只是一個想法,但你可以顛倒(異或)在物品上,而不必將樹變成擁有者繪製控件。我認爲它的工作原理類似如下:

using (Graphics g = Graphics.FromHwnd(Tree.Handle)) 
{ 
    TreeNode node = myBlinkyNode; 
    if (node != null) 
    { 
     using(Region myRegion = new Region(node.Bounds)) 
      myRegion.Xor(xorRect); 
    } 
} 

你需要跟蹤,如果眨眼可見或不可見和處理Paint事件,這樣就可以重新繪製的矩形反轉。

+0

是的,它可以是解決方案,但我確實需要Node的閃亮圖標。 – Chernikov 2009-09-11 11:11:44

0

有一個定時器觸發閃爍節點的狀態,即:

Node.ForeColor = Node.ForeColor == Color.White ? Color.Black : Color.White;