我正在尝试根据我在文本框中输入的内容更改listview项目的颜色。当用户根据我使用的某些逻辑键入一些文本时,我有下面的代码 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填充我的虚拟列表视图。在我的提取功能中我有这个
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 ++
有这样的风格WS_CHILDWINDOW WS_VISIBLE WS_VSCROLL WS_TABSTOP LVS_REPORT LVS_SINGLESEL LVS_SHOWSELALWAYS
WS_EX_LEFT WS_EX_LTRREADING WS_EX_RIGHTSCROLLBAR WS_EX_NOPARENTNOTIFY WS_EX_CLIENTEDGE
答案 0 :(得分:1)
如果您的控件位于对话框中,则必须使用以下命令返回结果代码:
SetWindowLongPtr(hWnd, DWLP_MSGRESULT, result);
然后从TRUE
本身返回DlgProc
。
答案 1 :(得分:0)
我终于解决了这个问题。这是固定代码。 首先,我添加了onchange通知程序功能,以便我可以检测选择的更改。
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设置为我想要选择的项目,如果选择了项目(通过鼠标或编程方式),我手动更改项目的颜色。