寄 https://blog.csdn.net/u012839256/article/details/81041116 之后功能的完善。
本篇文章,实现了MFC的list control控件实现点击变蓝,并保持滚动条不变。
在之前代码:
file.Open("");//打开文件
while( file.ReadString(szLine) )//读取并显示文件
{
}
file.close();//关闭文件
的基础上,填加了点击事件,实现点击变蓝,并且保持滚动条位置不变。
这个过程分两步:
(1)我们之前设想,通过重绘函数,对list控件的行的背景进行重绘,但是重绘之后无法刷新,不能实时显示,需要拖动滚动条对页面进行刷新,才能显示蓝色背景。
因此呢,我们又想,将导入数据的代码,直接放到一个函数 file_data_show() 中,通过点击函数 OnClickListHistory() 调用,然后再函数中直接将list控件里的数据清空,然后再重新写入,此时刚好蓝条也出现了,代码如下:
m_list.DeleteAllItems();
file.Open();
while()
{
}
file.close();
而在点击事件中,我们是这样的
void History::OnClickListHistory(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
DWORD dwPos = GetMessagePos();
CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
m_list.ScreenToClient(&point);
lvinfo.pt = point;
lvinfo.flags = LVHT_ABOVE;
int nItem = m_list.SubItemHitTest(&lvinfo);
OnCustomdrawListHistory(pNMHDR, pResult);
//LockWindowUpdate();
file_data_show();
*pResult = 0;
}
那么,新的问题又来了,每次删除数据,再重新插入,滚动条总是出现在最顶上,因此蓝条无法显示在视线中,然后把百度翻了个底朝天,发现这篇文章 https://blog.csdn.net/smalldown/article/details/44493487
int iScrollPos = m_list.GetScrollPos(SB_VERT);
int iItemCount = m_list.GetItemCount();
int iRangLimit = m_list.GetScrollLimit(SB_VERT);
int iEnsureVisble = iScrollPos + (iItemCount - iRangLimit) - 1;
m_list.DeleteAllItems();
while( file.ReadString(szLine) )
{
}
m_list.EnsureVisible(iEnsureVisble, FALSE);
//关闭文件
file.Close();