解决MFC中CListCtrl(virtual)控件闪烁问题

文章之前,先对虚拟列表t控件做一个简单总结:
1,在资源中右键点击控件,找到【Owner Data】选择true
2,在列表控件的父窗口的类(例如对话框类)中添加 LVN_GETDISPINFO 消息,
或者在派生的控件类(CMyListCtrl)中映射 LVN_GETDISPINFO 消息
3,在消息响应函数里面写上:
    LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem= &(pDispInfo)->item;
然后根据pItem->iItem(行数)和pItem->iSubItem(列数)进行更新列表内容,将内容拷贝到pItem->pszText里面。
4,使用 SetItemCount(); 来进行数据插入删除。更多相关信息,请翻阅codeproject


下面说一下列表控件闪烁问题的处理。
按照上面处理完成之后,如果频繁调用 SetItemCount 插入数据的话,会导致列表频繁刷新而闪烁,
影响用户体验,可以通过以下方式解决:
1,在列表控件的派生类(CMyListCtrl)中添加消息 BOOL CMyListCtrl::OnEraseBkgnd(CDC* pDC)

里面直接返回FALSE。 

发现返回false之后在xp兼容有问题,不需要返回倒是可以兼容win7+xp

2,在控件的父窗口(对话框)添加消息 OnEraseBkgnd,加上代码:
BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)
{
	CRect clip;
	m_listCtrl.GetWindowRect(clip);
	ScreenToClient(clip);
	pDC->ExcludeClipRect(clip);


	pDC->GetClipBox(clip);
	pDC->FillSolidRect(clip, GetSysColor(COLOR_BTNFACE));


	return FALSE;
}


至此完成。据说此方法可以解决任何控件的闪烁问题,目前只是尝试了列表控件。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值