你在自已写的函数中可以把CDC的有关设备上下文的有关数据作为参数传递给你的函数,但是在你的函数中不能把该上下文释放掉,由OnPaint中来释放

解决方案 »

  1.   

    你把OnPaint()的设备现场的句柄传给自定义函数,在自定义函数中重画,用不着在自定义函数中再创建设备现场,如果真要创建,那一定要记住释放。最好把你的代码公布出来
      

  2.   

    以下是我的原代码,请指正!void CDialog1::OnPaint() 
    { CPaintDC dc(this); // device context for painting//    DrawFrame(0, 0, 400, 400); //这是我的函数的调用,若将我的函数放在此处,则下
                                     //面的画sin(x)曲线的语句失效,若将其放在画sin(x)
                                     //曲线的语句后,则这个自编的函数失效,何故???

    // TODO: Add your message handler code here
    CRect ClientRect;
    GetClientRect(&ClientRect);
             CPen pen5; if(pen4.CreatePen(PS_SOLID,1,RGB(0,0,0)))   // 判断有效性
    {
         CPen*pOldPen=dc.SelectObject(&pen4);
             dc.MoveTo(x2,y1+1);
     dc.LineTo(x1+1.0,y1+1);
     dc.LineTo(x1+1,y2);
         dc.SelectObject(pOldPen);
    } if(pen5.CreatePen(PS_SOLID,1,RGB(255,0,0)))   // 判断有效性
    {
         CPen*pOldPen=dc.SelectObject(&pen5);  // 装入原有GDI对象   //用以在对话框上画一个 sin(x)函数///////////////////////////////////////////         dc.MoveTo(0.0,200.0);
             int i;
         double x=0.0,y,step=0.01;
             for(i=1;i<=10000;i++)
     {
        y=sin(x)*50.0+200.0;
          dc.LineTo(10.0*x,y);
    x+=step;
     }
     dc.SelectObject(pOldPen);
    }        
    // Do not call CDialog::OnPaint() for painting messages
    }//自编的函数体void CDialog1::DrawFrame(int x1, int y1, int x2, int y2)
    {
    CPaintDC dc(this); // device context for painting

    // TODO: Add your message handler code here
    CRect ClientRect;
    CPen pen1,pen2,pen3,pen4;
    GetClientRect(&ClientRect);
    if(pen1.CreatePen(PS_SOLID,2,RGB(255,255,255)))   // 判断有效性
    {
         CPen*pOldPen=dc.SelectObject(&pen1);
             dc.Rectangle(x1,y1,x2,y2);
         dc.SelectObject(pOldPen);
    } if(pen2.CreatePen(PS_SOLID,1,RGB(130,130,130)))   // 判断有效性
    {
         CPen*pOldPen=dc.SelectObject(&pen2);
             dc.MoveTo(x2,y1);
     dc.LineTo(x1,y1);
     dc.LineTo(x1,y2);  
         dc.SelectObject(pOldPen);
    }
    if(pen3.CreatePen(PS_SOLID,1,RGB(200,200,200)))   // 判断有效性
    {
         CPen*pOldPen=dc.SelectObject(&pen3);
             dc.MoveTo(x1,y2);
     dc.LineTo(x2,y2);
     dc.LineTo(x2,y1);  
             dc.MoveTo(x1,y2-2);
     dc.LineTo(x2-2,y2-2);
     dc.LineTo(x2-2,y1);  
         dc.SelectObject(pOldPen);
    }
    if(pen4.CreatePen(PS_SOLID,1,RGB(0,0,0)))   // 判断有效性
    {
         CPen*pOldPen=dc.SelectObject(&pen4);
             dc.MoveTo(x2,y1+1);
     dc.LineTo(x1+1.0,y1+1);
     dc.LineTo(x1+1,y2);
         dc.SelectObject(pOldPen);
    }
      // Do not call CDialog::OnPaint() for painting messages
    }  请给予修改,不胜感激!!!!!! 
      

  3.   

    把函数改成
    void CDialog1::DrawFrame(CDC * pDC,int x1, int y1, int x2, int y2);
    调用时使用DrawFrame(&dc,0, 0, 400, 400);
      

  4.   

    同意adrianx,对上面的修改的补充,在其他地方调用你的DrawFrame时,
    CDC *pDC=GetDC();
    DrawFrame(pDC,....);
    ReleaseDC();//如果不释放会造成泄露如果在OnPaint中写了这些,其他地方可以用Invalidate()触发Onpaint
      

  5.   

    是不是在OnPaint()函数的一开始就对设备进行初始化,将void CDialog1::DrawFrame(int x1, int y1, int x2, int y2)改成void CDialog1::DrawFrame(CDC * pDC,int x1, int y1, int x2, int y2),并去掉void CDialog1::DrawFrame(int x1, int y1, int x2, int y2)中的设备初始化部分???
      

  6.   

    to zljzs:
    是的!!!只使用一个DC作图