天天看點

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登入輸入賬号)