各位高手大家好,我想请问一下,我如果用cdc画了一个图形,当我接着再画时就会死机,请问这是为什么,是不是我的资源释放的问题,望各位高手指点,下面是我封装的一段画圆的代码,我第一次调用时没问题,可是再次调用时就会死机:
void CNavigationView::MyCircle(CDC *pDC,POINT ptCenter,UINT uRadius)
{
POINT ptLeftTop,ptRightBottom;

ptLeftTop.x=ptCenter.x-uRadius;//根据给出的半径计算左上角及又下角值
ptLeftTop.y=ptCenter.y-uRadius;
ptRightBottom.x=ptCenter.x+uRadius;
ptRightBottom.y=ptCenter.y+uRadius; CPen pen;//画笔
pen.CreatePen(PS_SOLID,2,RGB(0,0,255));
CPen* pOldPen=(CPen*)pDC->SelectObject(&pen);//载入自己建立的pen,并同时存储原来的状态到pOldPen中
CBrush *pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);//空画刷,使圆内不填充颜色 pDC->Ellipse(ptLeftTop.x,ptLeftTop.y,ptRightBottom.x,ptRightBottom.y);//调用画椭圆函数 pDC->SelectObject(pOldBrush);//恢复原来的DC
pDC->SelectObject(pOldPen);
pen.DeleteObject();
ReleaseDC(pDC);
}

解决方案 »

  1.   

    你的pDC是谁传进来的,如果是谁产生的pDC,谁销毁。
      

  2.   

    是调用这个函数的地方传进来的,我以前是在外面销毁的,但是也出现这种问题,所以就在这里又销毁了一次。我的画矩矩形框的代码也出现这样的问题,望能指点,我这是初次使用cdc
      

  3.   

    如楼上,pDC不应该在这个函数内部销毁
      

  4.   

    假设你使用view的ondraw函数自带的CDC *pDC之类的话,不用自己销毁。你那段代码好像没问题。
      

  5.   

    我将ReleaseDC(pDC); 这句代码 删除 后问题依旧,但是我刚才又测试了一下画矩形的代码,好像没问题,所以应该还是这段代码的问题,画第一次没事,第二次就死机
      

  6.   

    首先删除ReleaseDC(pDC);然后问题应该在调用这个函数的地方,贴出来。
      

  7.   

    谢谢各位大虾,我这个问题解决了,是我在使用CArray数组过程中出现的问题,我在使用前忘记了RemoveAll();
    但是现在我还要请教各位一个问题,就是我用cdc绘制了一个图形之后弹出一个dialog,当点击确定退出这个dialog之后或者刷新窗口之后,我所画的图形就没有了,请问这是什么原因?如何控制图形的显示或删除呢?
      

  8.   

    将画图形的代码放在view的ondraw中。
      

  9.   

    刷新view窗口会产生wm_paint消息,mfc中这个消息是由onpaint处理的,onpaint又调用了ondraw,所以应该像楼上说的那样做
      

  10.   

    谢谢楼上的大虾,那再问一句,在我想刷新view窗口的时候,是调用invalidate()函数吗?
      

  11.   

    我把画图形的代码放在ondraw里面调用,我是当给它bool型的变量m_bPaintDC,当m_bPaintDC为true时,就调用画图函数,可是如果我要在此时让它弹出一个dialog,它就会死机呢?
      

  12.   

    死机跟在ondraw里面绘制应该是没有关系的,看看是否是其他地方出的问题。
      

  13.   

    可是我在调dialog前把m_bPaintDC置为false它就不会死,但是当退出dialog后就没有我想要的图形了!
      

  14.   

    谢谢各位大虾了,问题解决了,果然是死机与ondraw里绘制没有直接关系,只不过是我在调用dialog时有个操作改变绘图函数里用到的某个参数,所以产生了冲突导致死机,看来以后一定要认真了,马上结帖!