继承CListCtrl后,可以改变行的颜色,程序出现错误。 mfc绘图时wingdi.cpp的ASSERT(m_hObject == NULL);句出错。。求解释原因和这个wingdi是甚么 调试完后 退出调试后,再次编译时 出现一堆WINGDI.cpp错误 MFC绘图中,srcmfcwingdi.cpp报错

 http://www.cnblogs.com/rainbowzc/archive/2012/02/26/2369082.html

 

按照下面的写了程序之后,调试软件出现错误为:

错误是line:1120

 

  指定改变CListCtrl中某一行的颜色,比如说刚添加进去的一行,让它改变颜色,这样记录多了,容易看到自己刚刚加如的行,方便操作可查看,也可以让添加和修改的记录显示不一样的颜色,方便的多了,VC自带的没有这种功能。

 

1. 首先从CListCtrl 继承一个类,命名为CXListCtrl

在头文件中加摸板

1.    CMap<DWORD, DWORD&, COLORREF, COLORREF&> MapItemColor;

好在这里查找你的修改的颜色。


3.自己写个消息映射,可能添加不上,要自己写。

BEGIN_MESSAGE_MAP(CXListCtrl, CListCtrl)
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw)
//  ON_WM_SIZE()
END_MESSAGE_MAP()

OnNMCustomdraw 为实现函数。

4.写OnNMCustomdraw函数。

void CXListCtrlNew::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
    // TODO: Add your control notification handler code here
    *pResult = CDRF_DODEFAULT;
    NMLVCUSTOMDRAW * lplvdr=(NMLVCUSTOMDRAW*)pNMHDR;
    NMCUSTOMDRAW &nmcd = lplvdr->nmcd;
    switch(lplvdr->nmcd.dwDrawStage)//判断状态
    {
        case CDDS_PREPAINT:
        {
            *pResult = CDRF_NOTIFYITEMDRAW;
            break;
        }
        case CDDS_ITEMPREPAINT://如果为画ITEM之前就要进行颜色的改变
        {
            COLORREF ItemColor;
            if(MapItemColor.Lookup(nmcd.dwItemSpec, ItemColor))
            // 根据在 SetItemColor(DWORD iItem, COLORREF color) 设置的
            // ITEM号和COLORREF 在摸板中查找,然后进行颜色赋值。
            {
                //lplvdr->clrText = RGB(0,0,0);//ItemColor;
                lplvdr->clrTextBk = ItemColor;
                *pResult = CDRF_DODEFAULT;
            }
        }
        break;
    }
}
5.修改指定一行的颜色。
void CXListCtrl::SetItemColor(DWORD iItem, COLORREF color)
{
    //    m_iCurrentItem = iItem;
    //    m_CurrentColor = color;
    MapItemColor.SetAt(iItem, color);//设置某行的颜色。
    this->RedrawItems(iItem, iItem);//重新染色。
    //this->SetCheck(iItem,1);
    this->SetFocus();    //设置焦点。
    UpdateWindow();
}
6.修改全部行的颜色。
void CXListCtrl::SetAllItemColor(DWORD iItem,COLORREF TextBkColor)
{
    //INT_PTR ncount = this->GetItemCount();
    if(iItem > 0)
    {
        for(DWORD numItem = 0; numItem < iItem ;numItem ++)
        {
            //iItem = i;
            MapItemColor.SetAt(numItem, TextBkColor);
            this->RedrawItems(numItem, numItem);
        }
    }
    return;
}


http://cool.worm.blog.163.com/blog/static/64339006200911925824375/

 

请检查你对象的先后创建顺序以及调用顺序,这应该是你继承对象后,在调用的时候,这个对象还没有被创建,所以获取到的句柄为空。
 

情况大概是,调试时跟踪到mfc源代码里,然后退出调试,直接在mfc源码文件里进行编辑了。然后编译,就出错。先关闭源码文件再编译程序。

 

Rebuild 一下,也可能代码改动了。(试了之后不行!)

 

调试完后 退出调试后,再次编译时 出现一堆WINGDI.cpp错误

MFC绘图中,srcmfcwingdi.cpp报错

在做贪食蛇,但是在执行完一次要调用Invalidate()的时候就跳进报错!
3个绘图的代码如下:

//背景
         CRect rect;
int boardLeft=0;
int boardTop=0;
int gridSize=50;
int xMax=10;
int yMax=12;

rect.left=boardLeft-1;
rect.top=boardTop-1;
rect.right=boardLeft+xMax*gridSize+1;
rect.bottom=boardTop+yMax*gridSize+1;
pDC->Rectangle(&rect);
pDC->FillRect(&rect,new CBrush(RGB(0,0,0))); 

画蛇:
                           if(board[i][j]==1)
{
br.CreateSolidBrush(RGB(255,255,255));
oldbr=pDC->SelectObject(&br);
rect1.left=left+i*size;
rect1.top=top+j*size;
rect1.right=left+i*size+size;
rect1.bottom=top+j*size+size;
pDC->Ellipse(&rect1);
}


画果子:

                          if(board[i][j]==2)
{
colorbr.CreateSolidBrush(seedRGB);
pDC->SelectObject(&colorbr);
rect2.left=left+i*size;
rect2.top=top+j*size;
rect2.right=left+i*size+size;
rect2.bottom=top+j*size+size;
pDC->Ellipse(&rect2);
}

请问问题出在哪里,求教

对了,还有在画蛇和背景之前,声明的变量:
CRect rect1,rect2;
CBrush br,colorbr;
CBrush* oldbr=new CBrush; 在DEBUG模式下看下跳出的地方时在哪里,
添加中断或者使用堆栈查看是在哪里跳出的

回复于: 2011-11-24 12:57:38

问题解决了,原来是没有释放dc