MFC ListCtrl如何查找某一行的上一行或者下一行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC ListCtrl如何查找某一行的上一行或者下一行相关的知识,希望对你有一定的参考价值。
我有一个ListCtrl第一列用来显示日期时间,然后我在两个DateTimePicker分别输入日期、时间。如果条件相等的话可以查找到,但是我又想在不相等的情况下,查找ListCtrl最接近DateTimePicker的上一行或者下一行,要怎么实现?贴一段代码,望高手解答。
void CClientDlg::OnBnClickedSelect()
int i;
CTime stDate,stTime;
CString strDTime;
CString strItem1,strItem1Time1;
m_dtYMD.GetTime(stDate);
m_dtHMS.GetTime(stTime);
//获取DateTimePicker时间
strDTime.Format("%04d-%02d-%02d %02d:%02d",stDate.GetYear(),stDate.GetMonth(),stDate.GetDay(),stTime.GetHour(),stTime.GetMinute());
for(i = 0;i < m_lstDtf.GetItemCount();i++)
//获取ListCtrl第一列日期、时间
strItem1 = m_lstDtf.GetItemText(i,0);
strItem1Time1 = strItem1.Left(16);
if(strDTime == strItem1Time1)
m_lstDtf.SetItemState(i,LVIS_SELECTED,LVIS_SELECTED|LVIS_FOCUSED);
m_lstDtf.SetFocus();
m_lstDtf.EnsureVisible(i,FALSE);
break;
//无此时间段视频,定位到相邻行,弹出消息对话框 ???
if(i == m_lstDtf.GetItemCount())
MessageBox("无此时间段视频",NULL,MB_OK|MB_ICONWARNING);
return;
假设我输入2014-10-24 8:30:00,但ListCtrl只有2014-10-24 8:10:00和2014-10-24 8:50:00,我想在2014-10-24 8:10:00或者2014-10-24 8:50:00处高亮显示
遍历列表,计算输入时间和列表项的时间差,找到时间差最小的那一项,并设置选中状态。
求时间差可以先将两个时间标准化,然后用MFC提供的类库来运算,例如:
COleDateTime m_tStartDateTime;COleDateTime m_tEndDateTime ;
//赋值,此处省略
COleDateTimeSpan tMinute = m_tEndDateTime - m_tStartDateTime;
int iMinute = (int)tMinute.GetTotalMinutes();
//iMinute即为相差分钟数追问
你说的m_tStartDateTime和m_tEndDateTime哪个是DateTimePicker输入的,哪个是ListCtrl里面的
追答无所谓,都一样
追问iMinute可以求出,但要怎么判断它是最小的那一项呢?
追答遍历数组找最小值,很基本的算法,比排序还简单,建议多看些经典算法。
参考技术A 我建议,用个结构体来保存Cstring key = 2014-10-24 8:10:00,__int64 value = 2014102481000比较的时候用value
在 MFC 中更改 CListCtrl 的样式
【中文标题】在 MFC 中更改 CListCtrl 的样式【英文标题】:Changing style of CListCtrl in MFC 【发布时间】:2013-12-12 14:58:38 【问题描述】:我在 mfc 应用程序的一个对话框中有一个 ListCtrl。我想更改列名样式和按钮样式,使其看起来更像 win7 主题。这是右边有 listCtrl 的旧对话框。
我想把表格的第一行和按钮改成这样,
这可以通过 m_ElementListCtrl.SetExtendedStyle(..) 更改任何样式来完成吗?或改变它的一些属性?
【问题讨论】:
【参考方案1】:您好,如果您的应用是 Unicode(否则有 some problems),您需要使用通用控件 6。
在您的stdafx.h
文件中,您可能会看到这种代码,如果没有,只需将其添加到文件末尾,如果您将应用更改为 UNICODE,您将看到具有新样式的控件。
#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32'name='Microsoft.Windows.Common-Controls' version='6.0.0.0'processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif
同时检查项目属性->链接器->清单文件->生成清单应该设置在Yes (/MANIFEST)
【讨论】:
以上是关于MFC ListCtrl如何查找某一行的上一行或者下一行的主要内容,如果未能解决你的问题,请参考以下文章
MFC的list control控件,如何得到某一行某列的字符串内容?