vc++ combobox 如何阻止自动匹配(在控件文本发生变化的函数内,我添加如下代码)
LRESULT CMainDlg::OnCbnEditchangeCombo1(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
// TODO: 在此添加控件通知处理程序代码
int stai = m_baidu.GetCount(); //得到框内条数
int word_count = 1;
for(int i = stai-1;i>= 0;i--)//删除之前列表内所有内容
{
m_baidu.DeleteString(i);
}
m_baidu.ShowDropDown(TRUE); //打开列表显示数据(只要用这条必须要先在取值之前使用)
GetDlgItemText(IDC_COMBO1,m_str,1024);//取值之后自动选择第一行,疑似BUG
int word = strlen(m_str);
int count_i;
for(count_i = 0; count_i <= m_NR[0].many; count_i++) //添加相似内容到列表
{
char *str2 = (LPSTR)(LPCTSTR)m_NR[count_i].str1; //string 转 char类型
//if(mystrnicmp(str2,m_str,strlen(m_str)) ||strcmp(str2,m_str) == 0)
//{
if(mystrnicmp(str2,m_str,word) && strlen(m_str) == word &&word_count>=1&&word_count < 6 )
{
m_baidu.AddString(m_NR[count_i].str1);
word_count++;
}
// }
}
char szSQL[256] = {0};
sprintf(szSQL, "select * from type");
m_adoRecordSet.SetAdoConnection(&m_adoConnection);
BOOL cOpen = m_adoRecordSet.Open(szSQL);
if(cOpen)
{
/********************************************************/
int count_i;
for(count_i = 0;!m_adoRecordSet.IsEOF();count_i++)
{
m_adoRecordSet.GetCollect("user_id", m_NR[count_i].strtemp);
m_adoRecordSet.GetCollect("user_nr", m_NR[count_i].str1);
m_adoRecordSet.MoveNext();
}
m_NR[0].many = count_i;
/********************************************************/
}
m_adoRecordSet.Close(); //关闭数据库
::SetCursor(::LoadCursor(NULL,IDC_ARROW)); //使用上述语句会使鼠标消失,这句是显示鼠标
m_baidu.SetEditSel(strlen(m_str),-1);
memset(m_str,0,sizeof(m_str));
return 0;
}
输入内容,显示出来与之相似的内容,但是当控件失去焦点的时候,文本就显示列表第一行内容,之前自己输入的内容清掉了。看别人的资料说要把自动排列关闭,但是目前关闭了也不行,高手请指教
你用 Edit + ListBox 不就得了,更方便。
1.先把内容清空
2.ShowDropDown
3.AddString
OK了。。。