首先需要创建一个合法的对象,不同的对象创建方法不同。然后需要将该GUI对象选入DC中,同时保存DC中原来的GUI对象。如果选入一个非法的对象将会引起异常。在使用完后应该恢复原来的对象,这一点特别重要,如果保存一个临时对象在DC中,而在临时对象被销毁后可能引起异常。有一点必须注意,每一个对象在重新创建前必须销毁,下面的代码演示了这一种安全的使用方法:

解决方案 »

  1.   

    OnDraw(CDC* pDC)
    {
    CPen pen1,pen2;
    pen1.CreatePen(PS_SOLID,2,RGB(128,128,128));//创建对象
    pen2.CreatePen(PS_SOLID,2,RGB(128,128,0));//创建对象
    CPen* pPenOld=(CPen*)pDC->SelectObject(&pen1);//选择对象进DC
    drawWithPen1...
    (CPen*)pDC->SelectObject(&pen2);//选择对象进DC
    drawWithPen2...
    pen1.DeleteObject();//再次创建前先销毁
    pen1.CreatePen(PS_SOLID,2,RGB(0,0,0));//再次创建对象
    (CPen*)pDC->SelectObject(&pen1);//选择对象进DC
    drawWithPen1...
    pDC->SelectObject(pOldPen);//恢复
    }
      

  2.   

    concrete sample:
    //CPen
    CPen  newPen;
    newPen.CreatePen(PS_GEOMETRIC,2,RGB(128,128,128));
    CPen* oldpen;
    oldpen=(CPen*)pDC->SelectObject(&newPen);//选择对象进行DC
    pDC->MoveTo(10,10);
    pDC->LineTo(110,10);
    pDC->SelectObject(oldpen);//恢复
      

  3.   

    问题代码如下
    m_LineColor=RGB(0,0,0);
    m_LineStyle=PS_SOLID;
    m_LineWidth=1; 
    CPen newPen(m_LineStyle,m_LineWidth,m_LineColor);
          
    CPen* pOldPen=pDC->SelectObject(&newPen); 
      
    pDC->MoveTo(10,10);
    pDC->LineTo(110,10);
    pDC->SelectObject(pOldPen); 编译没问题,执行时非法操作,何故?
      

  4.   

    pDC为NULL?
    这段代码在什么地方?
      

  5.   

    我帮你看了一下,好象没有什么问题,你把我上面的代码copy 下来看看
      

  6.   

    代码在自己建的CImg类的DrawImg(CDC *pDC)函数里,
    从CExeciseView的OnDraw(CDC *pDC)调用的: m_spectralimage.DrawImg(pDC);
      

  7.   

    谢谢,好像确实不是这一段的问题,不好意思。
    还想问一下:CPen  newPen;
    newPen.CreatePen(PS_GEOMETRIC,2,RGB(128,128,128));

    CPen newPen(PS_GEOMETRIC,2,RGB(128,128,128));有何区别?