void CHtListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
*pResult = CDRF_DODEFAULT; if (pLVCD->nmcd.dwDrawStage == CDDS_PREPAINT)
{
             //  能进入这里  ////////////////////////////////////////
    *pResult = CDRF_NOTIFYITEMDRAW;
}
else if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
{
             //  能进入这里 ///////////////////////////////////
    *pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if (pLVCD->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))
{
////////////////////////////////////  不能进入这里,  这是为什么 ?  /////////////
    int nItem = static_cast<int> (pLVCD->nmcd.dwItemSpec);
    int nSubItem = pLVCD->iSubItem;     CDC* pDC = CDC::FromHandle(pLVCD->nmcd.hdc);
    CRect rect;
    GetSubItemRect(nItem, nSubItem, LVIR_BOUNDS, rect);
    if (GetItemState(nItem, LVIS_SELECTED))
                 DrawText(nItem, nSubItem, pDC, crHighLightText, crHighLight , rect);
             else
                 DrawText(nItem, nSubItem, pDC, crText, crBkgnd, rect);

    *pResult = CDRF_SKIPDEFAULT;
}
} 程序不能进入绘制SubItem的地方, 而且我查了大量的文章都没有答案, 请高手指教 !

解决方案 »

  1.   

    else if (pLVCD->nmcd.dwDrawStage == (CDDS_SUBITEM | CDDS_PREPAINT))
      

  2.   

    在report状态么/* This notification is received only if you are in report mode and
    returned CDRF_NOTIFYSUBITEMDRAW in the previous step. At
    this point, you can change the background colors for the
    subitem and return CDRF_NEWFONT.*/
      

  3.   

    是在Report 状态的, MeasureItem()中已设置了高度, 但就是单元格(SubItem)中的文字没法显示, 因为进不了SubItem.
      

  4.   

    这段代码我测试是没有问题的,都能进入:
        NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
        *pResult = CDRF_DODEFAULT;
        
        if (pLVCD->nmcd.dwDrawStage == CDDS_PREPAINT)
        {
            *pResult = CDRF_NOTIFYITEMDRAW;
        }
        else if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
        {
            *pResult = CDRF_NOTIFYSUBITEMDRAW;
        }
        else if (pLVCD->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))
        {
            *pResult = CDRF_SKIPDEFAULT;
        }
      

  5.   

    请问 Atomictry(天影):我的代码和你的是一样的, 问题到底出在什么地方啊? 能否把你的完整的工程发给我啊? 不胜感激!
      
    我的Email : [email protected]
      

  6.   

    再说明以下:ListCtrl 的资源设了 owner draw fixed 属性, Style 设置了REPORT, 在MeasurItem()中设置了行高.  这样ListCtrl中的SubItem 中的文本就不显示了, 需要自己在OnCustomDraw()中绘制,
    但进不了(CDDS_ITEMPREPAINT | CDDS_SUBITEM), 所以就不能显示出文字.
      

  7.   

    else if (pLVCD->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))改成else if ((pLVCD->nmcd.dwDrawStage & (CDDS_ITEMPREPAINT | CDDS_SUBITEM)) == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))
      

  8.   

    感谢大家!    这个问题已解决. 要在DrawItem中做. pDC->DrawText(..).