2012-09-18 50 views
2

我有一個窗體中的樹形視圖。我最近添加了代碼來自定義繪製文本,這樣我就可以擺弄位置,粗體文本等等。除了看起來如果我做出更改時節點邊界不會更新,所以水平滾動條會陷入困惑它不需要顯示。我猜這是這種情況,因爲當我單擊樹上的節點時,我看到一個框,我認爲它是節點邊界,它太小了。.NET窗體TreeView節點寬度和自定義繪製文本(無法設置節點邊界)

在我的OnDrawText方法中,我希望能夠更改DrawTreeNodeEventArgs的Node成員上的邊界,但它是隻讀的。

我已經搜索了一個痛苦的很長時間的解決方案,現在無濟於事。設置treeview自身的邊界不會使滾動條出現。我在我的OnDrawText方法中使用TextRenderer.DrawText(),如果這有所作爲。

任何幫助非常感謝!

如果有人認爲看到代碼會有幫助,我會添加它。

+3

這是TreeView中衆所周知的缺陷,它缺少一個MeasureNode事件。解決它需要hackorama,你必須僞造節點的Text屬性來獲得足夠大的邊界。 –

+0

感謝您的評論。雖然我並不完全遵循。我在這裏閱讀了一個類似的帖子,但並未真正弄清楚該怎麼做。 – chrismead

+0

這是你的意思嗎,漢斯? http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/4ec2283b-7567-4fdf-b08e-be187b4afc7c/(以前的評論來自你的生活?)如果我已經在使用標籤對於其他事情,這是否意味着我運氣不好? – chrismead

回答

1

爲了其他人的利益尋找,我會提供我的hackorama(感謝Hans!)以供參考。

當我最初構建我的樹時,我現在將空白填充到將在我的... OnDrawText(對象發件人,DrawTreeNodeEventArgs e)方法中修改的節點的.Text末尾。在這種方法中,我使用TextRenderer.DrawText來自定義節點的外觀,但是與定製的東西相對應的矩形不會被任何計算我的滾動條大小所考慮。滾動條的大小仍然由原始文本決定。由於原始文本(大量地)用空白填充,所以滾動條被適當地繪製。

我不知道這將如何滯後一段時間,但它現在的作品。

編輯於11/12/12: 要隱藏工具提示,請忽略一些WndProc消息。 WM_VSCROLL部分是爲了減少滾動時的閃爍。其他案例與工具提示有關,但我不記得究竟哪一個做了什麼。我認爲Notify可能是您需要的唯一一個,但我認爲我會添加整個方法以防萬一。

protected override void WndProc(ref Message m) 
    { 
     switch (m.Msg) 
     { 
      //case WindowsConstants.WM_HSCROLL: 
      case WindowsConstants.WM_VSCROLL: 
       { 
        var nfy = m.WParam.ToInt32() & 0xFFFF; 
        if (nfy == WindowsConstants.SB_THUMBTRACK) 
        { 
         currentMsgCount++; 
         if (currentMsgCount % skipMsgCount == 0) 
          base.WndProc(ref m); 
         return; 
        } 
        if (nfy == WindowsConstants.SB_ENDSCROLL) 
         currentMsgCount = 0; 

        base.WndProc(ref m); 
       } 
       break; 
      case WindowsConstants.MouseLeave: 
      case WindowsConstants.NcMouseLeave: 
      case WindowsConstants.MouseHover: 
      case WindowsConstants.NcMouseHover: 
      case WindowsConstants.Notify: 
       break; 
      default: 
       base.WndProc(ref m); 
       break; 
     } 

    } 


    public const int NcMouseHover = 0x2a0; 
    public const int MouseHover = 0x2a1; 
    public const int NcMouseLeave = 0x2a2; 
    public const int MouseLeave = 0x2a3; 
    public const int Notify = 0x4e; 
+0

良好的解決方法,但是出現的工具提示(如節點文本被截斷)並使文本模糊不清? –

+1

爲此,我忽略了一些WndProc消息。我將添加到帖子中。 – chrismead