想做LISTBOX的搜索,也就是说listbox列出来的是一些英文,当在搜索栏输入A的时候显出出来开头为A的英文,当输入AB的时候显示出来开头为AB的,不知道应该如何实现有人已经告诉我怎么做了,但是我不会,希望您能帮我完成,我已经开个帖子给50分了,完成后和这个帖子的100分一起给,
希望大家帮帮忙,耽误大家点时间,但是我明天早上着急要,谢谢大家了
希望大家帮帮忙,耽误大家点时间,但是我明天早上着急要,谢谢大家了
帮我改动完毕后直接发送到[email protected]就可以了,谢谢您,我收到马上给分
/*
实现列表数据的过滤
源列表可以为空或与源列表相同,此时只对目标列表进行不匹配删除操作
目标列表和源列表地址不相同时,将从源列表中提取匹配字符列表
*/
int Filter_List(CListBox *pDstList, //目标列表
CListBox *pSrcList, //源列表
LPCTSTR pszFilter, //匹配字符
BOOL bMatchCase //大小写匹配指示
)
{
ASSERT(pDstList);//确保列表地址有效 if(pSrcList && pSrcList != pDstList) //目标列表和源列表地址不相同
{
pDstList->ResetContent();//清除列表
for(int i=0;i<pSrcList->GetCount();i++)
{
CString itemStr;
pSrcList->GetText(i,itemStr);
pDstList->AddString(itemStr); //添加字符串
pDstList->SetItemData(i,pSrcList->GetItemData(i)); //拷贝属性
}
} CString filter = pszFilter;
int filter_len = filter.GetLength();
if(filter_len>0 && !bMatchCase) //不匹配大小写
filter.MakeUpper(); if(strlen(pszFilter) > 0) //匹配字符串长度大于0
{
for(int i=0;i<pDstList->GetCount();i++)
{
CString itemStr;
pDstList->GetText(i,itemStr);
if(!bMatchCase)
itemStr.MakeUpper();
if(itemStr.GetLength() >= filter_len
&& itemStr.Left(filter_len) == filter)
{
}
else //不匹配时删除
{
pDstList->DeleteString(i);
i--; //确保下一次从删除后面的列表开始
}
}
}
return(pDstList->GetCount());
}
加入 CListBox 变量 m_ListBox,初始化变量放在 m_ListBox 中
调用
CListBox *pList = (CListBox *)GetDlgItem(IDC_LIST);
Filter_List(pList,&m_ListBox,"",false);
更新显示对话框中加入编辑框的 EN_CHANGE 事件影射
OnChangeEdit()
{
CString str;
GetDlgItem(IDC_EDIT)->GetWindowText(str); //读取输入字符
CListBox *pList = (CListBox *)GetDlgItem(IDC_LIST);
Filter_List(pList,&m_ListBox,str,false);//过滤
}
创建一个IAutoComplete接口并关联到一个EDIT窗口即可,自己仅仅需要实现一个IEnumString接口。待会我给你发一个网上例子的源码,似乎和你的要求很相似,不知是否晚了没
1.初始化数据的函数,用AddString()添加所有项
2.编写字串查找函数,BOOL FindStr(CString &str,CSting &child);用于判断
3.编写一函数储存了不符合条件的所有index的集合.依次提取listbox中的项放入字符数组,调用FindStr判断,如果不满足条件则存起来
4.在编辑框的EN_CHANGE事件里,按照3提供的索引调用DeleteString()依次删除,其中if(编辑框空),那么调用1显示初始全部数据。