我花的一个表盘在timer间距较小时有闪屏现象,如何解决?如能提供源代码或网址参考更好.

解决方案 »

  1.   

    这个问题解决的办法是,在创建一个和屏幕属性一样的DC,每次先画后台DC,画好后再用BitBlt刷新当前显示用的DC。可以参考以下代码创建内存中的DC CClientDC pDC(this); ::GetWindowRect ( ::GetDesktopWindow(), &rc );

    m_pMemDC->CreateCompatibleDC(&pDC);
    m_pBitmap->CreateCompatibleBitmap(&pDC,1600,1280);

    CBitmap* pOldBitmap = (CBitmap*) (m_pMemDC->SelectObject(m_pBitmap));
    m_pOldBitmap = m_pMemDC->SelectObject(m_pBitmap);

    m_pMemDC->SelectClipRgn(NULL);
    CBrush *backgroundBrush;
    backgroundBrush = new CBrush;
    backgroundBrush->CreateSolidBrush((COLORREF)::GetSysColor(COLOR_WINDOW));

    CBrush *pOldBrush = m_pMemDC->SelectObject(backgroundBrush);
    m_pMemDC->PatBlt(0, 0, 1600, 1280, PATCOPY);
    m_pMemDC->SelectObject(pOldBrush);
    delete backgroundBrush;
      

  2.   

    http://www.codeproject.com/gdi/bufferdc.asp
      

  3.   

    应该不用全部重画就能解决这个问题。InvalidateRect
      

  4.   

    lxjnet(根据地)的方法算作是屏幕缓冲法。
    还有页翻转法,可以达到更好的效果,不过GDI可能不行,得用directX。
    原理很简单,在显存中创建多个显示页,轮流在各个页上绘图,并指定显示设备轮流显示各个页。
     Rigel(猎户座-参宿七)所说,类似于不洁矩形(dirty rectangle)
      

  5.   

    应该设置双缓冲
    现在内存中把要输出的内容创建完
    再一次话到屏幕
    重画屏幕时,避免全部重画
    可以使用这个函数
    void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );
    使用时先计算需要重画的矩形lpRect