请问如何消除动画闪屏现象?

liqian0267 2002-11-29 08:06:37
我花的一个表盘在timer间距较小时有闪屏现象,如何解决?如能提供源代码或网址参考更好.
...全文
175 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liqian0267 2002-12-31
  • 打赏
  • 举报
回复
不好意思,结贴晚了。双缓冲需要另开线程吗?屏幕缓冲我试过,但还有闪屏现象。我又发了一张贴,能否详言?
jeremyhit 2002-12-05
  • 打赏
  • 举报
回复
应该设置双缓冲
现在内存中把要输出的内容创建完
再一次话到屏幕
重画屏幕时,避免全部重画
可以使用这个函数
void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );
使用时先计算需要重画的矩形lpRect
goldolphin 2002-12-01
  • 打赏
  • 举报
回复
lxjnet(根据地)的方法算作是屏幕缓冲法。
还有页翻转法,可以达到更好的效果,不过GDI可能不行,得用directX。
原理很简单,在显存中创建多个显示页,轮流在各个页上绘图,并指定显示设备轮流显示各个页。
Rigel(猎户座-参宿七)所说,类似于不洁矩形(dirty rectangle)
Rigel 2002-11-29
  • 打赏
  • 举报
回复
应该不用全部重画就能解决这个问题。InvalidateRect
approach 2002-11-29
  • 打赏
  • 举报
回复
http://www.codeproject.com/gdi/bufferdc.asp
lxjnet 2002-11-29
  • 打赏
  • 举报
回复
这个问题解决的办法是,在创建一个和屏幕属性一样的DC,每次先画后台DC,画好后再用BitBlt刷新当前显示用的DC。

可以参考以下代码创建内存中的DC

CClientDC pDC(this);

::GetWindowRect ( ::GetDesktopWindow(), &rc );

m_pMemDC->CreateCompatibleDC(&pDC);
m_pBitmap->CreateCompatibleBitmap(&pDC,1600,1280);

CBitmap* pOldBitmap = (CBitmap*) (m_pMemDC->SelectObject(m_pBitmap));
m_pOldBitmap = m_pMemDC->SelectObject(m_pBitmap);

m_pMemDC->SelectClipRgn(NULL);
CBrush *backgroundBrush;
backgroundBrush = new CBrush;
backgroundBrush->CreateSolidBrush((COLORREF)::GetSysColor(COLOR_WINDOW));

CBrush *pOldBrush = m_pMemDC->SelectObject(backgroundBrush);
m_pMemDC->PatBlt(0, 0, 1600, 1280, PATCOPY);
m_pMemDC->SelectObject(pOldBrush);
delete backgroundBrush;

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧