防止窗口闪烁的方法,第1张

防止窗口闪烁的方法,第2张

很多人都遇到过这种情况。当你想重画一个窗口,或者需要每隔一段时间重画一次窗口的时候,窗口就会一直闪烁。那么如何消除闪烁呢?借鉴别人的经验,我也自己总结。现在我就介绍总结出来的几种方法,供大家参考。

1.将invalid()替换为InvalidateRect()。
因为invalid()会导致整个窗口的图像被重绘,耗时较长,而InvalidateRect()只重绘Rect区域的内容,耗时较少。所以更换后闪烁会大大减少。如果你真的需要改善闪烁,计算一个Rect比重绘不需要重绘的内容花费的时间要少得多。

2.不要让系统清除你的窗口。
当你需要重画窗口时,系统会帮你用指定的背景色擦除窗口。但是,需要重画的区域可能很小。或者说,在你重画这些东西之前,你要做大量的计算,然后才能开始。此时,您可以禁止系统擦除原始图像。直到你计算完所有的数据,把需要自己擦掉的部分用背景色(比如dc。FillRect(rect,& brush));Rect是要擦除的区域,brush是带背景色的笔刷),然后绘制新的图形。为了防止系统擦除你的窗口,你可以重载OnEraseBkgnd()函数,让它直接返回TRUE。如
bool cmywin::Onerasebkgnd(CDC * PDC)
{
return true;
//return CWnd::OnEraseBkgnd(pDC);//注释掉系统的原语句。
}

3.有效擦除。
擦除背景时,不要把该擦的和不该擦的都擦了。比如你在一个窗口上放了一个很大的编辑框,几乎占据了整个窗口,那么你对整个窗口背景的频繁擦除就会导致编辑不断重绘,形成尖锐的闪烁。其实你可以CRgn创建一个需要擦除的区域,只擦除这部分。如
GetClientRect(rect client);
rgn1。CreateRectRgnIndirect(rect client);
rgn2。CreateRectRgnIndirect(m _ rect edit);
if (rgn1.combinergn (& rgn1,& rgn2,rgn _ XOR)//处理后的rgn1只包含编辑框外的客户区域,这样编辑就不会被我的背景覆盖而导致重绘。
{
ASSERT(FALSE);
退货;
}
刷。create solid brush(m _ clrBackgnd);
pDC->FillRgn(&rgn1,& brush);
刷。delete object();
注意:使用此方法时,应同时使用方法二。

4.先用MemoryDC在内存中画图,然后复制到屏幕上。
当绘图过程非常长时,这种方法更有效。毕竟内存操作更快,复制到屏幕上是一次性的,至少不会明显看出什么东西是从左向右画的。
void CMyWin::OnPaint()
{
CPaintDC dc1(this);//用于绘制
dcMemory的设备上下文。CreateCompatibleDC(& dc1);
cbit map BMP;
bmp。CreateCompatibleBitmap(&dc1,rectClient。Width(),rectClient。height());
dcMemory。select object(& BMP);
//接下来,随心所欲的画。
//dcMemory。FillRect(rectClient,& brush);
dc1。BitBlt(0,0,rectClient。Width(),rectClient。Height(),&dcMemory,0,0,src copy);
dcMemory。DeleteDC();
//不要调用CWnd::OnPaint()来绘制消息
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 防止窗口闪烁的方法

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情