Invalidate太恐怖了,它会导致整个客户区重画,不闪才怪。把OnPaint中刷新数据那部分代码拿出来,放到OnTimer中就好了。
解决方案 »
- 请教关于VC2010中Ribbon图标设置透明背景的问题
- 思路问题,请教老师
- 如何在CRichEditCtrl中插入RTF编码
- 超强郁闷问题,一天都没有解决,有关序列化的,555。。。。
- 我的vc项目编译完一次在编译就不行了
- 控制弹出唯一的Dialog
- SQL 语句里的 MAX()函数为什么9比10大?难道只比个位?
- ADO+VC+ACCESS怎么把表中某个字段的说明读出来?
- MFC处理ActiveX控件的安全性问题
- 怎样才能弄懂VC中名目繁多的各种数据类型如:LPCSTR,LPCTSTR,LPDWORD等等...,应该看哪方面的书?
- 原来Timer在win95和win2000下不一样,win2000可以突破18/s的限制
- 不用钩子如何禁止windows应用键?
2、在OnPaint中用双缓冲来做。即把东西画到一个内存DC上,再BitBlt到paintDC上。
3、处理WM_ERASEBKGND
另外,我不太明白zeroweb的后面两种方法
当然,如果你的确是对位图进行操作的话,那么zeroweb(我不想再做软件了)的三种方法需要同时使用——这是GDI绘图最基本的技术。
总之,避免闪烁只有一个原则:不要惊动无关的“人”,不要让用户看到你“绘制的过程”(双缓冲)。谁需要更新,就只画谁;那部分需要更新,就只画那部分。
void CEMapThumbnailView::RedrawRectTracker()
{
CRect rectOutside,rectInside;
m_RectTracker.GetTrueRect(rectOutside);
rectInside=m_RectTracker.m_rect;
rectInside.InflateRect(1,1);
CRect rectTemp;
//left
rectTemp.SetRect(rectOutside.left,rectOutside.top,rectInside.left,rectOutside.bottom);
InvalidateRect(rectTemp,TRUE);
//right
rectTemp.SetRect(rectInside.left,rectOutside.top,rectOutside.right,rectOutside.bottom);
InvalidateRect(rectTemp,TRUE);
//top
rectTemp.SetRect(rectOutside.left,rectOutside.top,rectOutside.right,rectInside.top);
InvalidateRect(rectTemp,TRUE);
//bottom
rectTemp.SetRect(rectOutside.left,rectInside.bottom,rectOutside.right,rectOutside.bottom);
InvalidateRect(rectTemp,TRUE);
UpdateWindow();
}