嫣。
所以我终于想出了TVITEMEX的iIntegral成员是如何工作的。 MSDN文档没有想到在插入项目时设置它没有效果,但在项目插入后设置它有效。耶!
但是,当使用具有可变高度的项目的TVS_HASLINES样式时,仅使用iIntegral>绘制项目顶部的线条。例如如果我设置TVS_HASLINES和TVS
Here's what it looks like(无法发布图像WTF?)
我应该手动绘制更多的线以响应NM_CUSTOMDRAW或其他什么吗?
答案 0 :(得分:0)
是的,Windows不会对通过更改高度获得的空白区域执行任何操作。
来自MSDN:
树视图控件没有绘制 额外的区域,出现在 项目内容,但这个空间可以 用于绘图的应用程序 使用自定义绘图时。应用 不使用自定义绘图应该 将此值设置为1,否则为 行为未定义。
答案 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画笔中的图案有时与控件绘制的线条不完全对齐,但这几乎不可察觉。更糟糕的是,即使我安装了最新的通用控件和所有服务包和修补程序,但在2005年仍然存在TreeView中记录的错误。具体来说,TreeView没有正确更新其高度。我发现的唯一解决方法是强制某些节点折叠/扩展,并对InvalidateRect进行一些调用。
但是,如果变量高度节点位于根级别,则可能无法执行任何操作。幸运的是我不需要那个。