Invalidate()语句所引起的画面闪烁
我在MFC对话框里,先添加了一个图片。使用OnEraseBkgnd函数来设置了背景图片(纯蓝色),然后在OnCtlColor中设置静态控件的背景颜色(这样静态控件的颜色与背景颜色一样了,看起来就好像是文字在背景图上),可是因为静态控件的文字一变化,就会重叠,本来我是用Invalidate()来解决这个问题的,但是会闪烁。如何才能消除闪烁呢?网上说可以用双缓冲
的方法,http://www.vckbase.com/document/viewdoc/?id=1612 。。例如这个。。。
可是虽然原理我明白,但是还是不太懂,我对图形的问题一直很差,双缓冲在哪里搞的啊,是在Onpaint()里面还是在哪里的啊,能否有高手能够把此种方法说得清楚些呢,或者告诉我其它的方法来消除闪烁。
最好给个例子,只要有背景图片,然后再来个静态文本,当文本的文字变化时(会变化十几次以上的),如何不闪烁且又文字不重叠的呢?菜鸟求教~下面有一个例子,可是我看不明白。能否来点简单的例子呢……
void CCustomInputDialog::OnPaint()
{
CPaintDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(&m_bgbmp);
CDC maskDC;
maskDC.CreateCompatibleDC(&dc);
CBitmap maskbmp;
maskbmp.CreateCompatibleBitmap(&dc,480,276);//
maskDC.SelectObject(&maskbmp);
maskDC.BitBlt(0,0,480,276,&memDC,0,0,SRCCOPY);
if(!v_keyinfo.empty())
{
for(int i = 0;i<v_keyinfo.size();i++)
{
if(m_bDownShift == false)
{
if(i >= 36 && i< 62)
continue;
if(v_keyinfo[i].pImage[0]!=NULL)
if(v_keyinfo[i].keydown == false)
v_keyinfo[i].pImage[0]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
else
{
v_keyinfo[i].pImage[1]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
v_keyinfo[i].pImage[2]->Draw(maskDC,&v_keyinfo[i].effectRC,NULL);
}
}else
{
if(i >= 10 && i<=35)
continue;
if(v_keyinfo[i].pImage[0]!=NULL)
if(v_keyinfo[i].keydown == false)
v_keyinfo[i].pImage[0]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
else
{
v_keyinfo[i].pImage[1]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
v_keyinfo[i].pImage[2]->Draw(maskDC,&v_keyinfo[i].effectRC,NULL);
}
}
}
}
dc.BitBlt(0,0,480,276,&maskDC,0,0,SRCCOPY);
memDC.DeleteDC();
maskDC.DeleteDC();
maskbmp.DeleteObject();
}