У меня в настоящее время проблема с обработчиком события 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, если я выделите область, которая не окрашены в красный цвет, мое приложение хорошо.
Я не слишком уверен, как остановить это. Возможно, мне нужен альтернативный способ динамического рисования красной строки?
EDIT: Я изменил мой код ниже, но я испытываю эту проблему (только вторая и третья колонна цвета, но когда я перерисовки контрольный список т.е. прокрутки вниз, а затем обратно вверх, все столбцы затем вытягивают):
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
Если бы я знал, как это исправить, я бы оставил ответ вместо комментария. Небольшое экспериментирование должно привести вас к решению. –