我做了一个控件,把它放到网页上,功能是显示从服务器传过来的数据,因此要定时刷新,利用Ietimer控件每隔一秒刷新一次,可是一旦打开服务器开始传数据的时候,画面一直在闪,也是每一秒闪一次,怎么解决这个问题,谁来帮忙一下?

解决方案 »

  1.   

    用内存DC,在内存DC上面画了再拷贝到pDC,就是所谓的double buffer啦
      

  2.   


    CDC MemDC;
    CBitmap m_bmp;
    BITMAP m_bitmap;if (style==1)
    {
    m_bmp.LoadBitmap(IDB_MAIN);
    }
    else if (style==2)
    {
    m_bmp.LoadBitmap(IDB_MAIN2);
    }m_bmp.GetBitmap(&m_bitmap);
    MemDC.CreateCompatibleDC(dc);
    MemDC.SelectObject(&m_bmp);dc->BitBlt(0,0,m_bitmap.bmWidth,m_bitmap.bmHeight,&MemDC,0,0,SRCCOPY);m_bmp.DeleteObject();
    MemDC.DeleteDC();、
      

  3.   

    使用双缓冲贴图,同时,处理WM_ERSEBKGND消息,在OnEraseBkgnd里面直接返回TRUE
      

  4.   

    双缓冲绘图
    这篇文章中的控件用的就是这个技术
    http://blog.csdn.net/xianglitian/article/details/6100767
      

  5.   


    不是很明白,我做的控件里面没有用到位图啊,用的是GDI+来显示数据
      

  6.   

    还有一个常用的方法是先计算出更新的区域,然后只刷新/重绘这个小区域,不要遇到一点改变就刷新整个控件.这样的话如果更新部分在显示区域外,刷新都不要了.
    GetTextExtent可以获取字符串绘出后的的尺寸
      

  7.   

    这是GDI+的双缓冲
    http://www.codeproject.com/KB/GDI-plus/gdiplus.aspx
    不过我觉得还是GDI的快
      

  8.   


    我同时使用GDI+和DC画图,要怎么使用双缓冲呢
    void CVP_AnalogCtrl::OnDraw(
    CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
    {
            CClientDC dc(this);
       brushBlack.CreateSolidBrush(RGB(255,255,255));
       pdc->FillRect(rcBounds, &brushBlack);
       pdc->SetBkMode(TRANSPARENT );
      
     Graphics graphics( pdc->m_hDC);
        //画图:
              graphics.、、、、、、、、
              dc.、、、、、、、、、
             、、、、、
    这样如何使用双缓冲技术呢