📄 bcgptoolbarcomboboxbutton.cpp
字号:
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 + -