用戶端是需登入的,登入是需要輸入賬号的,每次輸入重複的東西總會讓人厭煩,于是乎需要程式自動補全你想輸入的内容。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);
}
大緻效果: