继承CListCtrl后,可以改变行的颜色,程序出现错误。
http://www.cnblogs.com/rainbowzc/archive/2012/02/26/2369082.html
按照下面的写了程序之后,调试软件出现错误为:
错误是line:1120
mfc绘图时wingdi.cpp的ASSERT(m_hObject == NULL);句出错。。求解释原因和这个wingdi是甚么
指定改变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绘图中,src\mfc\wingdi.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
发现自己的不足,善于利用找到的方法去扬长避短。行动起来。