我这里有一个vc++程序,运行后有4个对话框界面,想要编程在其中一个界面显示一个圆圈。不调用画圆圈程序(PaintResult())时,4个对话框界面很正常。但是加入画圆圈程序(PaintResult())之后,程序开始正常显示,在指定界面指定位置显示一个圆圈。但运行几分钟后,在4个对话框界面和编程界面的另一个位置又显示另一个圆圈,有关程序如下:void CLongdistanceAdjustDlg1::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialog::OnPaint()
CRect rect;
GetDlgItem(IDC_BUTTON_UPDORR)->GetWindowRect(&rect);
CFont m_Font;
m_Font.CreateFont(  18,   0,   0,   0,   FW_NORMAL,   FALSE,   FALSE,   0,     
ANSI_CHARSET,   OUT_DEFAULT_PRECIS,   
CLIP_DEFAULT_PRECIS,   DEFAULT_QUALITY,     
DEFAULT_PITCH   |   FF_MODERN,   "arial"   );   
if(!m_input2)
{
PaintResult();
if(m_ReDraw)
{
Invalidate(false);
m_ReDraw=false;
}
}
       CDialog::OnPaint();
}void CLongdistanceAdjustDlg1::PaintResult()
{   
                  int x =15;
int y =43;    
                   CClientDC cdc(this) ;
                    CDC*pDC=GetDC();
                  CBrush newBrush1(RGB(0,255,0));
CBrush *oldBrush;
                  oldBrush = cdc.SelectObject(&newBrush1);
                  cdc.SelectObject(&newBrush1); 
cdc.Ellipse(x-RADIOUS-2,y-RADIOUS-2,x+RADIOUS+2,y+RADIOUS+2);
cdc.SelectObject(oldBrush);
                  newBrush1.DeleteObject();
                  this->ReleaseDC(pDC);
}
不知错误在那里?如何改正请高手们帮忙指点改程序。

解决方案 »

  1.   

    CFont m_Font; 
    m_Font.CreateFont(  18,  0,  0,  0,  FW_NORMAL,  FALSE,  FALSE,  0,    
    ANSI_CHARSET,  OUT_DEFAULT_PRECIS,  
    CLIP_DEFAULT_PRECIS,  DEFAULT_QUALITY,    
    DEFAULT_PITCH  |  FF_MODERN,  "arial"  );  这个font用完后,要调用:m_Font.DeleteObject();
      

  2.   

    另外,PaintResult函数里面有两个DC,其实没有必要,你直接用 CDC*pDC=GetDC(); 这个就好了,或者外部参数传入!
      

  3.   

    请问fandh在那里调用:m_Font.DeleteObject();比较好谢谢。
      

  4.   

    请问fandh:
    还有其它语句设置会影响显示驱动?
      

  5.   

    不影响,但是,GDI资源是有限的,你不停的创建而不释放,会失败的!这样,导致的结果是,整个显示都不正常!
      

  6.   

    你好fandh:
    那为什么只不调用PaintResult() 语句程序显示就正常(长时间),其它有什么问题吗?谢谢!
      

  7.   

    看不出其它问题,当然,
    oldBrush = cdc.SelectObject(&newBrush1); 
                      cdc.SelectObject(&newBrush1); 
    调用了两次SelectObject,有点不合理,但是,也没有大错
    唯一可能是CClientDC ,这个构造函数里面,也是GetDC();析构函数里面是ReleaseDC;所以,也不应该存在问题!
    唯一的可能是,不调用PaintResult,没有画图,所以,即使GDI资源在不停的耗费,也不会有大的问题!当然,调用PaintResult,一旦没有资源了,你里面画图也就不对了!严重的时候,可能出现花屏等现象!
      

  8.   

    另外,建议去掉CClientDC ,直接用GetDC或者用onpain调用的时候,传入DC