2009-11-24 52 views
0

Wee。TreeView中的變量項高度給出虛線

所以我終於想出了TVITEMEX的iIntegral成員是如何工作的。 MSDN文檔沒有想到提及在插入項目時設置它沒有效果,但在項目插入後設置它是有效的。好極了!

但是,當使用TVS_HASLINES樣式和高度可變的項目時,只會爲iIntegral> 1的項目的頂部繪製線條。如果我設置TVS_HASLINES和TVS

Here's what it looks like(不能發表圖片跆拳道?)

我應該手動繪製更多的線路以響應NM_CUSTOMDRAW什麼?

回答

0

是的,Windows對改變高度所獲得的空白空間沒有任何作用。

從MSDN:

樹視圖控件不會在 額外的面積,這顯示 項內容下面畫,但這個空間可以由應用程序使用 繪製 時使用自定義繪製。未使用自定義抽獎的應用 應該 將此值設置爲1,否則 行爲未定義。

0

好的,問題解決了。

我找不到一個簡單的答案,但我確實很努力地解決了這個問題。它基本上只是繪製額外的線段在自定義繪製:

// _cd is the NMTVCUSTOMDRAW structure 
// ITEMHEIGHT is the fixed height set in TreeView_SetItemHeight 
// linePen is HPEN of a suitable pen to draw the lines (PS_ALTERNATE etc.) 
// indent is the indentation size returned from TreeView_GetIndent 

case CDDS_ITEMPREPAINT : { 

    // Expand line because TreeView is buggy 

    RECT r = _cd->nmcd.rc; 
    HDC hdc = _cd->nmcd.hdc; 
    HTREEITEM hItem = (HTREEITEM) _cd->nmcd.dwItemSpec; 

    if(r.bottom - r.top > ITEMHEIGHT) { 

    HGDIOBJ oldPen = SelectObject(hdc, linePen); 

    // Draw any lines left of current item 

    HTREEITEM hItemScan = hItem; 
    for(int i = _cd->iLevel; i >= 0; --i) { 

     // Line should be drawn only if node has a next sibling to connect to 

     if(TreeView_GetNextSibling(getHWnd(), hItemScan)) { 

     // Lines seem to start 17 pixels from left edge of control. But no idea 
     // where that constant comes from or if it is really constant. 

     int x = 17 + indent * i; 
     MoveToEx(hdc, x, r.top + ITEMHEIGHT, 0); 
     LineTo(hdc, x, r.bottom); 

     } 

     // Do the same for the parent 

     hItemScan = TreeView_GetParent(getHWnd(), hItemScan); 

    } 

    SelectObject(hdc, oldPen); 

    } 

} 

從PS_ALTERNATE刷模式有時可能不會通過控制繪製的線完全一致,但這是難以察覺的。更糟糕的是,儘管我已經安裝了最新的通用控件以及所有的Service Pack和修補程序,但2005年在TreeView中仍然存在一些錯誤。特別是,TreeView不能正確更新它的高度。我找到的唯一解決方法是強制某些節點的摺疊/展開,並對InvalidateRect執行一些調用。

但是,如果可變高度節點位於根級別,那麼似乎沒有任何可以執行的操作。幸運的是,我不需要那個。