📄 advcombobox.cpp
字号:
m_pParent->SendMessage( WM_COMMAND, MAKEWPARAM(nId,CBN_KILLFOCUS), (LPARAM)m_hWnd );
m_bHasSentFocus = false;
m_pEdit->SetSel(0,0);
}
//+++
if (m_pDropWnd)
{
OnDestroyDropdownList(0,0);
}
}
void CAdvComboBox::OnShowWindow(BOOL bShow, UINT nStatus)
{
CWnd::OnShowWindow(bShow, nStatus);
}
void CAdvComboBox::ModifyACBStyle(UINT nRemoveStyle, UINT nAddStyle)
{
if( nAddStyle & ACBS_FLAT )
{
nRemoveStyle |= ACBS_STANDARD;
}
else
if( nAddStyle & ACBS_STANDARD )
{
nRemoveStyle |= ACBS_FLAT;
}
m_dwACBStyle &= ~nRemoveStyle;
m_dwACBStyle |= nAddStyle;
Invalidate();
}
int CAdvComboBox::GetCount()
{
return m_list.size();
}
int CAdvComboBox::GetCurSel()
{
CString str;
GetText( str );
return FindStringExact( -1, str );
}
int CAdvComboBox::SetCurSel(int nSelect)
{
if( nSelect == -1 )
{
m_nCurSel = nSelect;
m_strEdit = _T("");
Invalidate();
return CB_ERR;
}
else
if( m_list.size() == 0 )
{
m_nCurSel = nSelect;
return CB_ERR;
}
else
if( nSelect < -1 || nSelect > (int)m_list.size()-1 )
{
return CB_ERR;
}
else
{
m_nCurSel = nSelect;
m_iter = m_list.begin();
advance( m_iter, nSelect );
m_strEdit = m_iter->strText;
Invalidate();
return m_nCurSel;
}
}
int CAdvComboBox::FindString(int nStartAfter, LPCTSTR lpszString)
{
int nPos = 0;
m_iter = m_list.begin();
if( nStartAfter != -1 )
{
advance( m_iter, nStartAfter );
nPos = nStartAfter;
}
for( m_iter; m_iter != m_list.end(); ++m_iter )
{
if( _tcsncmp( m_iter->strText.c_str(), lpszString, _tcslen(lpszString) ) == 0 )
{
return nPos;
}
nPos++;
}
return CB_ERR;
}
int CAdvComboBox::FindStringExact(int nIndexStart, LPCTSTR lpszFind)
{
TRACE(_T("in CAdvComboBox::FindStringExact: nIndexStart=%d\n"), nIndexStart);
if( nIndexStart > (int)m_list.size() && nIndexStart != -1 )
return CB_ERR;
int nPos = 0;
m_iter = m_list.begin();
if( nIndexStart != -1 )
{
advance( m_iter, nIndexStart );
nPos = nIndexStart;
}
for( m_iter; m_iter != m_list.end(); ++m_iter )
{
if( _tcscmp( m_iter->strText.c_str(), lpszFind ) == 0 )
{
// XLISTCTRL_TRACE(_T("CAdvComboBox::FindStringExact returning %d\n"), nPos);
return nPos;
}
nPos++;
}
return CB_ERR;
}
int CAdvComboBox::SelectString(int nStartAfter, LPCTSTR lpszString)
{
if( nStartAfter > (int)m_list.size() )
return CB_ERR;
int nPos = 0;
m_iter = m_list.begin();
if( nStartAfter != -1 )
{
advance( m_iter, nStartAfter );
nPos = nStartAfter;
}
for( m_iter; m_iter != m_list.end(); ++m_iter )
{
if( _tcscmp( m_iter->strText.c_str(), lpszString ) == 0 )
{
m_nCurSel = nPos;
m_strEdit = m_iter->strText;
Invalidate();
return nPos;
}
nPos++;
}
return CB_ERR;
}
int CAdvComboBox::SetItemData(int nIndex, DWORD dwItemData)
{
m_iter = m_list.begin();
advance( m_iter, nIndex );
if( m_iter == m_list.end() || nIndex > (int)m_list.size() )
{
return CB_ERR;
}
m_iter->vpItemData = (void*)dwItemData;
return CB_OKAY;
}
DWORD CAdvComboBox::GetItemData(int nIndex)
{
m_iter = m_list.begin();
advance( m_iter, nIndex );
if( m_iter == m_list.end() || nIndex > (int)m_list.size() )
{
return (DWORD)CB_ERR;
}
return (DWORD)m_iter->vpItemData;
}
int CAdvComboBox::SetItemDataPtr(int nIndex, void *pData)
{
m_iter = m_list.begin();
advance( m_iter, nIndex );
if( m_iter == m_list.end() || nIndex > (int)m_list.size() )
{
return (DWORD)CB_ERR;
}
m_iter->vpItemData = pData;
return CB_OKAY;
}
void* CAdvComboBox::GetItemDataPtr(int nIndex)
{
m_iter = m_list.begin();
advance( m_iter, nIndex );
if( m_iter == m_list.end() || nIndex > (int)m_list.size() )
{
return (void*)CB_ERR;
}
return m_iter->vpItemData;
}
void CAdvComboBox::ResetContent()
{
m_list.clear();
m_strEdit = _T("");
Invalidate();
}
void AFXAPI DDX_ACBIndex( CDataExchange* pDX, int nIDC, int& index )
{
/*HWND hWnd =*/ pDX->PrepareCtrl( nIDC );
if( pDX->m_bSaveAndValidate )
{
CAdvComboBox* pACB = (CAdvComboBox*)pDX->m_pDlgWnd->GetDlgItem( nIDC );
index = pACB->GetCurSel();
}
else
{
CAdvComboBox* pACB = (CAdvComboBox*)pDX->m_pDlgWnd->GetDlgItem( nIDC );
pACB->SetCurSel( index );
}
}
void AFXAPI DDX_ACBString( CDataExchange* pDX, int nIDC, CString& value )
{
/*HWND hWnd =*/ pDX->PrepareCtrl( nIDC );
if( pDX->m_bSaveAndValidate )
{
CAdvComboBox* pACB = (CAdvComboBox*)pDX->m_pDlgWnd->GetDlgItem( nIDC );
pACB->GetText( value );
}
else
{
CAdvComboBox* pACB = (CAdvComboBox*)pDX->m_pDlgWnd->GetDlgItem( nIDC );
pACB->SetText( value );
}
}
BOOL CAdvComboBox::GetItemDisabled( int nIndex )
{
if( nIndex > (int)m_list.size() )
return CB_ERR;
m_iter = m_list.begin();
advance( m_iter, nIndex );
return m_iter->bDisabled;
}
void CAdvComboBox::SetItemDisabled(int nIndex, BOOL bDisabled)
{
if( nIndex > (int)m_list.size() )
return;
m_iter = m_list.begin();
advance( m_iter, nIndex );
m_iter->bDisabled = bDisabled;
}
BOOL CAdvComboBox::GetItemChecked( int nIndex )
{
if( nIndex > (int)m_list.size() )
return CB_ERR;
m_iter = m_list.begin();
advance( m_iter, nIndex );
return m_iter->bChecked;
}
void CAdvComboBox::SetItemChecked(int nIndex, BOOL bChecked)
{
if( nIndex > (int)m_list.size() )
return;
m_iter = m_list.begin();
advance( m_iter, nIndex );
m_iter->bChecked = bChecked;
}
BOOL CAdvComboBox::PreTranslateMessage(MSG* pMsg)
{
if( pMsg->message == WM_KEYDOWN )
{
m_bAutoAppend = TRUE;
//XLISTCTRL_TRACE(_T("CAdvComboBox: Key was pressed(AdvComboBox)\n"));
if( pMsg->wParam == VK_RETURN )
{
// XLISTCTRL_TRACE(_T("CAdvComboBox: VK_RETURN\n"));
if( m_pDropWnd )
{
int nPos = m_pDropWnd->GetListBoxPtr()->GetCurSel();
if (nPos != LB_ERR) //+++
SendMessage( WM_SELECTED_ITEM, (WPARAM)nPos );
//else //+++
OnDestroyDropdownList(0,0); //+++
}
else
{
return CWnd::PreTranslateMessage(pMsg);
}
}
else
if( pMsg->wParam == VK_ESCAPE )
{
// XLISTCTRL_TRACE(_T("CAdvComboBox: VK_ESCAPE\n"));
if( m_pDropWnd )
{
OnDestroyDropdownList(0,0);
Invalidate();
}
else //+++
{
OnEscapeKey();
return CWnd::PreTranslateMessage(pMsg);
}
}
else
if( pMsg->wParam == VK_F4 )
{
SendMessage( WM_ON_DROPDOWN_BUTTON );
Invalidate();
}
else
if( pMsg->wParam == VK_UP )
{
SelPrevItem();
}
else
if( pMsg->wParam == VK_DOWN )
{
SelNextItem();
}
else
if( pMsg->wParam == VK_PRIOR ) //+++
{
SelPrevPage();
}
else
if( pMsg->wParam == VK_NEXT ) //+++
{
SelNextPage();
}
else
if( pMsg->wParam == VK_DELETE || pMsg->wParam == VK_BACK )
{
m_bAutoAppend = FALSE;
return CWnd::PreTranslateMessage(pMsg);
}
else
if( pMsg->wParam == VK_RIGHT )
{
if( m_dwACBStyle & ACBS_AUTOAPPEND )
{
// If the cursor is at the end of the text, show autosuggest text
if( m_pEdit )
{
int nS, nE;
m_pEdit->GetSel( nS, nE );
if( nS == nE && nS == m_pEdit->LineLength() )
{
OnUpdateEdit();
}
else
{
return CWnd::PreTranslateMessage(pMsg);
}
}
}
else
{
return CWnd::PreTranslateMessage(pMsg);
}
}
else
{
return CWnd::PreTranslateMessage(pMsg);
}
return TRUE;
}
else
if( pMsg->message == WM_SYSKEYDOWN )
{
if( pMsg->wParam == VK_DOWN ||
pMsg->wParam == VK_UP )
{
SendMessage( WM_ON_DROPDOWN_BUTTON );
Invalidate();
}
}
return CWnd::PreTranslateMessage(pMsg);
}
void CAdvComboBox::SelPrevItem()
{
if( m_pDropWnd )
{
int nPos = m_pDropWnd->GetListBoxPtr()->GetCurSel();
if( nPos > 0 )
{
m_pDropWnd->GetListBoxPtr()->SetCurSel( --nPos );
}
}
else
{
m_iter = m_list.begin();
advance( m_iter, m_nCurSel );
--m_iter;
int nOldSel = m_nCurSel;
int nPos = m_nCurSel;
while( m_iter != m_list.end() )
{
nPos--;
if( !m_iter->bDisabled )
{
m_strEdit = m_iter->strText;
if( m_pEdit )
m_pEdit->SetWindowText( m_strEdit.c_str() );
m_nCurSel = nPos;
Invalidate();
break;
}
--m_iter;
}
if( nOldSel != m_nCurSel )
{
// Send message to parent(dialog)
int nId = GetDlgCtrlID();
m_pParent->SendMessage( WM_COMMAND, MAKEWPARAM(nId,CBN_SELENDOK), (LPARAM)m_hWnd );
m_pParent->SendMessage( WM_COMMAND, MAKEWPARAM(nId,CBN_SELCHANGE), (LPARAM)m_hWnd );
}
}
}
void CAdvComboBox::SelNextItem()
{
if( m_pDropWnd )
{
int nPos = m_pDropWnd->GetListBoxPtr()->GetCurSel();
if( nPos < m_pDropWnd->GetListBoxPtr()->GetCount() )
{
m_pDropWnd->GetListBoxPtr()->SetCurSel( ++nPos );
}
}
else
{
m_iter = m_list.begin();
advance( m_iter, m_nCurSel );
++m_iter;
int nOldSel = m_nCurSel;
int nPos = m_nCurSel;
while( m_iter != m_list.end() )
{
nPos++;
if( !m_iter->bDisabled )
{
m_strEdit = m_iter->strText;
if( m_pEdit )
m_pEdit->SetWindowText( m_strEdit.c_str() );
Invalidate();
m_nCurSel = nPos;
break;
}
++m_iter;
}
if( nOldSel != m_nCurSel )
{
// Send message to parent(dialog)
int nId = GetDlgCtrlID();
m_pParent->SendMessage( WM_COMMAND, MAKEWPARAM(nId,CBN_SELENDOK), (LPARAM)m_hWnd );
m_pParent->SendMessage( WM_COMMAND, MAKEWPARAM(nId,CBN_SELCHANGE), (LPARAM)m_hWnd );
}
}
}
//+++
void CAdvComboBox::SelNextPage()
{
// XLISTCTRL_TRACE(_T("in CAdvComboBox::SelNextPage\n"));
if (m_pDropWnd)
{
CDropListBox * pListBox = m_pDropWnd->GetListBoxPtr();
ASSERT(pListBox);
int nPos = pListBox->GetCurSel();
int nCount = pListBox->GetCount();
int nMaxVisible = pListBox->GetMaxVisibleItems();
int nTop = pListBox->GetTopIndex();
if (nPos == LB_ERR) // no selection
nPos = 0;
else if (nPos == (nCount - 1)) // end of list
/*nPos = -1*/;
else if (nPos < (nTop + nMaxVisible - 1)) // middle of listbox window
nPos = nTop + nMaxVisible - 1;
else // at end of listbox window
nPos = nTop + nMaxVisible + nMaxVisible - 2;
if (nPos >= nCount) // moved past end, reset
nPos = nCount - 1;
pListBox->SetCurSel(nPos);
int nSel = pListBox->GetCurSel();
if (nSel == LB_ERR)
{
}
else
{
CString str = _T("");
pListBox->GetText(nSel, str);
SetWindowText(str);
}
}
else
{
// combo list not dropped
int nSize = m_list.size();
m_iter = m_list.begin();
if (m_nCurSel < 0 || m_nCurSel >= nSize)
m_nCurSel = 0;
advance(m_iter, m_nCurSel);
int nOldSel = m_nCurSel;
int nPos = m_nCurSel;
// Page Down goes forward by 10
for (int i = 0; i < 10; i++)
{
if (nPos >= (nSize-1))
{
nPos = nSize - 1;
break;
}
nPos++;
m_iter++;
}
if (nOldSel != nPos)
{
m_strEdit = m_iter->strText;
if (m_pEdit)
m_pEdit->SetWindowText(m_strEdit.c_str());
Invalidate();
m_nCurSel = nPos;
// Send message to parent(dialog)
int nId = GetDlgCtrlID();
m_pParent->SendMessage( WM_COMMAND, MAKEWPARAM(nId,CBN_SELENDOK), (LPARAM)m_hWnd );
m_pParent->SendMessage( WM_COMMAND, MAKEWPARAM(nId,CBN_SELCHANGE), (LPARAM)m_hWnd );
}
}
}
//+++
void CAdvComboBox::SelPrevPage()
{
if (m_pDropWnd)
{
CDropListBox * pListBox = m_pDropWnd->GetListBoxPtr();
ASSERT(pListBox);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -