CListCtrl 闪 因为需要实时显示信息,我在定时器中显示数据。时间间隔为1S,每次更新的时候,都会先 m_listVersion.DeleteAllItems();再插入数据,可是问题是,现在每隔1秒就闪一次,请大侠帮忙。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //刷新void CCnuWhiteListDlg::OnBnClickedCnuWhitelistRefreshButton(){ // TODO: 在此添加控件通知处理程序代码 //change by xuying for avoid flash m_ctrCnuWhilteList.SetRedraw(FALSE); readCnuWhilteListTable(); m_ctrCnuWhilteList.SetRedraw(TRUE); m_ctrCnuWhilteList.Invalidate(); m_ctrCnuWhilteList.UpdateWindow(); UpdateData(FALSE); }我的项目中也遇到过,加上下面这几句就好了。 m_ctrCnuWhilteList.SetRedraw(FALSE); m_ctrCnuWhilteList.SetRedraw(TRUE); m_ctrCnuWhilteList.Invalidate(); m_ctrCnuWhilteList.UpdateWindow(); 我在OnTimer里面添加了,效果还是一样的,还是会闪 继承CListCtrl类,在OnPaint()里用双缓存画,OnEraseBkgnd直接返回return TRUE; 不要m_listVersion.DeleteAllItems(),只插入新数据就不闪了嘛 因为更新时,是将数据库里所有的数据重新插入到list中,所以要DeleteAllItems.如果不做这步操作,则会出现很多重复记录。难道在插入前要去判断是否已存在这条记录?然后再更新?这样效率应该会很低吧 可以借鉴双缓冲机制,用2个list,显示的为前台list,隐藏的为后台list,执行插入永远在后台list上,插入完成后在隐藏原来的前台list,显示后台list,这样原前台变成后台,后台变成前台,插入永远在后台list上就不会闪了 1.不要每次都DeleteAllItems然后重新插入新数据2.如果数据量大,建议用虚表方式 因为更新时,是将数据库里所有的数据重新插入到list中,所以要DeleteAllItems.如果不做这步操作,则会出现很多重复记录。这种方法比较简单,易于实现,但是速度慢,会出现界面闪烁,可以改为: 只更新修改过的,没修改的就不更新。 拖动界面内ControlBar的边框无法响应OnWindowPosChanged XP虚拟机问题 获取struct的值 用vfw采集怎样将一帧数据采到一个数组中? 讨论:server端编程问题 奇怪的问题哦! 很难很难的问题,在子域中通过根域上网,怎样通过域验证? 下载的MFC代码怎么编译啊 求助*** 使用本地代理后 百度云盘的极速上传控件不能使用 文件存取加密 Sqlite加密 Win7下如何文件关联? 求大神解释!为什么SendMessage没有死循环
void CCnuWhiteListDlg::OnBnClickedCnuWhitelistRefreshButton()
{
// TODO: 在此添加控件通知处理程序代码
//change by xuying for avoid flash m_ctrCnuWhilteList.SetRedraw(FALSE);
readCnuWhilteListTable();
m_ctrCnuWhilteList.SetRedraw(TRUE);
m_ctrCnuWhilteList.Invalidate();
m_ctrCnuWhilteList.UpdateWindow();
UpdateData(FALSE);
}
我的项目中也遇到过,加上下面这几句就好了。
m_ctrCnuWhilteList.SetRedraw(FALSE);
m_ctrCnuWhilteList.SetRedraw(TRUE);
m_ctrCnuWhilteList.Invalidate();
m_ctrCnuWhilteList.UpdateWindow();
我在OnTimer里面添加了,效果还是一样的,还是会闪
因为更新时,是将数据库里所有的数据重新插入到list中,所以要DeleteAllItems.如果不做这步操作,则会出现很多重复记录。难道在插入前要去判断是否已存在这条记录?然后再更新?这样效率应该会很低吧
2.如果数据量大,建议用虚表方式