所以我終於想出了TVITEMEX的iIntegral成員是如何工作的。 MSDN文檔沒有想到提及在插入項目時設置它沒有效果,但在項目插入後設置它是有效的。好極了!
但是,當使用TVS_HASLINES樣式和高度可變的項目時,只會爲iIntegral> 1的項目的頂部繪製線條。如果我設置TVS_HASLINES和TVS
Here's what it looks like(不能發表圖片跆拳道?)
我應該手動繪製更多的線路以響應NM_CUSTOMDRAW什麼?
所以我終於想出了TVITEMEX的iIntegral成員是如何工作的。 MSDN文檔沒有想到提及在插入項目時設置它沒有效果,但在項目插入後設置它是有效的。好極了!
但是,當使用TVS_HASLINES樣式和高度可變的項目時,只會爲iIntegral> 1的項目的頂部繪製線條。如果我設置TVS_HASLINES和TVS
Here's what it looks like(不能發表圖片跆拳道?)
我應該手動繪製更多的線路以響應NM_CUSTOMDRAW什麼?
是的,Windows對改變高度所獲得的空白空間沒有任何作用。
從MSDN:
樹視圖控件不會在 額外的面積,這顯示 項內容下面畫,但這個空間可以由應用程序使用 繪製 時使用自定義繪製。未使用自定義抽獎的應用 應該 將此值設置爲1,否則 行爲未定義。
好的,問題解決了。
我找不到一個簡單的答案,但我確實很努力地解決了這個問題。它基本上只是繪製額外的線段在自定義繪製:
// _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執行一些調用。
但是,如果可變高度節點位於根級別,那麼似乎沒有任何可以執行的操作。幸運的是,我不需要那個。