用了一个背景透明的对话框类CBkDialogST,在CBkDialogST对话框中对一个区域刷新背景,无论是RedrawWindow(&rect)还是InvalidateRect(&rect)都造成明显闪烁,也就是能看得到背景色从土黄色到我设定的颜色的刷新过程。请问如何解决?
BOOL CBkDialogST::OnEraseBkgnd(CDC* pDC) 
{
CRect rWnd;
int nX = 0;
int nY = 0; BOOL bRetValue = CDialog::OnEraseBkgnd(pDC); // If there is a bitmap loaded
if (m_hBitmap)
{
GetClientRect(rWnd); CDC dcMemoryDC;
CBitmap bmpMemoryBitmap;
CBitmap* pbmpOldMemoryBitmap = NULL; dcMemoryDC.CreateCompatibleDC(pDC);
bmpMemoryBitmap.CreateCompatibleBitmap(pDC, rWnd.Width(), rWnd.Height());
pbmpOldMemoryBitmap = (CBitmap*)dcMemoryDC.SelectObject(&bmpMemoryBitmap); // Fill background 
dcMemoryDC.FillSolidRect(rWnd, pDC->GetBkColor()); CDC dcTempDC;
HBITMAP hbmpOldTempBitmap = NULL; dcTempDC.CreateCompatibleDC(pDC);
hbmpOldTempBitmap = (HBITMAP)::SelectObject(dcTempDC.m_hDC, m_hBitmap); switch (m_byMode)
{
case BKDLGST_MODE_CENTER:
nX = ((rWnd.Width() - m_dwWidth)/2);
nY = ((rWnd.Height() - m_dwHeight)/2);
dcMemoryDC.BitBlt(nX, nY, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
break;
case BKDLGST_MODE_STRETCH:
// Stretch the bitmap
dcMemoryDC.StretchBlt(0, 0, rWnd.Width(), rWnd.Height(), &dcTempDC, 0, 0, m_dwWidth, m_dwHeight, SRCCOPY);
break;

} // switch pDC->BitBlt(0, 0, rWnd.Width(), rWnd.Height(), &dcMemoryDC, 0, 0, SRCCOPY); OnPostEraseBkgnd(&dcMemoryDC); ::SelectObject(dcTempDC.m_hDC, hbmpOldTempBitmap);
dcMemoryDC.SelectObject(pbmpOldMemoryBitmap);
} // if return bRetValue;
}

解决方案 »

  1.   

    BOOL    bRetValue = CDialog::OnEraseBkgnd(pDC);
    这句注释掉
    直接返回true
      

  2.   

    调用CDialog::OnEraseBkgnd(pDC);就会按着默认的操作用一个指定的颜色进行擦除
      

  3.   

    WINDOWS的绘图机制是先用白色背景擦除,再绘图,所以你看到闪烁的时候,是不是感觉背景是在白色跟你想要的画面间来回闪啊,要想不闪烁,就要注释掉BOOL bRetValue = CDialog::OnEraseBkgnd(pDC);这句
    这样就不会擦除背景了,但是,为了你的图上不残留以前的痕迹,所以用
    dcMemoryDC.FillSolidRect(rWnd, pDC->GetBkColor());来设置背景,这是在dcMemoryDC里画的,而且后面继续在dcMemoryDC里画,然后将整个画好的,一次性的画到屏幕上, 这样就不会觉得闪了。
      

  4.   

    你那个返回值有问题,应该返回TRUE