请问listview自画模式可以只自画一行而其它按默认画吗?
比如我只想自画最后一行,而前面所有行都是按LISTVIEW默认的显示要怎么做?

解决方案 »

  1.   

    你需要处理ListView发给父窗口的WM_NOTIFY消息:
    抄一段给你://父窗口处理WM_NOTIFY消息的一段代码
    //WPARAM wParam
    //LPARAM lParam
    LPNMHDR pHdr = LPNMHDR(lParam);
    UINT code = pHdr->code;
    NMLVCUSTOMDRAW* pInfo = (NMLVCUSTOMDRAW*)lParam;
    DWORD stage = pInfo->nmcd.dwDrawStage;
    LRESULT result = CDRF_DODEFAULT;
    if(stage & CDDS_PREPAINT)
    {
    if((stage & CDDS_ITEM) == 0)
    { //控件本身的绘制通知 /*
    DrawListView();//自身的绘制采用默认动作,否则你应在这里写你的控件绘制代码
    return CDRF_SKIPDEFAULT;//告诉系统:我已经执行了控件本身的绘制 
    */ /*
    return CDRF_DODEFAULT//告诉系统执行默认的控件绘制工作,后面不会再针对Item和SubItem触发WM_NOTIFY消息
    */ return CDRF_NOTIFYITEMDRAW;//简单告诉系统要对每一个Item触发WM_NOTIFY消息,并且控件执行默认的绘制
    }
    else
    { //Item的绘制代码
    if(ViewMode == ListView_Report)//Report模式,列表模式
    {
    if((stage & CDDS_SUBITEM) != CDDS_SUBITEM)
    { //Item本身的绘制通知
    /*
    DrawItem(...);//Item本身的绘制可以在这里进行,
    return CDRF_SKIPDEFAULT;//告诉系统:我已经执行了Item本身的绘制,不再劳系统您的大驾了,以后不会触发SubItem的绘制通知。
    */
    return CDRF_NOTIFYSUBITEMDRAW;//通知系统要对每一个SubItem触发WM_NOTIFY消息
    }
    else
    { //SubItem的绘制通知
    /*
    DrawSubItem();
    return CDRF_SKIPDEFAULT;//告诉系统我已经接管了SubItem绘制工作,系统以后就不会画蛇添足的再绘制了。
    */
    return CDRF_DODEFAULT;//告诉系统执行默认的绘制工作
    }
    }
    else//非列表模式
    {
    /*
    DrawItem(...);//Item本身的绘制可以在这里进行,
    return CDRF_SKIPDEFAULT;//告诉系统:我已经执行了Item本身的绘制,不再劳系统您的大驾了,以后不会触发SubItem的绘制通知。
    */
    return CDRF_DODEFAULT;//告诉系统执行默认的绘制工作
    }
    }
    }//记得要给分哦,写这个我费了力的。
      

  2.   

    你需要处理ListView发给父窗口的WM_NOTIFY消息:
    抄一段给你://父窗口处理WM_NOTIFY消息的一段代码
    //WPARAM wParam
    //LPARAM lParam
    LPNMHDR pHdr = LPNMHDR(lParam);
    UINT code = pHdr->code;
    NMLVCUSTOMDRAW* pInfo = (NMLVCUSTOMDRAW*)lParam;
    DWORD stage = pInfo->nmcd.dwDrawStage;
    LRESULT result = CDRF_DODEFAULT;
    if(stage & CDDS_PREPAINT)
    {
    if((stage & CDDS_ITEM) == 0)
    { //控件本身的绘制通知 /*
    DrawListView();//自身的绘制采用默认动作,否则你应在这里写你的控件绘制代码
    return CDRF_SKIPDEFAULT;//告诉系统:我已经执行了控件本身的绘制 
    */ /*
    return CDRF_DODEFAULT//告诉系统执行默认的控件绘制工作,后面不会再针对Item和SubItem触发WM_NOTIFY消息
    */ return CDRF_NOTIFYITEMDRAW;//简单告诉系统要对每一个Item触发WM_NOTIFY消息,并且控件执行默认的绘制
    }
    else
    { //Item的绘制代码
    if(ViewMode == ListView_Report)//Report模式,列表模式
    {
    if((stage & CDDS_SUBITEM) != CDDS_SUBITEM)
    { //Item本身的绘制通知
    /*
    DrawItem(...);//Item本身的绘制可以在这里进行,
    return CDRF_SKIPDEFAULT;//告诉系统:我已经执行了Item本身的绘制,不再劳系统您的大驾了,以后不会触发SubItem的绘制通知。
    */
    return CDRF_NOTIFYSUBITEMDRAW;//通知系统要对每一个SubItem触发WM_NOTIFY消息
    }
    else
    { //SubItem的绘制通知
    /*
    DrawSubItem();
    return CDRF_SKIPDEFAULT;//告诉系统我已经接管了SubItem绘制工作,系统以后就不会画蛇添足的再绘制了。
    */
    return CDRF_DODEFAULT;//告诉系统执行默认的绘制工作
    }
    }
    else//非列表模式
    {
    /*
    DrawItem(...);//Item本身的绘制可以在这里进行,
    return CDRF_SKIPDEFAULT;//告诉系统:我已经执行了Item本身的绘制,不再劳系统您的大驾了,以后不会触发SubItem的绘制通知。
    */
    return CDRF_DODEFAULT;//告诉系统执行默认的绘制工作
    }
    }
    }//记得要给分哦,写这个我费了力的。