⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 advcombobox.cpp

📁 主要是配合avr单片机的一个测试程序,里面有串口通讯,和listiew潜入控件
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		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 + -