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

📄 bcgptoolbarcomboboxbutton.cpp

📁 远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
void CBCGPToolbarComboBoxButton::OnShow (BOOL bShow)
{
	if (m_pWndCombo->GetSafeHwnd () != NULL)
	{
		if (bShow && m_bHorz)
		{
			OnMove ();
			m_pWndCombo->ShowWindow (m_bFlat ? SW_HIDE : SW_SHOWNOACTIVATE);
		}
		else
		{
			m_pWndCombo->ShowWindow (SW_HIDE);
		}
	}

	if (m_pWndEdit->GetSafeHwnd () != NULL)
	{
		if (bShow && m_bHorz)
		{
			m_pWndEdit->ShowWindow (SW_SHOWNOACTIVATE);
		}
		else
		{
			m_pWndEdit->ShowWindow (SW_HIDE);
		}
	}
}
//*************************************************************************************
BOOL CBCGPToolbarComboBoxButton::ExportToMenuButton (CBCGPToolbarMenuButton& menuButton) const
{
	CString strMessage;
	int iOffset;

	if (strMessage.LoadString (m_nID) &&
		(iOffset = strMessage.Find (_T('\n'))) != -1)
	{
		menuButton.m_strText = strMessage.Mid (iOffset + 1);
	}

	return TRUE;
}
//*********************************************************************************
void CBCGPToolbarComboBoxButton::SetDropDownHeight (int nHeight)
{
	if (m_nDropDownHeight == nHeight)
	{
		return;
	}

	m_nDropDownHeight = nHeight;
	OnMove ();
}
//*********************************************************************************
void CBCGPToolbarComboBoxButton::SetText (LPCTSTR lpszText)
{
	ASSERT (lpszText != NULL);
	
	if (!SelectItem (lpszText))
	{
		// m_strEdit = lpszText; // fixed a bug by scaton

		if (m_pWndCombo != NULL && !m_bFlat)
		{
			CString strText;
			m_pWndCombo->GetWindowText(strText);

			if (strText != lpszText)
			{
				m_pWndCombo->SetWindowText(lpszText);
				NotifyCommand (CBN_EDITCHANGE);
			}
		}

		if (m_pWndEdit != NULL)
		{
			CString strText;
			m_pWndEdit->GetWindowText(strText);

			if (strText != lpszText)
			{
				m_pWndEdit->SetWindowText (lpszText);
			}
		}

		// because SetWindowText() can cause CBN_EDITCHANGE notify,
		// m_strEdit will be restored to old text -> strText after it's called
		// so we move code here from above
		m_strEdit = lpszText;
	}
}
//*********************************************************************************
CBCGPToolbarComboBoxButton* CBCGPToolbarComboBoxButton::GetByCmd (UINT uiCmd,
																BOOL bIsFocus)
{
	CBCGPToolbarComboBoxButton* pSrcCombo = NULL;

	CObList listButtons;
	if (CBCGPToolBar::GetCommandButtons (uiCmd, listButtons) > 0)
	{
		for (POSITION posCombo= listButtons.GetHeadPosition (); posCombo != NULL;)
		{
			CBCGPToolbarComboBoxButton* pCombo = DYNAMIC_DOWNCAST (CBCGPToolbarComboBoxButton, listButtons.GetNext (posCombo));
			ASSERT (pCombo != NULL);

			if (pCombo != NULL && (!bIsFocus || pCombo->HasFocus ()))
			{
				pSrcCombo = pCombo;
				break;
			}
		}
	}

	return pSrcCombo;
}
//*********************************************************************************
BOOL CBCGPToolbarComboBoxButton::SelectItemAll (UINT uiCmd, int iIndex)
{
	CBCGPToolbarComboBoxButton* pSrcCombo = GetByCmd (uiCmd);

	if (pSrcCombo)
	{
		pSrcCombo->SelectItem (iIndex);
	}

	return pSrcCombo != NULL;
}
//*********************************************************************************
BOOL CBCGPToolbarComboBoxButton::SelectItemAll (UINT uiCmd, DWORD dwData)
{
	CBCGPToolbarComboBoxButton* pSrcCombo = GetByCmd (uiCmd);

	if (pSrcCombo)
	{
		pSrcCombo->SelectItem (dwData);
	}

	return pSrcCombo != NULL;
}
//*********************************************************************************
BOOL CBCGPToolbarComboBoxButton::SelectItemAll (UINT uiCmd, LPCTSTR lpszText)
{
	CBCGPToolbarComboBoxButton* pSrcCombo = GetByCmd (uiCmd);

	if (pSrcCombo)
	{
		pSrcCombo->SelectItem (lpszText);
	}

	return pSrcCombo != NULL;
}
//*********************************************************************************
int CBCGPToolbarComboBoxButton::GetCountAll (UINT uiCmd)
{
	CBCGPToolbarComboBoxButton* pSrcCombo = GetByCmd (uiCmd);

	if (pSrcCombo)
	{
		return pSrcCombo->GetCount ();
	}

	return CB_ERR;
}
//*********************************************************************************
int CBCGPToolbarComboBoxButton::GetCurSelAll (UINT uiCmd)
{
	CBCGPToolbarComboBoxButton* pSrcCombo = GetByCmd (uiCmd);

	if (pSrcCombo)
	{
		return pSrcCombo->GetCurSel ();
	}

	return CB_ERR;
}
//*********************************************************************************
LPCTSTR CBCGPToolbarComboBoxButton::GetItemAll (UINT uiCmd, int iIndex)
{
	CBCGPToolbarComboBoxButton* pSrcCombo = GetByCmd (uiCmd);

	if (pSrcCombo)
	{
		return pSrcCombo->GetItem (iIndex);
	}

	return NULL;
}
//*********************************************************************************
DWORD CBCGPToolbarComboBoxButton::GetItemDataAll (UINT uiCmd, int iIndex)
{
	CBCGPToolbarComboBoxButton* pSrcCombo = GetByCmd (uiCmd);

	if (pSrcCombo)
	{
		return pSrcCombo->GetItemData (iIndex);
	}

	return (DWORD)CB_ERR;
}
//*********************************************************************************
void* CBCGPToolbarComboBoxButton::GetItemDataPtrAll (UINT uiCmd, int iIndex)
{
	CBCGPToolbarComboBoxButton* pSrcCombo = GetByCmd (uiCmd);

	if (pSrcCombo)
	{
		return pSrcCombo->GetComboBox ()->GetItemDataPtr (iIndex);
	}

	return NULL;
}
//*********************************************************************************
LPCTSTR CBCGPToolbarComboBoxButton::GetTextAll (UINT uiCmd)
{
	CBCGPToolbarComboBoxButton* pSrcCombo = GetByCmd (uiCmd);

	if (pSrcCombo)
	{
		return pSrcCombo->GetText ();
	}

	return NULL;
}
//*********************************************************************************
void CBCGPToolbarComboBoxButton::SetStyle (UINT nStyle)
{
	CBCGPToolbarButton::SetStyle (nStyle);

	BOOL bDisabled = (CBCGPToolBar::IsCustomizeMode () && !IsEditable ()) ||
		(!CBCGPToolBar::IsCustomizeMode () && (m_nStyle & TBBS_DISABLED));


	if (m_pWndCombo != NULL && m_pWndCombo->GetSafeHwnd () != NULL)
	{
		m_pWndCombo->EnableWindow (!bDisabled);
		m_pWndCombo->RedrawWindow ();
	}

	if (m_pWndEdit != NULL && m_pWndEdit->GetSafeHwnd () != NULL)
	{
		m_pWndEdit->EnableWindow (!bDisabled);
		m_pWndEdit->RedrawWindow ();
	}
}
//*******************************************************************************
BOOL CBCGPToolbarComboBoxButton::HasFocus () const
{
	if (m_pWndCombo == NULL)
	{
		return FALSE;
	}

	CWnd* pWndFocus = CWnd::GetFocus ();

	if (m_pWndCombo->GetDroppedState () ||
		pWndFocus == m_pWndCombo || m_pWndCombo->IsChild (pWndFocus))
	{
		return TRUE;
	}

	if (m_pWndEdit == NULL)
	{
		return FALSE;
	}

	return pWndFocus == m_pWndEdit || m_pWndEdit->IsChild (pWndFocus);
}

/////////////////////////////////////////////////////////////////////////////
// CBCGPComboEdit

CBCGPComboEdit::CBCGPComboEdit(CBCGPToolbarComboBoxButton& combo) :
	m_combo (combo)
{
	m_bTracked = FALSE;
}

CBCGPComboEdit::~CBCGPComboEdit()
{
}


BEGIN_MESSAGE_MAP(CBCGPComboEdit, CEdit)
	//{{AFX_MSG_MAP(CBCGPComboEdit)
	ON_WM_SETFOCUS()
	ON_WM_KILLFOCUS()
	ON_CONTROL_REFLECT(EN_CHANGE, OnChange)
	ON_WM_MOUSEMOVE()
	ON_WM_CONTEXTMENU()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBCGPComboEdit message handlers

BOOL CBCGPComboEdit::PreTranslateMessage(MSG* pMsg) 
{
	if (pMsg->message == WM_KEYDOWN)
	{
		if ((GetKeyState(VK_MENU) >= 0) && (GetKeyState(VK_CONTROL) >= 0) &&
			m_combo.GetComboBox () != NULL)
		{
			switch (pMsg->wParam)
			{
			case VK_UP:
			case VK_DOWN:
			case VK_HOME:
			case VK_END:
			case VK_NEXT:
			case VK_PRIOR:
				if (!m_combo.GetComboBox ()->GetDroppedState ())
				{
					break;
				}

			case VK_RETURN:
				SetFocus ();

				if (m_combo.GetComboBox ()->GetDroppedState ())
				{
					m_combo.GetComboBox ()->SendMessage (pMsg->message, pMsg->wParam, pMsg->lParam);
				}
				else if (m_combo.GetComboBox ()->GetOwner () != NULL)
				{
					GetWindowText (m_combo.m_strEdit);

					m_combo.GetComboBox ()->GetOwner ()->PostMessage (
						WM_COMMAND, MAKEWPARAM (m_combo.m_nID, 0),
						(LPARAM) m_combo.GetComboBox ()->GetSafeHwnd ());
				}

				return TRUE;
			}
		}

		switch (pMsg->wParam)
		{
		case VK_TAB:
			if (GetParent () != NULL)
			{
				ASSERT_VALID (GetParent ());
				GetParent ()->GetNextDlgTabItem (this)->SetFocus ();
				return TRUE;
			}
			break;

		case VK_ESCAPE:
			if (m_combo.GetComboBox () != NULL)
			{
				m_combo.GetComboBox ()->ShowDropDown (FALSE);
			}

			if (GetTopLevelFrame () != NULL)
			{
				GetTopLevelFrame ()->SetFocus ();
				return TRUE;
			}
			
			break;

		case VK_UP:
		case VK_DOWN:
			if ((GetKeyState(VK_MENU) >= 0) && (GetKeyState(VK_CONTROL) >=0) &&
				m_combo.GetComboBox () != NULL)
			{
				if (!m_combo.GetComboBox ()->GetDroppedState())
				{
					m_combo.GetComboBox ()->ShowDropDown();

					if (m_combo.GetComboBox ()->GetParent () != NULL)
					{
						m_combo.GetComboBox ()->GetParent ()->InvalidateRect (m_combo.m_rectCombo);
					}
				}
				return TRUE;
			}
		}
	}

	return CEdit::PreTranslateMessage(pMsg);
}

void CBCGPComboEdit::OnSetFocus(CWnd* pOldWnd) 
{
	CEdit::OnSetFocus(pOldWnd);
	m_combo.SetHotEdit ();
	m_combo.NotifyCommand (CBN_SETFOCUS);
}

void CBCGPComboEdit::OnKillFocus(CWnd* pNewWnd) 
{
	CEdit::OnKillFocus(pNewWnd);

	if (::IsWindow (m_combo.GetHwnd()))
	{
		m_combo.SetHotEdit (FALSE);
		m_combo.NotifyCommand (CBN_KILLFOCUS);
	}
}

void CBCGPComboEdit::OnChange() 
{
	m_combo.NotifyCommand (CBN_EDITCHANGE);
}
//*************************************************************************************
void CBCGPComboEdit::OnMouseMove(UINT nFlags, CPoint point) 
{
	CEdit::OnMouseMove(nFlags, point);
	m_combo.SetHotEdit ();

	if (!m_bTracked)
	{
		m_bTracked = TRUE;
		
		TRACKMOUSEEVENT trackmouseevent;
		trackmouseevent.cbSize = sizeof(trackmouseevent);
		trackmouseevent.dwFlags = TME_LEAVE;
		trackmouseevent.hwndTrack = GetSafeHwnd();
		trackmouseevent.dwHoverTime = HOVER_DEFAULT;
		::BCGPTrackMouse (&trackmouseevent);
	}
}
//*****************************************************************************************
afx_msg LRESULT CBCGPComboEdit::OnMouseLeave(WPARAM,LPARAM)
{
	m_bTracked = FALSE;

	if (CWnd::GetFocus () != this)
	{
		m_combo.SetHotEdit (FALSE);
	}

	return 0;
}
//********************************************************************************
void CBCGPComboEdit::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	if (m_combo.m_uiMenuResID != 0)
	{

		CWnd* pWndParent = pWnd->GetParent();

		HINSTANCE hInst = AfxFindResourceHandle (
		MAKEINTRESOURCE (m_combo.m_uiMenuResID), RT_MENU);

		if (hInst == NULL)
		{
			CEdit::OnContextMenu(pWnd, point) ;
			return;

		}

		HMENU hMenu = ::LoadMenu (hInst, MAKEINTRESOURCE (m_combo.m_uiMenuResID));
		if (hMenu == NULL)
		{
			CEdit::OnContextMenu(pWnd, point) ;
			return;
		}

		HMENU hPopupMenu = ::GetSubMenu(hMenu, 0);

		if (hPopupMenu == NULL)
		{
			CEdit::OnContextMenu(pWnd, point) ;
			return;
		}

		if (g_pContextMenuManager != NULL)
		{
			g_pContextMenuManager->ShowPopupMenu (hPopupMenu, 
									point.x, point.y, pWndParent);

		}
		else
		{
			 ::TrackPopupMenu (hPopupMenu, 
				TPM_CENTERALIGN | TPM_LEFTBUTTON, 
				point.x, point.y, 0, pWndParent->GetSafeHwnd (), NULL);
		}
	}
	else
	{
		CEdit::OnContextMenu(pWnd, point) ;
	}
}
//*****************************************************************************************
int CBCGPToolbarComboBoxButton::AddSortedItem(LPCTSTR lpszItem, DWORD dwData)
{
	ASSERT (lpszItem != NULL);

	if (m_strEdit.IsEmpty ())
	{
		m_strEdit = lpszItem;
		if (m_pWndEdit != NULL)
		{
			m_pWndEdit->SetWindowText (m_strEdit);
		}
	}

	int nIndex = 0;
	BOOL bInserted = FALSE;
	if (m_lstItems.Find (lpszItem) == NULL)
	{
		for (nIndex =0; nIndex < m_lstItems.GetCount (); nIndex++)
		{
			POSITION pos = m_lstItems.FindIndex (nIndex);
			LPCTSTR str = (LPCTSTR) m_lstItems.GetAt (pos);
			if (Compare (lpszItem, str) < 0)
			{
				m_lstItems.InsertBefore (pos, lpszItem);
				POSITION posData = m_lstItemData.FindIndex (nIndex);
				m_lstItemData.InsertBefore (posData, dwData);
				bInserted = TRUE;
				break;
			};
		}

		if (!bInserted)
		{
			m_lstItems.AddTail (lpszItem);
			m_lstItemData.AddTail (dwData);
		}		
	}
		
	if (m_pWndCombo->GetSafeHwnd () != NULL)
	{
		int iIndex = m_pWndCombo->FindStringExact (-1, lpszItem);

		if (iIndex == CB_ERR)
		{
			iIndex = m_pWndCombo->AddString (lpszItem);
		}

		m_pWndCombo->SetCurSel (iIndex);
		m_pWndCombo->SetItemData (iIndex, dwData);
		m_pWndCombo->SetEditSel (-1, 0);
	}

	if (bInserted)
	{
		return nIndex;
	}

	return m_lstItems.GetCount () - 1;

}
//*****************************************************************************************
int CBCGPToolbarComboBoxButton::Compare(LPCTSTR lpszItem1, LPCTSTR lpszItem2)
{
	return _tcscmp(lpszItem1, lpszItem2);
}
//*****************************************************************************************
void CBCGPToolbarComboBoxButton::OnGlobalFontsChanged()
{
	CBCGPToolbarButton::OnGlobalFontsChanged ();

	if (m_pWndEdit->GetSafeHwnd () != NULL)
	{
		m_pWndEdit->SetFont (&globalData.fontRegular);
	}

	if (m_pWndCombo->GetSafeHwnd () != NULL)
	{
		m_pWndCombo->SetFont (&globalData.fontRegular);
	}
}
//*********************************************************************************
BOOL CBCGPToolbarComboBoxButton::OnUpdateToolTip (CWnd* pWndParent, int iButtonIndex,
												  CToolTipCtrl& wndToolTip, CString& strTipText)
{
	if (!m_bHorz)
	{
		return FALSE;
	}

	CString strTips;

	if (OnGetCustomToolTipText (strTips))
	{
		strTipText = strTips;
	}

	if (CBCGPToolbarComboBoxButton::IsFlatMode ())
	{
		CComboBox* pCombo = GetComboBox ();

		if (pCombo != NULL && (pCombo->GetStyle () & CBS_DROPDOWNLIST) == CBS_DROPDOWN)
		{
			CEdit* pEdit = GetEditCtrl ();
			if (pEdit != NULL)
			{
				wndToolTip.AddTool (pEdit, strTipText, NULL, 0);
			}
		}
		else
		{
			wndToolTip.AddTool (pWndParent, strTipText, Rect (), iButtonIndex + 1); 
		}
	}
	else
	{
		CComboBox* pCombo = GetComboBox ();
		if (pCombo != NULL)
		{
			wndToolTip.AddTool (pCombo, strTipText, NULL, 0);
		}
	}

	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -