zoukankan      html  css  js  c++  java
  • 继承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绘图中,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

    发现自己的不足,善于利用找到的方法去扬长避短。行动起来。
  • 相关阅读:
    Cygwin 与 MinGW/MSYS/MSYS2,如何选择?甚至还有GNU utilities for Win32
    MinGW和MSYS项目是在一起的(翻译官网)
    库存限购
    ElasticSearch指南
    Windows系统的Jenkins持续集成环境
    JavaScript 框架
    Istio Service Mash管理微服务
    LinkedIn微服务框架rest.li
    Istio微服务架构初试
    github
  • 原文地址:https://www.cnblogs.com/rechen/p/5100261.html
Copyright © 2011-2022 走看看