MFC的list control控件实现点击变色,并保持滚动条不变

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012839256/article/details/82787194

寄 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();

神奇,实现了。

猜你喜欢

转载自blog.csdn.net/u012839256/article/details/82787194