教你自定義繪製TreeView

在Winform上開發,常常用到TreeView這個控件,比如我們做GIS開發就常用它來做圖層控制。TreeView有很多可以定製的屬性來改變它的外觀,但如果定製仍無法滿足你的要求,又不想花錢買更好的控件,就要利用TreeView提供的自定義繪製功能了。

像這樣簡單的進行一些自定義的繪製,在大部分情況下就滿足客戶的需求了。要做到它其實很簡單,重點就是:

DrawMode = TreeViewDrawMode.OwnerDrawAll;
DrawNode += CustomDrawNode;

DrawMode這個屬性改變以後,繪製每一個菜單項的權利都交到你手裏了。然後在你的CustomDrawNode中根據你的想法來繪製每一項:

private void CustomDrawNode(object sender, DrawTreeNodeEventArgs e)
    {
      
//如果按照默認實現來繪製,就這樣做
      if (e.Node.Level > 0)
      {
        e.DrawDefault 
= true;
        
return;
      }
      
//繪製的工作就完全是GDI+的那一套了
      LinearGradientMode mode = LinearGradientMode.Vertical;
      Rectangle rect 
= e.Bounds;
      
//繪製漸變背景
      using (LinearGradientBrush brush = new LinearGradientBrush(rect, _startColor, _endColor, mode))
      {
        e.Graphics.FillRectangle(brush, rect);
      }
      Font nodeFont 
= _defaultFont;
      
//繪製加減號,做了一些硬編碼
      e.Graphics.DrawImage((e.Node.IsExpanded ? _minusImage : _plusImage), e.Bounds.Location.X + 5, e.Bounds.Location.Y + 3);
      
//繪製文字
      e.Graphics.DrawString(e.Node.Text, nodeFont, Brushes.Black, (e.Bounds.Location.X + 20), (e.Bounds.Location.Y));
    }

完整的代碼在這裏,放大縮小的圖片借用自google doc。由於我們始終是在TreeView控件基礎上自定義,所以受其限制,繪製的矩形不能超出每個菜單項的高度,因此想讓字號變大,或者增加其他的控件在裏面就相當困難了。還好這個實現已經滿足了我項目的基本要求。如果你沒那麼幸運,就看看這個新的TreeView控件,它的功能極其強大,並且性能遠比默認的TreeView要好,最重要的是,它是免費且開源的。只是使用難度頗大,擴展也挺麻煩,所以還算不上是一款卓越的控件。
如果只是想對默認TreeView進行深度挖掘,這個頁面是可以教你怎麼開始。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章