【问题标题】:Variable item height in TreeView gives broken linesTreeView 中的可变项目高度给出了虚线
【发布时间】:2010-12-19 23:46:44
【问题描述】:

凌晨。

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

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

Here's what it looks like(不能发图片WTF?)

我是否应该手动绘制更多线条以响应 NM_CUSTOMDRAW 之类的?

【问题讨论】:

    标签: winapi api treeview


    【解决方案1】:

    是的,Windows 不会对通过更改高度获得的空白空间做任何事情。

    来自 MSDN:

    树视图控件不绘制在 额外的区域,它出现在下方 项目内容,但这个空间可以 应用程序用于绘图 使用自定义绘图时。应用 不使用自定义绘图的应该 将此值设置为 1,否则 行为未定义。

    【讨论】:

      【解决方案2】:

      好的,问题解决了。

      我没有找到一个简单的答案,但我确实努力解决了这个问题。它基本上只是在自定义绘图中绘制额外的线段:

      // _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 画笔的图案有时与控件绘制的线不完全对齐,但这几乎不明显。更糟糕的是,即使我安装了最新的通用控件以及所有服务包和修补程序,TreeView 中仍然存在错误,早在 2005 年就有记录。具体来说,TreeView 没有正确更新其高度。我找到的唯一解决方法是强制节点折叠/扩展并对 InvalidateRect 进行一些调用。

      如果可变高度节点位于根级别,那么您似乎无能为力。幸运的是我不需要那个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-29
        • 2018-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多