TreeView中的可变项高度给出了虚线

时间:2009-11-24 17:50:08

标签: winapi api treeview

嫣。

所以我终于想出了TVITEMEX的iIntegral成员是如何工作的。 MSDN文档没有想到在插入项目时设置它没有效果,但在项目插入后设置它有效。耶!

但是,当使用具有可变高度的项目的TVS_HASLINES样式时,仅使用iIntegral>绘制项目顶部的线条。例如如果我设置TVS_HASLINES和TVS

Here's what it looks like(无法发布图像WTF?)

我应该手动绘制更多的线以响应NM_CUSTOMDRAW或其他什么吗?

2 个答案:

答案 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进行一些调用。

但是,如果变量高度节点位于根级别,则可能无法执行任何操作。幸运的是我不需要那个。