目前我遇到一个问题,我OnNMCustomdrawlistctrlvalues()事件处理函数被调用不停一旦我画一个CListCtrl一行红色(代码卡),导致我的应用一旦我尝试执行另一个事件(例如单击按钮)就会冻结。MFC的CListCtrl CustomDraw()事件处理程序代码陷入
我有以下代码:
void CSPID_FQA_Test_ClientDlg::OnNMCustomdrawlistctrlvalues(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLVCUSTOMDRAW lpLVCustomDraw = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
int itemCnt = 0;
CString text;
RECT rc;
switch(lpLVCustomDraw->nmcd.dwDrawStage)
{
case CDDS_ITEMPREPAINT:
case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
//get each row text for 2nd column
itemCnt = mListCtrl.GetItemCount();
for (int i = 0; i < itemCnt; i++)
{
text = mListCtrl.GetItemText(i, 2);
if (text.Compare("No") == 0)
{
if (i == (lpLVCustomDraw->nmcd.dwItemSpec))
{
lpLVCustomDraw->clrTextBk = RGB(255,50,50);
mListCtrl.GetItemRect(i,&rc,LVIR_BOUNDS);
mListCtrl.InvalidateRect(&rc, 0);
}
}
}
break;
default: break;
}
*pResult = 0;
*pResult |= CDRF_NOTIFYITEMDRAW;
*pResult |= CDRF_NOTIFYSUBITEMDRAW;
*pResult |= CDRF_NOTIFYPOSTPAINT;
}
导致:
内的CListCtrl,如果我滚动到未涂成红色的区域,我的应用程序是精细。
我不是太清楚如何阻止这种情况发生......也许我需要动态地画一排红色的另一种方式?
编辑:我已经改变了我的代码以下,但我遇到了这个问题(仅适用于第二和第三列是彩色的,但是当我重新绘制列表控件即向下滚动然后备份,所有列然后绘制):
void CSPID_FQA_Test_ClientDlg::OnNMCustomdrawlistctrlvalues(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLVCUSTOMDRAW lpLVCustomDraw = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
int itemCnt = 0;
CString text;
RECT rc;
CDC* pDC = CDC::FromHandle (lpLVCustomDraw->nmcd.hdc);
switch(lpLVCustomDraw->nmcd.dwDrawStage)
{
case CDDS_ITEMPOSTPAINT:
//case CDDS_ITEMPREPAINT:
//case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
//get each row text for 2nd column
itemCnt = mListCtrl.GetItemCount();
for (int i = 0; i < itemCnt; i++)
{
text = mListCtrl.GetItemText(i, 2);
if (text.Compare("No") == 0)
{
if (i == (lpLVCustomDraw->nmcd.dwItemSpec))
{
//lpLVCustomDraw->clrTextBk = RGB(255,50,50);
mListCtrl.GetItemRect(i,&rc,LVIR_BOUNDS);
pDC->FillSolidRect (&rc, RGB (0, 255, 0));
//mListCtrl.InvalidateRect(&rc, 0);
}
}
}
break;
default: break;
}
*pResult = 0;
*pResult |= CDRF_NOTIFYITEMDRAW;
*pResult |= CDRF_NOTIFYSUBITEMDRAW;
*pResult |= CDRF_NOTIFYPOSTPAINT;
}
EDIT2:我改成下面的代码,但我仍然得到同样的问题:
LPNMLVCUSTOMDRAW lpLVCustomDraw = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
CString text;
RECT rc;
CDC* pDC = CDC::FromHandle (lpLVCustomDraw->nmcd.hdc);
switch(lpLVCustomDraw->nmcd.dwDrawStage)
{
case CDDS_ITEMPOSTPAINT:
mListCtrl.GetItemRect(lpLVCustomDraw->nmcd.dwItemSpec,&rc,LVIR_BOUNDS);
text = mListCtrl.GetItemText(lpLVCustomDraw->nmcd.dwItemSpec, 2);
if (text.Compare("No") == 0)
{
pDC->FillSolidRect (&rc, RGB(0, 0, 255));
}
break;
default: break;
}
这段代码被称为列表项的绘图的一部分;通过调用'InvalidateRect',您可以再次执行绘图。无限循环! –
嗨@MarkRansom,谢谢你的回复!啊,当然。我注释掉了'InvalidateRect'行,它已经停止冻结。我在绘图时得到以下结果(但如果我向下滚动并重新备份,则会正确重绘) - http://i.imgur.com/umiH6zI.png 任何想法如何解决这个问题? – LKB
如果我知道如何解决它,我会留下一个答案而不是评论。一点点实验应该引导你找到解决方案。 –