我想寫一個 可以自動檢索的 CComboBox,現在發現了一個問題。
就是比如我插入了10條資訊,其中5條是AAA開頭的,后邊的不一樣,然后我輸入AAA下拉選單里可以出現5條資訊,然后默認下邊第一條是為選中,標記為藍色。
但是問題就來了
輸入框也變成第一條記錄了。
我就是想實作,雖然下邊第一條記錄是標記為藍色,但是輸入框還是我輸入的內容。 這該怎么做???
#include "stdafx.h"
/*#include "hrinetnsm_con.h" */
#include "ComboCompletion.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CComboCompletion
CComboCompletion::CComboCompletion()
{
}
CComboCompletion::~CComboCompletion()
{
}
BEGIN_MESSAGE_MAP(CComboCompletion, CComboBox)
//{{AFX_MSG_MAP(CComboCompletion)
ON_CONTROL_REFLECT(CBN_DROPDOWN, OnDropdown)
ON_CONTROL_REFLECT(CBN_EDITUPDATE, OnEditupdate)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_SHOWDROP, OnShowDropDown)
ON_CONTROL_REFLECT(CBN_SELCHANGE, &CComboCompletion::OnCbnSelchange)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CComboCompletion message handlers
int CComboCompletion::AddString(LPCTSTR lpszString)
{
m_strArr.Add(lpszString);
return CComboBox::AddString(lpszString);
}
int CComboCompletion::DeleteString(UINT nIndex)
{
m_strArr.RemoveAt(nIndex);
return CComboBox::DeleteString(nIndex);
}
int CComboCompletion::InsertString(int nIndex, LPCTSTR lpszString)
{
m_strArr.InsertAt(nIndex, lpszString);
return CComboBox::InsertString(nIndex, lpszString);
}
void CComboCompletion::ResetContent()
{
m_strArr.RemoveAll();
CComboBox::ResetContent();
}
BOOL CComboCompletion::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message == WM_CHAR)
{
m_bAutoComplete = TRUE;
int nVirKey = pMsg->wParam;
switch (nVirKey)
{
case VK_RETURN:
{
// 關閉下拉框
ShowDropDown(FALSE);
CString strLine;
GetWindowText(strLine);
// 回車即選中高亮項
SelectString(-1, strLine);
// 給父視窗發送選項改變的訊息
WPARAM wParam = MAKELPARAM(GetDlgCtrlID(), CBN_SELCHANGE);
GetParent()->PostMessage(WM_COMMAND, wParam, (LPARAM)m_hWnd);
break;
}
case VK_DELETE:
case VK_BACK:
m_bAutoComplete = FALSE;
break;
default:
break;
}
}
return CComboBox::PreTranslateMessage(pMsg);
}
void CComboCompletion::OnDropdown()
{
// TODO: Add your control notification handler code here
SetCursor(LoadCursor(NULL, IDC_ARROW));
}
void CComboCompletion::OnEditupdate()
{
// TODO: Add your control notification handler code here
CString strLine;
GetWindowText(strLine);
CString szInputTemp = strLine;
szInputTemp.MakeUpper();
int iHiLightStart = strLine.GetLength();
if(strLine.GetLength() == 0)
{
ShowDropDown(FALSE);
SetWindowText(_T(""));
m_bAutoComplete = TRUE;
return;
}
// 處理洗掉操作
// if(!m_bAutoComplete)
// {
// m_bAutoComplete = TRUE;
// return;
// }
CComboBox::ResetContent();
CString szTemp;
int nTemp = 0;
if (!strLine.IsEmpty())
{
for ( int nIndex=0; nIndex<m_strArr.GetSize(); ++nIndex )
{
szTemp = m_strArr[nIndex];
szTemp.MakeUpper();
int nFrom = szTemp.Find(szInputTemp);
nFrom = m_strArr[nIndex].Find(szInputTemp);
if ( nFrom != -1)//能匹配
{
CComboBox::AddString(m_strArr[nIndex]);
nTemp++;
}
}//for
}
// 開始匹配用戶輸入
int iSelectedRow = FindString(-1, strLine);
if(iSelectedRow >= 0 )
{
PostMessage(WM_SHOWDROP, 0, 0);
// 匹配的選項被選中
if(m_bAutoComplete)
{
PostMessage(CB_SETCURSEL, iSelectedRow, 0);
}else
{
SetWindowText(strLine);
}
// 給父視窗發送選項改變的訊息,這樣可以保證當輸入完整的匹配的部門時,不用回車也觸發部門改變訊息
WPARAM wParam = MAKELPARAM(GetDlgCtrlID(), CBN_SELCHANGE);
GetParent()->PostMessage(WM_COMMAND, wParam, (LPARAM)m_hWnd);
}
else
{
ShowDropDown(FALSE);
SetWindowText(strLine);
}
// 高亮自動完成的部分
PostMessage(CB_SETEDITSEL, 0, MAKELPARAM(iHiLightStart, -1));
}
HRESULT CComboCompletion::OnShowDropDown(WPARAM wParam, LPARAM lParam)
{
ShowDropDown(TRUE);
return 0;
}
void CComboCompletion::OnCbnSelchange()
{
// TODO: Add your control notification handler code here
}
uj5u.com熱心網友回復:
跪求大神。。跪著求uj5u.com熱心網友回復:
m_combox.SetCurSel(0); 設定默認顯示第一條記錄uj5u.com熱心網友回復:
我現在是希望下拉選單里 有5條記錄,比如第一條記錄被選中,是藍色,但是不要修改輸入的內容,比如輸入ABC 還是ABC
現在是輸入ABC 直接變成第一條記錄的 ABCDE了
uj5u.com熱心網友回復:
不是動態創建的可以在屬性里面 Type 選擇 Drop Listuj5u.com熱心網友回復:
改成drop list 我就沒法輸入了
現在要的是 我輸入abc 然后下拉選單里標藍abc的項 但是我輸入的內容 不被修改 選中后才修改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/120626.html
標籤:界面
