我使用基于MFC对话框的程序有一个activex资源管理器和2个编辑框。 在OnPaint()上,我用BitBlt绘制背景图像,如下所示:
CDC mTempDC;
CBitmap mBitmap;
mTempDC.CreateCompatibleDC(&dc);
mBitmap.CreateCompatibleBitmap(&dc, m_BMBackgroundSize.cx, m_BMBackgroundSize.cy);
mTempDC.SelectObject(&mBitmap);
// Background
{
CDC dcMemory;
dcMemory.CreateCompatibleDC(&mTempDC);
dcMemory.SelectObject(&m_BMBackground);
mTempDC.BitBlt(0,0,m_BMBackgroundSize.cx,m_BMBackgroundSize.cy,&dcMemory,0,0,SRCCOPY);
dcMemory.DeleteDC();
}
dc.BitBlt(0,0,m_BMBackgroundSize.cx, m_BMBackgroundSize.cy,&mTempDC,0,0,SRCCOPY);
mTempDC.DeleteDC();
在OnMouseMove()中我检查鼠标是否在某个区域,如果是,我调用Invalidate(1),程序开始闪烁每次我在该特定区域移动鼠标。 我确实尝试过OnEraseBkgnd返回TRUE而没有运气。 我发现的唯一工作就是自己手动重绘编辑框:
pCtrl = GetDlgItem(IDC_EDIT1);
pCtrlDC = pCtrl->GetDC();
mTempDC.BitBlt(5, 31, 580, 183, pCtrlDC, 0, 0, SRCCOPY);
我不确定这是否是这样做的好方法但是它有效并且我在谷歌进行了大量研究和测试5个小时没有运气:\
答案 0 :(得分:0)
不要使用Invalidate
使整个窗口无效,只需使用InvalidateRect
无效的部分无效。
发生闪烁是因为在绘制背景时正在删除编辑控件并重新绘制。如果它们在无效矩形之外,则不会发生这种情况。