📄 cmdbar.h
字号:
if(m_wndParent.IsWindow())
m_wndParent.SendMessage(uMsg, wParam, lParam);
bHandled = FALSE;
return 1;
}
// Check if a menu is closing, do a cleanup
if(HIWORD(wParam) == 0xFFFF && lParam == NULL) // Menu closing
{
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, "CmdBar - OnMenuSelect - CLOSING!!!!\n");
#endif
ATLASSERT(m_stackMenuWnd.GetSize() == 0);
// Restore the menu items to the previous state for all menus that were converted
if(m_bImagesVisible)
{
HMENU hMenu;
while((hMenu = m_stackMenuHandle.Pop()) != NULL)
{
CMenuHandle menuPopup = hMenu;
ATLASSERT(menuPopup.m_hMenu != NULL);
// Restore state and delete menu item data
BOOL bRet;
for(int i = 0; i < menuPopup.GetMenuItemCount(); i++)
{
CMenuItemInfo mii;
mii.fMask = MIIM_DATA | MIIM_TYPE;
bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii);
ATLASSERT(bRet);
_MenuItemData* pMI = (_MenuItemData*)mii.dwItemData;
if(pMI != NULL && pMI->IsCmdBarMenuItem())
{
mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE;
mii.fType = pMI->fType;
mii.dwTypeData = pMI->lpstrText;
mii.cch = lstrlen(pMI->lpstrText);
mii.dwItemData = NULL;
bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii);
ATLASSERT(bRet);
delete [] pMI->lpstrText;
pMI->dwMagic = 0x6666;
delete pMI;
}
}
}
}
}
bHandled = FALSE;
return 1;
}
LRESULT OnInternalAutoPopup(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
int nIndex = (int)wParam;
DoPopupMenu(nIndex, false);
return 0;
}
LRESULT OnInternalGetBar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
// Let's make sure we're not embedded in another process
if(wParam && !::IsBadWritePtr((LPVOID)wParam, sizeof DWORD))
*((DWORD*)wParam) = GetCurrentProcessId();
if(IsWindowVisible())
return (LRESULT)static_cast<CCommandBarCtrlBase*>(this);
else
return NULL;
}
LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
GetSystemSettings();
return 0;
}
LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
LPWINDOWPOS lpWP = (LPWINDOWPOS)lParam;
int cyMin = ::GetSystemMetrics(SM_CYMENU);
if(lpWP->cy < cyMin)
lpWP->cy = cyMin;
return lRet;
}
LRESULT OnMenuChar(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, "CmdBar - OnMenuChar\n");
#endif
bHandled = TRUE;
LRESULT lRet;
if(m_bMenuActive && LOWORD(wParam) != 0x0D)
lRet = 0;
else
lRet = MAKELRESULT(1, 1);
if(m_bMenuActive && HIWORD(wParam) == MF_POPUP)
{
// Convert character to lower/uppercase and possibly Unicode, using current keyboard layout
TCHAR ch = (TCHAR)LOWORD(wParam);
CMenuHandle menu = (HMENU)lParam;
int nCount = ::GetMenuItemCount(menu);
int nRetCode = MNC_EXECUTE;
BOOL bRet;
TCHAR szString[_nMaxMenuItemTextLength];
WORD wMnem = 0;
bool bFound = false;
for(int i = 0; i < nCount; i++)
{
CMenuItemInfo mii;
mii.cch = _nMaxMenuItemTextLength;
mii.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE;
mii.dwTypeData = szString;
bRet = menu.GetMenuItemInfo(i, TRUE, &mii);
if(!bRet || (mii.fType & MFT_SEPARATOR))
continue;
_MenuItemData* pmd = (_MenuItemData*)mii.dwItemData;
if(pmd != NULL && pmd->IsCmdBarMenuItem())
{
LPTSTR p = pmd->lpstrText;
if(p != NULL)
{
while(*p && *p != _T('&'))
p = ::CharNext(p);
if(p != NULL && *p)
{
TCHAR szP[2] = { *(++p), 0 };
TCHAR szC[2] = { ch, 0 };
if(p != NULL && ::CharLower(szP) == ::CharLower(szC))
{
if(!bFound)
{
wMnem = (WORD)i;
bFound = true;
PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
GiveFocusBack();
}
else
{
nRetCode = MNC_SELECT;
break;
}
}
}
}
}
}
if(bFound)
{
bHandled = TRUE;
lRet = MAKELRESULT(wMnem, nRetCode);
}
}
else if(!m_bMenuActive)
{
UINT nID;
if(0 == SendMessage(TB_MAPACCELERATOR, LOWORD(wParam), (LPARAM)&nID))
{
bHandled = FALSE;
PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
GiveFocusBack();
}
else if(m_wndParent.IsWindowEnabled())
{
TakeFocus();
PostMessage(WM_KEYDOWN, VK_DOWN, 0L);
SetHotItem(nID);
}
}
return lRet;
}
LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
{
LPDRAWITEMSTRUCT lpDrawItemStruct = (LPDRAWITEMSTRUCT)lParam;
_MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData;
if(lpDrawItemStruct->CtlType == ODT_MENU && pmd->IsCmdBarMenuItem())
DrawItem(lpDrawItemStruct);
else
bHandled = FALSE;
return (LRESULT)TRUE;
}
LRESULT OnMeasureItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
{
LPMEASUREITEMSTRUCT lpMeasureItemStruct = (LPMEASUREITEMSTRUCT)lParam;
_MenuItemData* pmd = (_MenuItemData*)lpMeasureItemStruct->itemData;
if(lpMeasureItemStruct->CtlType == ODT_MENU && pmd->IsCmdBarMenuItem())
MeasureItem(lpMeasureItemStruct);
else
bHandled = FALSE;
return (LRESULT)TRUE;
}
// API message handlers
LRESULT OnAPIGetMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
return (LRESULT)m_hMenu;
}
LRESULT OnAPITrackPopupMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
if(lParam == NULL)
return FALSE;
LPCBRPOPUPMENU lpCBRPopupMenu = (LPCBRPOPUPMENU)lParam;
if(lpCBRPopupMenu->cbSize != sizeof(CBRPOPUPMENU))
return FALSE;
if(!::IsMenu(lpCBRPopupMenu->hMenu))
return FALSE;
m_bContextMenu = true;
return DoTrackPopupMenu(lpCBRPopupMenu->hMenu, lpCBRPopupMenu->uFlags, lpCBRPopupMenu->x, lpCBRPopupMenu->y, lpCBRPopupMenu->lptpm);
}
LRESULT OnAPIGetCmdBar(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
return (LRESULT)m_hWnd;
}
// Parent window message handlers
// Do not hot track if application in background, OK for modeless dialogs
LRESULT OnParentHotItemChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
{
DWORD dwProcessID;
::GetWindowThreadProcessId(::GetActiveWindow(), &dwProcessID);
LPNMTBHOTITEM lpNMHT = (LPNMTBHOTITEM)pnmh;
// Check if this comes from us
if(pnmh->hwndFrom != m_hWnd)
{
bHandled = FALSE;
return 0;
}
if((!m_wndParent.IsWindowEnabled() || ::GetCurrentProcessId() != dwProcessID) && lpNMHT->dwFlags & HICF_MOUSE)
return 1;
else
{
bHandled = FALSE;
// Send WM_MENUSELECT to the app if it needs to display a status text
if(!(lpNMHT->dwFlags & HICF_MOUSE)
&& !(lpNMHT->dwFlags & HICF_ACCELERATOR)
&& !(lpNMHT->dwFlags & HICF_LMOUSE))
{
if(lpNMHT->dwFlags & HICF_ENTERING)
m_wndParent.SendMessage(WM_MENUSELECT, 0, (LPARAM)m_hMenu);
if(lpNMHT->dwFlags & HICF_LEAVING)
m_wndParent.SendMessage(WM_MENUSELECT, MAKEWPARAM(0, 0xFFFF), NULL);
}
return 0;
}
}
LRESULT OnParentDropDown(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
{
// Check if this comes from us
if(pnmh->hwndFrom != m_hWnd)
{
bHandled = FALSE;
return 1;
}
if(::GetFocus() != m_hWnd)
TakeFocus();
LPNMTOOLBAR pNMToolBar = (LPNMTOOLBAR)pnmh;
int nIndex = CommandToIndex(pNMToolBar->iItem);
m_bContextMenu = false;
m_bEscapePressed = false;
DoPopupMenu(nIndex, true);
return TBDDRET_DEFAULT;
}
LRESULT OnParentInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
return OnInitMenuPopup(uMsg, wParam, lParam, bHandled);
}
LRESULT OnParentSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
return OnSettingChange(uMsg, wParam, lParam, bHandled);
}
LRESULT OnParentInternalGetBar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
return OnInternalGetBar(uMsg, wParam, lParam, bHandled);
}
LRESULT OnParentSysCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
bHandled = FALSE;
if((m_uSysKey == VK_MENU
|| (m_uSysKey == VK_F10 && !(::GetKeyState(VK_SHIFT) & 0x80))
|| m_uSysKey == VK_SPACE)
&& wParam == SC_KEYMENU)
{
if(::GetFocus() == m_hWnd)
{
GiveFocusBack(); // exit menu "loop"
PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
}
else if(m_uSysKey != VK_SPACE && !m_bSkipMsg)
{
TakeFocus(); // enter menu "loop"
bHandled = TRUE;
}
else if(m_uSysKey != VK_SPACE)
{
bHandled = TRUE;
}
}
m_bSkipMsg = false;
return 0;
}
LRESULT OnParentAPIGetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
return OnAPIGetMenu(uMsg, wParam, lParam, bHandled);
}
LRESULT OnParentMenuChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
return OnMenuChar(uMsg, wParam, lParam, bHandled);
}
LRESULT OnParentAPITrackPopupMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
return OnAPITrackPopupMenu(uMsg, wParam, lParam, bHandled);
}
LRESULT OnParentAPIGetCmdBar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
return OnAPIGetCmdBar(uMsg, wParam, lParam, bHandled);
}
LRESULT OnParentDrawItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
return OnDrawItem(uMsg, wParam, lParam, bHandled);
}
LRESULT OnParentMeasureItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
return OnMeasureItem(uMsg, wParam, lParam, bHandled);
}
// MDI client window message handlers
LRESULT OnMDISetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
m_wndMDIClient.DefWindowProc(uMsg, NULL, lParam);
HMENU hOldMenu = GetMenu();
BOOL bRet = AttachMenu((HMENU)wParam);
bRet;
ATLASSERT(bRet);
return (LRESULT)hOldMenu;
}
// Message hook handlers
LRESULT OnHookMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
static POINT s_point = { -1, -1 };
DWORD dwPoint = ::GetMessagePos();
POINT point = { GET_X_LPARAM(dwPoint), GET_Y_LPARAM(dwPoint) };
bHandled = FALSE;
if(m_bMenuActive)
{
if(::WindowFromPoint(point) == m_hWnd)
{
ScreenToClient(&point);
int nHit = HitTest(&point);
if((point.x != s_point.x || point.y != s_point.y) && nHit >= 0 && nHit < ::GetMenuItemCount(m_hMenu) && nHit != m_nPopBtn && m_nPopBtn != -1)
{
m_nNextPopBtn = nHit | 0xFFFF0000;
HWND hWndMenu = m_stackMenuWnd.GetCurrent();
ATLASSERT(hWndMenu != NULL);
// this one is needed to close a menu if mouse button was down
::PostMessage(hWndMenu, WM_LBUTTONUP, 0, MAKELPARAM(point.x, point.y));
// this one closes a popup menu
::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L);
bHandled = TRUE;
}
}
}
else
{
ScreenToClient(&point);
}
s_point = point;
return 0;
}
LRESULT OnHookSysKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
bHandled = FALSE;
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, "CmdBar - Hook WM_SYSKEYDOWN (0x%2.2X)\n", wParam);
#endif
if(wParam != VK_SPACE && (!m_bMenuActive && ::GetFocus() == m_hWnd) || m_bMenuActive)
{
PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
GiveFocusBack();
if(!m_bMenuActive)
m_bSkipMsg = true;
}
else
{
m_uSysKey = (UINT)wParam;
}
return 0;
}
LRESULT OnHookSysKeyUp(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
bHandled = FALSE;
wParam;
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, "CmdBar - Hook WM_SYSKEYUP (0x%2.2X)\n", wParam);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -