1. 程式人生 > >Winform自定義繪製TreeView

Winform自定義繪製TreeView

文/renji  出處/部落格園

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

attachment.aspx?attachmentid=2369

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

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進行深度挖掘,這個頁面是可以教你怎麼開始。