天天看点

MFC Combobox 输入内容自动补全并选中缺失部分(类似qq登录输入账号)

客户端是需登录的,登录是需要输入账号的,每次输入重复的东西总会让人厌烦,于是乎需要程序自动补全你想输入的内容。MFC里面通常用来实现登录账号的控件就是Combobox啦。

首先你得有保存用户之前的登录记录,这个记录一般保存在数据库中。既然数据有了就只要在用户输入一个账号前面部分字符的时候,使用已输入的字串去数据库里查找与之相匹配的记录,按时间倒序取给用户自己去快速选择。

重点就是要处理 Combobox 的 ON_CBN_EDITCHANGE 消息映射:

BEGIN_MESSAGE_MAP(CLoginDlg, CSkinDialog)
	ON_CBN_EDITCHANGE(IDC_ACCOUNT, &CLoginDlg::OnCbnEditchangeAccount)
END_MESSAGE_MAP()
           

响应函数如下:

void CLoginDlg::OnCbnEditchangeAccount()
{
	m_ComAccount.Invalidate();
	if (m_bBackSpace){
		//屏蔽按下退格键后的字串变化
		m_bBackSpace = FALSE;
		return;
	}
	CString inputText,account;
	m_ComAccount.GetWindowText(inputText);
	if (inputText.IsEmpty()){	return;}
	//1.根据输入字符,查找数据库,以历史登陆时间倒序,取出第一个满足的账号
	m_operateDB.GetCompleteAccount(inputText,account);
	if (!account.IsEmpty())
	{
		//2.将账号填入账号输入框中
		m_ComAccount.SetWindowText(account);
		int nPos = account.FindOneOf(inputText);
		//3.选中输入数字最后一位开始至整个账号末尾的字符
		m_ComAccount.SetEditSel(nPos+inputText.GetLength(),account.GetLength());
	}
}
           

其中 m_operateDB 为一个数据库操作全局对象,其方法GetCompleteAccount 就是去获取最近时间匹配到的历史账号。

响应函数里有去处理退格键的问题,就是去避免输入了大部分字串后已经匹配到了一个账号了,使用退格键删除一个字符后又再次匹配到而自动补全。这之前需要在PreTranslateMessage中拦截处理Del键和Backspace键,m_bBackSpace 是一个BOOL 类型标记,具体看代码:

BOOL CLoginDlg::PreTranslateMessage(MSG* pMsg)
{
	if(pMsg->message == WM_KEYDOWN) 
	{ 
		switch (pMsg->wParam) 
		{
		case VK_DELETE:
		case VK_BACK:
			{
				if( m_ComAccount.GetEditWnd() == GetFocus())
				{
					m_bBackSpace = TRUE;
				}
			}
			break;
		default: 
			break; 
		} 
	}
	return __super::PreTranslateMessage(pMsg);
}
           

大致效果:

MFC Combobox 输入内容自动补全并选中缺失部分(类似qq登录输入账号)
MFC Combobox 输入内容自动补全并选中缺失部分(类似qq登录输入账号)