MFC-CListCtrl重绘,修复局部刷新,按钮位置不更新问题

接上一篇文章,发现当list的条目数达到30以上,即超出当前可视范围时,按钮会出现部分不更新问题,从而导致当窗体大小发生变化时,不可见部分按钮位置不更新,从而出现位置覆盖单元格问题。还有就是当滑动鼠标滚轮进行控件条目滚动时,按钮列,部分按钮会消失,再次点击此行才会重新刷新,显然这个也是刷新问题,

解决这个两个问题,首先要重载 Onsize 与 OnNcCalcSize 以及 OnMouseWheel函数,在此类中添加

ON_WM_MOUSEWHEEL()
ON_WM_NCCALCSIZE()
ON_WM_SIZE()

然后重载这三个函数:

头文件:

	afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp);//不显示滑动条
	afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);//响应滚轮事件
	afx_msg void OnSize(UINT nType, int cx, int cy);//窗体位置大小变化

.cpp

//实现滚轮滚动 但不显示滚动条
void CListCtrlCl::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
	ShowScrollBar(SB_BOTH, FALSE);
	CListCtrl::OnNcCalcSize(bCalcValidRects, lpncsp);
}

BOOL CListCtrlCl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
	Scroll(CSize(0, -zDelta));
	for each (auto var in m_BtVect)//隐藏所有按钮
	{
		var.m_Btn[0]->ShowWindow(SW_HIDE);
		var.m_Btn[1]->ShowWindow(SW_HIDE);
	}
	Invalidate();//刷新窗体
	return CListCtrl::OnMouseWheel(nFlags, zDelta, pt);
}


void CListCtrlCl::OnSize(UINT nType, int cx, int cy)
{
	CListCtrl::OnSize(nType, cx, cy);
	for each (auto var in m_BtVect)//隐藏所有按钮
	{
		var.m_Btn[0]->ShowWindow(SW_HIDE);
		var.m_Btn[1]->ShowWindow(SW_HIDE);	
	}
}

简单来说,就是在窗体位置大小发生变化时,先将所有的按钮进行隐藏。DrawItem此函数调用时只会绘制当前可视范围的item,所以要将所有不可见按钮进行隐藏,再在重绘时,调用按钮位置移动 movewindow 以及按钮显示 showwindow函数,从而即可解决上述出现的问题,目前测试1000条无问题。但是重绘的刷新问题,还未解决。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值