我正在尝试根据我在文本框中键入的内容更改 ListView 项的颜色。当用户根据我使用的某些逻辑键入一些文本时,我有以下代码 ListView_SetItemState(hList, wordid, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
然后在我的 WM_NOTIFY block 上有这个;
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 填充我的虚拟 ListView 。在我的 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 消息。
根据 Spy++,我的 Listview 有这种样式
Windows 样式 (5021580D)
WS_CHILDWINDOW WS_VISIBLE WS_VSCROLL WS_TABSTOP LVS_REPORT LVS_SINGLESEL LVS_SHOWSELALWAYS
扩展样式 (00000204)
WS_EX_LEFT WS_EX_LTRREADING WS_EX_RIGHTSCROLLBAR WS_EX_NOPARENTNOTIFY WS_EX_CLIENTEDGE
最佳答案
如果您的控件在对话框中,您必须使用以下方法返回结果代码:
SetWindowLongPtr(hWnd, DWLP_MSGRESULT, result);
然后从 DlgProc
本身返回 TRUE
。
关于c++ - 虚拟 ListView 没有得到 CDDS_ITEMPREPAINT c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26510616/