+ -
当前位置:首页 → 问答吧 → GDI+&双缓冲,改变图片后Invalidate依然会闪烁。

GDI+&双缓冲,改变图片后Invalidate依然会闪烁。

时间:2011-11-30

来源:互联网

OnEraseBkgnd已经返回TRUE。
C/C++ code

BOOL CDlgLogin::OnEraseBkgnd(CDC* pDC)
{
    return TRUE;
    
    return CDialog::OnEraseBkgnd(pDC);
}


OnPaint代码如下
C/C++ code

CBitmap memBmp;
    CBitmap * pBmpOld = NULL;
    CFont * pOldFont = NULL;
    CPaintDC dc(this); // device context for painting
    CRect rect;
    GetClientRect(&rect);        

    CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    memBmp.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
    pBmpOld = memDC.SelectObject(&memBmp);

    Graphics graphics(memDC.GetSafeHdc());

    graphics.DrawImage(m_pPngTitle, 0, 0, m_pPngTitle->GetWidth(), m_pPngTitle->GetHeight());
    graphics.DrawImage(m_pPngBody, 0, m_pPngTitle->GetHeight(), m_pPngBody->GetWidth(), m_pPngBody->GetHeight());
    
    graphics.DrawImage(g_pPngLogo, 10, 8, g_pPngLogo->GetWidth(), g_pPngLogo->GetHeight());
    FontFamily fontFamily(L"宋体"); 
    Font font(&fontFamily, 11, FontStyleBold, UnitPoint); 
    SolidBrush  solidBrush( Color(255,0,0,0) );
    graphics.DrawString(APP_TITLE_UNICODE, (INT)wcslen(APP_TITLE_UNICODE), &font, PointF(35,10), &solidBrush);
    dc.BitBlt(0,0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);

    memDC.SelectObject(pBmpOld);
    memBmp.DeleteObject();
    //删除兼容DC
    memDC.DeleteDC();
    ReleaseDC(&dc);



然后我在函数中改变背景图片m_pPngBody,调用Invalidate,依然会有很明显的闪烁。
不解。

作者: believe_me   发布时间: 2011-11-30

不明白,帮顶贴吧

作者: panasonic0804   发布时间: 2011-11-30

闪烁肯定会有的,只是多少的问题,就算不更改图片,不画背景图,调用Invalidate重绘,屏幕也会闪一闪。

作者: chinatcp   发布时间: 2011-11-30