接上一篇文章,发现当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条无问题。但是重绘的刷新问题,还未解决。