虚拟列表视图无法CDDS_ITEMPREPAINT c++

Virtual listview doesn't get CDDS_ITEMPREPAINT c++

本文关键字:ITEMPREPAINT c++ CDDS 列表 视图 虚拟      更新时间:2023-10-16

我正试图根据在文本框上键入的内容更改列表视图项的颜色。当用户根据我使用的一些逻辑键入一些文本时,我有以下代码ListView_SetItemState(hList,wordid,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED| LVIS_SELECTED);

然后在我的WM_NOTIFY块上,我有这个;

case WM_NOTIFY:
{
    NMHDR *pNMHDR= (NMHDR*)lParam;
    switch(pNMHDR->code){
           case LVN_GETDISPINFO:
                OnGetdispinfo(pNMHDR);
                break;
            case NM_CUSTOMDRAW:
               wmnot= OnDraw(pNMHDR);
               return wmnot;
                break;
         }
    return 0;
}

OnGetdispinfo函数使用Sqlite填充我的虚拟列表视图。在我的ondraw函数中,我有这个

int OnDraw (NMHDR* pNMHDR){
    int nIndex,state;
    int result;
    NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR ); 
if (pLVCD->nmcd.hdr.hwndFrom==hList)
{
    switch (pLVCD->nmcd.dwDrawStage)
    {
    case CDDS_PREPAINT:
        result= CDRF_NOTIFYITEMDRAW;
        break;
    case CDDS_ITEMPREPAINT:
        result=CDRF_NOTIFYSUBITEMDRAW;
        break;
    case CDDS_SUBITEM|CDDS_ITEMPREPAINT:
        nIndex=pLVCD->nmcd.dwItemSpec;
        state=ListView_GetItemState(hList,nIndex,LVIF_TEXT |LVIF_PARAM);
        if(state&LVIS_SELECTED==LVIS_SELECTED)   
        {
            pLVCD->clrTextBk=RGB(124,34,78);
            return CDRF_NEWFONT;
        }
        result= CDRF_DODEFAULT;
        break;
    default:
        result=CDRF_DODEFAULT;
        break;
    }
}
    return result;  // CDRF_DODEFAULT

}

我收到了CDDS-PREPAINT消息,但我根本没有收到CDDS-ITEMPREPAINT消息。

我的Listview根据Spy++有这种风格

Windows样式(5021580D)

WS_CHILDWINDOW可见(_V)WS_VSCROLLWS_TABSTOPLVS_REPORTLVS_SINGLESELLVS_SHOWSELALWAYS

扩展样式(00000204)

WS_EX_LEFTWS_EX_ltreadingWS_EX_右滚动条WS_EX_NOPARENTNOTIFYWS_EX_CLIENTEDGE

如果控件在对话框中,则必须使用返回结果代码

SetWindowLongPtr(hWnd, DWLP_MSGRESULT, result);

然后从CCD_ 2自身返回CCD_。

我终于解决了这个问题。这是固定代码。首先,我添加了onchange notifier函数,这样我就可以检测更改以供选择。

void OnItemChange (LPARAM lParam)
{
    LPNMLISTVIEW pNMListView = reinterpret_cast<LPNMLISTVIEW>(lParam);
    if ((pNMListView->uChanged & LVIF_STATE) 
        && (pNMListView->uNewState & LVNI_SELECTED))
    {
        ListView_RedrawItems(hList,Query.WordID,pNMListView->iItem);
        ListView_RedrawItems(hList,pNMListView->iItem,Query.WordID);
        Query.WordID=pNMListView->iItem;
        //DO STUFF;
    }

}

然后我也修改了我的自定义绘图功能。

LRESULT OnDraw  (LPARAM lParam)
{
    LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;
    int nIndex;
    int state;
    if (lplvcd->nmcd.hdr.hwndFrom!=hList)
        return CDRF_DODEFAULT;
    switch(lplvcd->nmcd.dwDrawStage) 
    {
    case CDDS_PREPAINT : //Before the paint cycle begins
        return  CDRF_NOTIFYITEMDRAW;
    case CDDS_ITEMPREPAINT: 
        return CDRF_NOTIFYSUBITEMDRAW;
    case CDDS_POSTPAINT:
        nIndex=lplvcd->nmcd.dwItemSpec;
        state=lplvcd->nmcd.uItemState;
        return CDRF_DODEFAULT;
    case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
        nIndex=lplvcd->nmcd.dwItemSpec;
        state=lplvcd->nmcd.uItemState;
        if  (  nIndex==Query.WordID)    {
        lplvcd->clrText   =  GetSysColor(COLOR_HIGHLIGHTTEXT);
        lplvcd->clrTextBk = GetSysColor(COLOR_HIGHLIGHT);
        return CDRF_NEWFONT;
        }
        else{
            lplvcd->clrText   = GetSysColor(COLOR_WINDOWTEXT);  
            lplvcd->clrTextBk = GetSysColor(COLOR_WINDOW); 
            return CDRF_NEWFONT;
        }
    default:
        return CDRF_DODEFAULT;
    }
    return CDRF_DODEFAULT;
}

因此,基本上,我不是通过ListView消息来选择项目。相反,我将Query.WordID设置为我想要选择的项目,如果项目被选中(通过鼠标或编程),我会手动更改项目的颜色。

相关文章:
  • 没有找到相关文章