用了一个背景透明的对话框类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;
}
这句注释掉
直接返回true
这样就不会擦除背景了,但是,为了你的图上不残留以前的痕迹,所以用
dcMemoryDC.FillSolidRect(rWnd, pDC->GetBkColor());来设置背景,这是在dcMemoryDC里画的,而且后面继续在dcMemoryDC里画,然后将整个画好的,一次性的画到屏幕上, 这样就不会觉得闪了。