我在程序中显示了一条直线,通过按一按钮即可显示。
现在我不断按他,同时使用InvalidateRect(hWnd,&ClientRect,true);让程序WM_PAINT事件不断出发重绘窗口。
但是问题是按多几次后会出现异常,显示图形时显得非常卡。
但是我看任务管理器发现没有内存泄漏,我有2G内存,我再怎么按还有1G多剩余,但是就是显示有异常,请问这是为什么,怎么解决啊????????

解决方案 »

  1.   

    资源不仅仅包含内存,还有各种GDI资源如刷子,笔等等。没有内存泄漏不代表你没有其他泄漏
      

  2.   

    任务管理器-》查看-》选择列 ,把 “GDI 对象”复选框钩上
    然后看你的程序使用的GDI对象是否一直增长,如果是,就表明有GDI对象没有泄露
      

  3.   

    我看一下好像是这样的:
    case WM_PAINT:
    PAINTSTRUCT ps;
    BeginPaint(hWnd,&ps); if (isThin)
    {
    DrawLine(ps.hdc); 
    break;
    //PrintImageToDC(szFilename,ps.hdc);
    }

    EndPaint(hWnd,&ps);
    break;里面有一个break;导致EndPaint(hWnd,&ps);
    没有执行,是不是这样的?
    EndPaint(hWnd,&ps);是释放窗体资源的吧?
      

  4.   

    每一个BeginPaint调用,必须有相应的EndPaint调用,否则会出问题 
    从你的代码上看,BeginPaint可能没有对应的EndPaint
      

  5.   

    你用我在3楼的方法看一下,看有没有GDI对象没有释放
      

  6.   

    而且也要看DrawLine在干吗 
    3F的方法也要试试先
      

  7.   

    不要多想了,典型的GDI资源泄漏。
      

  8.   

    任务管理器-》查看-》选择列  把 “GDI 对象”复选框钩上 
        没有这个选项啊??
    DrawLine只是用了一个循环画点,SetPixel(hdc,  j,  i, RGB(0, 0, 0));
      

  9.   

    if语句用break干吗? 你把消息循环跳出去了。另外SetPixel效率不高,不过不至于引起你说的问题
      

  10.   

    应该就是GDI 对象的问题了
      

  11.   

    我看到了问题了,(MBlockToDC是将近3M的图片绘制到屏幕,pWhole->m_nWidth和pWhole->m_nHeight斗是大于屏幕尺寸的) rect.left=rect.top=0;
    rect.right=rect.left+pWhole->m_nWidth;
    rect.bottom=rect.top+pWhole->m_nHeight;
    MBlockToDC(pWhole,hdc,0,0,&rect);我用了这段代码,rect.right、rect.bottom都将会超出屏幕将我的图片绘制到屏幕,我用了
    GetClientRect(hWnd, &ClientRect);
    MBlockToDC(pWhole,hdc,0,0,&ClientRect);代替就没有问题了(是在一二百次点击没有问题,再多没有试过),为什么我绘制了超出屏幕的图片就会引起
    GDI 对象泄漏呢?我看过参考说是自己不回收这些资源的话系统将会自动回收,但是指挥收集屏幕范围内的资源是不是这个原因呢?
    那这样的花我还写了画点函数如下我在绘制是也是超出屏幕的,是不是SetPixel泄漏的资源少不大会出现我说的那个问题。
    那SetPixel(hdc,  j,  i, RGB(0, 0, 0)); 是不是也要避免画出屏幕范围??????
      

  12.   

    还有 marrco2005 说的在任务管理器里面查看GDI的监视器我怎么没有发现,没有这个功能的啊
      

  13.   

    都会不会通操作系统啊,任务管理器中->查看->选择列
    不就有GDI了!
    这肯定是GDI资源泄漏,不要瞎想!
      

  14.   

    你中间有个break,就这里导致的你程序出问题,BeginPaint和EndPaint是配套的,如果只有BeginPaint,没有EndPaint,程序就会卡死