我的一个图形显示程序,运行一段时间后,出现图形不更新现象,查看数据是正常更新的,BitBlt()返回值跟踪是正确的,但界面上没有显示出来,原因可能是什么,敬请指点

解决方案 »

  1.   

    你在什么地方bitblt的
    也许刷了后 在OnDraw中又擦掉了
      

  2.   

    看看SelectObject是不是正确调用了
      

  3.   

    多谢各位指点,我的绘图原理如下
    1:vc单文挡模式下,Instance()入口函数内窗口调用后,启动一个绘图线程;
    2:绘图先在内寸位图对应的DC,然后BitBlt到屏幕DC上.
    3.GDI 对象使用步骤如下:
    CPen,CBrush,CFont,先selectobject,同时保存旧windows句柄,用完后释放
    CFont* oldFont = NULL;
    HFONT hFont = NULL;
    CPen* oldPen = NULL;
    HPEN hPen = NULL;
    CBrush* oldBrush = NULL;
    HBRUSH hBrush = NULL;


    oldPen = CCom::s_pDc.SelectObject(&CCom::s_pPen_0_0_255_1);
    hPen = (HPEN)oldPen->GetSafeHandle();
    m_pBrush=&CCom::s_pBrush_0_0_0;

    oldBrush = CCom::s_pDc.SelectObject(m_pBrush);
    hBrush = (HBRUSH)oldBrush->GetSafeHandle();
            
    CFont Font;
    Font.CreateFontIndirect(&m_logFont);
    oldFont = CCom::s_pDc.SelectObject(&Font);
    hFont = (HFONT)oldFont->GetSafeHandle();
    ............................................
    CCom::s_pDc.SelectObject(CPen::FromHandle(hPen));
    CCom::s_pDc.SelectObject(CBrush::FromHandle(hBrush));
    CCom::s_pDc.SelectObject(CFont::FromHandle(hFont));
    Font.DeleteObject();
      

  4.   

    把你这段代码,放到一个CView派生类的OnDraw看能不能画出
    能,说明你调用的场合有问题;如果不能,说明你的绘制过程有问题
      

  5.   

    你必须在要画的窗体上画图,就是要得到这个窗体的dc,在这个dc中画图
      

  6.   

    估计是GDI资源没有释放,我刚处理了一个这样的问题
      

  7.   

    多谢各位同仁指点,好象是调试方式下运行出这个问题,GDI资源应该是释放了,通过句柄对象释放的.
      

  8.   

    你启动的是UI线程?还是工作者线程?
    好像不能在工作者线程里面做更新UI的动作。
      

  9.   

    在Instance()中启动绘图线程的时候,把View的DC传进去
    然后在这个DC上绘图试试
      

  10.   

    CFont*   oldFont   =   NULL; 
    /////////////////////////////////////////
    你太有才了!
    CFont*   oldFont   =   new CFont;
    ...
    ...
    ...
    用完了以后:
    if(oldFont)
    {
      delete oldFont ;
      oldFont = NULL;
    }