如题,怎样给CTreeCtrl添加网格线显示?CListCtrl很简单,设置一个LVS_EX_GRIDLINES的风格就行了,但CTreeCtrl没有这个风格。怎么给CTreeCtrl添加网格线,有没有办法?求救啊,各位给个办法!!!

解决方案 »

  1.   

    网格线?
    指的是那种多少行多少列的线吗?
    treectrl要这样的线有什么用
      

  2.   

    因为我用CTreeCtrl做的不是目录那种少量信息的,我要每行显示较多的信息信息,支持收缩查看,就像UE过滤后的那种效果,我要背景有网格线。
      

  3.   

    http://www.codeproject.com/KB/tree/CColumnTreeCtrl.aspx
      

  4.   

    我用的就是这个控件啊,但是我做出来的没有背景网格线,这个控件是把几个控件集成封装了一下,其中包括CTreeCtrl,说白了还是CTreeCtrl画网格线的问题。
      

  5.   

    void CSupeTree::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
    {
    LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    /*不同控件消息不同,如TreeView控件发送NM_CUSTOMDRAW通知码时,lParam指向的
    是NMTVCUSTOMDRAW结构体,这个结构体的第一个成员是NMCUSTOMDRAW结构体*/
    NMCUSTOMDRAW* pNMCustomDraw = (NMCUSTOMDRAW*)pNMHDR;
    NMTVCUSTOMDRAW* pNMTVCustomDraw = (NMTVCUSTOMDRAW*)pNMHDR; switch(pNMCustomDraw->dwDrawStage)
    {
    case CDDS_PREPAINT: //绘制循环开始时
    *pResult = CDRF_NOTIFYITEMDRAW; //绘制items前、后都发送NM_CUSTOMDRAW
    break;
    case CDDS_ITEMPREPAINT :  //绘制item前,可绘制背景
    { //自己画,不发送NM_CUSTOMDRAW,绘制item后发送NM_CUSTOMDRAW
    HTREEITEM hItem = (HTREEITEM)pNMCustomDraw->dwItemSpec;
    CRect rcItem = pNMCustomDraw->rc; CRect rtemp;
    GetItemRect(hItem,&rtemp,TRUE); if (rtemp.left > m_pHeader->GetItemWidth(0))
    {
    //测试这个位置
    //*pResult = CDRF_SKIPDEFAULT ;
    //break;
    }
    if (rcItem.IsRectEmpty())
    { //不需要重绘
    *pResult = CDRF_DODEFAULT;
    break;
    }
    *pResult = (CDRF_DODEFAULT | CDRF_NOTIFYPOSTPAINT);
    }
    break; case CDDS_ITEMPOSTPAINT: //绘制item后
    {
    HTREEITEM hItem = (HTREEITEM)pNMCustomDraw->dwItemSpec;
    CRect rcItem = pNMCustomDraw->rc;
    if (rcItem.IsRectEmpty())
    { //不需要重绘
    *pResult = CDRF_DODEFAULT;
    break;
    }
    CDC dc;
    dc.Attach(pNMCustomDraw->hdc);
    CRect rLibrect; COLORREF crTextBk = pNMTVCustomDraw->clrTextBk;
    COLORREF crWnd = GetSysColor(COLOR_WINDOW); GetItemRect(hItem,&rLibrect,TRUE);
    dc.FillSolidRect(&rLibrect, crWnd);
    //TRACE("left:%d  ,width:%d  \n",rLibrect.left,m_pHeader->GetItemWidth(0));
    if (rLibrect.right > m_pHeader->GetItemWidth(0))
    { //如果树的右侧超过表头0的宽度,侧减小RECT的大小
    rLibrect.right = m_pHeader->GetItemWidth(0);
    if (rLibrect.left> m_pHeader->GetItemWidth(0))
    { //如果左侧超出了首个表头的宽度,抹除表头后的+号
    rLibrect.left= m_pHeader->GetItemWidth(0);
    CRect Outrect;
    GetItemRect(hItem,&Outrect,FALSE);
    Outrect.left = rLibrect.left;
    dc.FillSolidRect(&Outrect, crWnd);
    }
    } if (pNMCustomDraw->uItemState & CDIS_FOCUS )
    {
    dc.DrawFocusRect(&rLibrect);
    if (crTextBk != crWnd) // 画出焦点背景
    dc.FillSolidRect(&rLibrect, crTextBk);
    }
    dc.DrawText(GetItemText(hItem),&rLibrect,DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
    //在这里用false得到了一整条Rect,盖住了加号。
    //用true得到了文本部分的Rect。以下画出横线
    GetItemRect(hItem,&rLibrect,FALSE);
    rLibrect.bottom+=1;
    dc.DrawEdge(&rLibrect,EDGE_ETCHED, BF_BOTTOM);
    GetItemRect(hItem,&rLibrect,FALSE);
    int temp = 0;
    for (int i =0 ; i<m_pHeader->GetItemCount() ; i++)
    {
    temp += m_pHeader->GetItemWidth(i);
    rLibrect.right = temp;
    dc.DrawEdge(&rLibrect, BDR_RAISEDOUTER, BF_RIGHT);
    }
    //==============以上画线部分完成================
    dc.Detach();
    *pResult = CDRF_DODEFAULT;
    break;
    }
    default:
    *pResult = CDRF_DODEFAULT ;
    }
    }
      

  6.   

    那你响应NM_CUSTOMDRAW,自己绘制线条