OnEraseBkgnd已经返回TRUE。BOOL CDlgLogin::OnEraseBkgnd(CDC* pDC)
{
return TRUE;

return CDialog::OnEraseBkgnd(pDC);
}OnPaint代码如下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,依然会有很明显的闪烁。
不解。

解决方案 »

  1.   

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

  2.   

    双缓冲和ONERASEBKGND只是减少闪烁并不能避免闪烁,看看代码,尽量减少绘图次数。
    按理来说你换肤,一次绘图就够了,怎么会闪?
      

  3.   

    看你drawimage的时间,越快越好,就算你用双缓冲,如果在显示器的刷新频率外,也会闪烁。还有,可以减小绘制次数,比如,可以在程序载入的时候绘好,然后bitblt进去,然后只在需要的时候重绘。还有就是Getclip,获得脏区,然后invalidRect(),