客户端是需登录的,登录是需要输入账号的,每次输入重复的东西总会让人厌烦,于是乎需要程序自动补全你想输入的内容。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);
}
大致效果: