gpt4 book ai didi

c++ - MFC CListCtrl CustomDraw() 事件处理程序代码卡住

转载 作者:行者123 更新时间:2023-11-30 03:57:37 28 4
gpt4 key购买 nike

我目前遇到一个问题,我的 OnNMCustomdrawlistctrlvalues() 事件处理程序在我将 CListCtrl 行涂成红色(代码卡住)后被不停地调用,导致我的应用程序在我尝试执行另一个事件时卡住,例如单击按钮。

我有以下代码:

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;
}

结果是:

result1

在 CListCtrl 中,如果我滚动到一个没有涂成红色的区域,我的应用程序就没问题。

我不太确定如何阻止这种情况的发生...也许我需要一种动态绘制行红色的替代方法?


编辑: 我已将我的代码更改为以下内容,但遇到了这个问题(只有第 2 和第 3 列被着色,但是当我重绘列表控件时,即向下滚动然后向上滚动,所有然后绘制列):

result2

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;
}

result3

最佳答案

我认为您的设计因使用 CDDS_ITEMPREPAINT 而略有偏差。我使用自定义绘画将 CListCtrl 中的一行突出显示为黄色。为此,我利用 CDDS_ITEMPOSTPAINT 并使用 CDC 的 FillSolidRectDrawText 方法。正如 Mark 所暗示的,一些简单的实验(使用我在此答案中发布的内容)应该会有所帮助。

编辑:使用CDDS_ITEMPOSTPAINT,您可以通过

获取设备上下文
CDC*  pDC = CDC::FromHandle (pNMLVCD->nmcd.hdc);

获取要绘制的行坐标可以通过以下方式完成

GetItemRect (row, &rect, LVIR_BOUNDS);

渲染行颜色由

pDC->FillSolidRect (&rect, RGB (0, 255, 0));

最后,绘制每列文本

//  draw each column's text into the corresponding CRect.
for (col=0; col<nCols; ++col)
{
GetSubItemRect (row, col, LVIR_BOUNDS, rect);
rect.left += 6;
CString text = pRow->GetColumnText (col);
pDC->DrawText (text, &rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
}

您需要对上述代码进行必要的调整以满足您的需要。

关于c++ - MFC CListCtrl CustomDraw() 事件处理程序代码卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27853564/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com