📄 atlctrlw.h
字号:
{
ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::OnCreate.\n"));
ATLASSERT(FALSE);
return -1;
}
if(s_pmapMsgHook == NULL)
{
ATLTRY(s_pmapMsgHook = new CMsgHookMap);
ATLASSERT(s_pmapMsgHook != NULL);
}
if(s_pmapMsgHook != NULL)
{
DWORD dwThreadID = ::GetCurrentThreadId();
_MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID);
if(pData == NULL)
{
ATLTRY(pData = new _MsgHookData);
ATLASSERT(pData != NULL);
#if (_ATL_VER >= 0x0700)
HHOOK hMsgHook = ::SetWindowsHookEx(WH_GETMESSAGE, MessageHookProc, ATL::_AtlBaseModule.GetModuleInstance(), dwThreadID);
#else // !(_ATL_VER >= 0x0700)
HHOOK hMsgHook = ::SetWindowsHookEx(WH_GETMESSAGE, MessageHookProc, _Module.GetModuleInstance(), dwThreadID);
#endif // !(_ATL_VER >= 0x0700)
ATLASSERT(hMsgHook != NULL);
if(pData != NULL && hMsgHook != NULL)
{
pData->hMsgHook = hMsgHook;
pData->dwUsage = 1;
BOOL bRet = s_pmapMsgHook->Add(dwThreadID, pData);
bRet;
ATLASSERT(bRet);
}
}
else
{
(pData->dwUsage)++;
}
}
lock.Unlock();
// Get layout
#if (WINVER >= 0x0500)
m_bLayoutRTL = ((GetExStyle() & WS_EX_LAYOUTRTL) != 0);
#endif // (WINVER >= 0x0500)
return lRet;
}
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
if(m_bAttachedMenu) // nothing to do in this mode
return lRet;
CWindowCreateCriticalSectionLock lock;
if(FAILED(lock.Lock()))
{
ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::OnDestroy.\n"));
ATLASSERT(FALSE);
return lRet;
}
if(s_pmapMsgHook != NULL)
{
DWORD dwThreadID = ::GetCurrentThreadId();
_MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID);
if(pData != NULL)
{
(pData->dwUsage)--;
if(pData->dwUsage == 0)
{
BOOL bRet = ::UnhookWindowsHookEx(pData->hMsgHook);
ATLASSERT(bRet);
bRet = s_pmapMsgHook->Remove(dwThreadID);
ATLASSERT(bRet);
if(bRet)
delete pData;
}
if(s_pmapMsgHook->GetSize() == 0)
{
delete s_pmapMsgHook;
s_pmapMsgHook = NULL;
}
}
}
lock.Unlock();
return lRet;
}
LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnKeyDown\n"));
#endif
bHandled = FALSE;
// Simulate Alt+Space for the parent
if(wParam == VK_SPACE)
{
m_wndParent.PostMessage(WM_SYSKEYDOWN, wParam, lParam | (1 << 29));
bHandled = TRUE;
}
#if (_WIN32_IE >= 0x0500)
else if(wParam == VK_LEFT || wParam == VK_RIGHT)
{
WPARAM wpNext = m_bLayoutRTL ? VK_LEFT : VK_RIGHT;
if(!m_bMenuActive)
{
T* pT = static_cast<T*>(this);
int nBtn = GetHotItem();
int nNextBtn = (wParam == wpNext) ? pT->GetNextMenuItem(nBtn) : pT->GetPreviousMenuItem(nBtn);
if(nNextBtn == -2)
{
SetHotItem(-1);
if(pT->DisplayChevronMenu())
bHandled = TRUE;
}
}
}
#endif // (_WIN32_IE >= 0x0500)
return 0;
}
LRESULT OnKeyUp(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnKeyUp\n"));
#endif
if(wParam != VK_SPACE)
bHandled = FALSE;
return 0;
}
LRESULT OnChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnChar\n"));
#endif
if(wParam != VK_SPACE)
bHandled = FALSE;
else
return 0;
// Security
if(!m_wndParent.IsWindowEnabled() || ::GetFocus() != m_hWnd)
return 0;
// Handle mnemonic press when we have focus
int nBtn = 0;
if(wParam != VK_RETURN && !MapAccelerator((TCHAR)LOWORD(wParam), nBtn))
{
#if (_WIN32_IE >= 0x0500)
if((TCHAR)LOWORD(wParam) != _chChevronShortcut)
#endif // (_WIN32_IE >= 0x0500)
::MessageBeep(0);
}
else
{
#if (_WIN32_IE >= 0x0500)
RECT rcClient = { 0 };
GetClientRect(&rcClient);
RECT rcBtn = { 0 };
GetItemRect(nBtn, &rcBtn);
TBBUTTON tbb = { 0 };
GetButton(nBtn, &tbb);
if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0 && rcBtn.right <= rcClient.right)
{
#endif // (_WIN32_IE >= 0x0500)
PostMessage(WM_KEYDOWN, VK_DOWN, 0L);
if(wParam != VK_RETURN)
SetHotItem(nBtn);
#if (_WIN32_IE >= 0x0500)
}
else
{
::MessageBeep(0);
bHandled = TRUE;
}
#endif // (_WIN32_IE >= 0x0500)
}
return 0;
}
LRESULT OnSysKeyDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnSysKeyDown\n"));
#endif
bHandled = FALSE;
return 0;
}
LRESULT OnSysKeyUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnSysKeyUp\n"));
#endif
bHandled = FALSE;
return 0;
}
LRESULT OnSysChar(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnSysChar\n"));
#endif
bHandled = FALSE;
return 0;
}
LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
if(m_bAttachedMenu || (m_dwExtendedStyle & CBR_EX_TRANSPARENT))
{
bHandled = FALSE;
return 0;
}
CDCHandle dc = (HDC)wParam;
RECT rect = { 0 };
GetClientRect(&rect);
dc.FillRect(&rect, COLOR_MENU);
return 1; // don't do the default erase
}
LRESULT OnInitMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
int nIndex = GetHotItem();
SendMessage(WM_MENUSELECT, MAKEWPARAM(nIndex, MF_POPUP|MF_HILITE), (LPARAM)m_hMenu);
bHandled = FALSE;
return 1;
}
LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if((BOOL)HIWORD(lParam)) // System menu, do nothing
{
bHandled = FALSE;
return 1;
}
if(!(m_bAttachedMenu || m_bMenuActive)) // Not attached or ours, do nothing
{
bHandled = FALSE;
return 1;
}
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnInitMenuPopup\n"));
#endif
// forward to the parent or subclassed window, so it can handle update UI
LRESULT lRet = 0;
if(m_bAttachedMenu)
lRet = DefWindowProc(uMsg, wParam, (lParam || m_bContextMenu) ? lParam : GetHotItem());
else
lRet = m_wndParent.DefWindowProc(uMsg, wParam, (lParam || m_bContextMenu) ? lParam : GetHotItem());
// Convert menu items to ownerdraw, add our data
if(m_bImagesVisible)
{
CMenuHandle menuPopup = (HMENU)wParam;
ATLASSERT(menuPopup.m_hMenu != NULL);
T* pT = static_cast<T*>(this);
pT; // avoid level 4 warning
TCHAR szString[pT->_nMaxMenuItemTextLength];
BOOL bRet = FALSE;
for(int i = 0; i < menuPopup.GetMenuItemCount(); i++)
{
CMenuItemInfo mii;
mii.cch = pT->_nMaxMenuItemTextLength;
mii.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE;
mii.dwTypeData = szString;
bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii);
ATLASSERT(bRet);
if(!(mii.fType & MFT_OWNERDRAW)) // Not already an ownerdraw item
{
mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE;
_MenuItemData* pMI = NULL;
ATLTRY(pMI = new _MenuItemData);
ATLASSERT(pMI != NULL);
if(pMI != NULL)
{
pMI->fType = mii.fType;
pMI->fState = mii.fState;
mii.fType |= MFT_OWNERDRAW;
pMI->iButton = -1;
for(int j = 0; j < m_arrCommand.GetSize(); j++)
{
if(m_arrCommand[j] == mii.wID)
{
pMI->iButton = j;
break;
}
}
pMI->lpstrText = NULL;
ATLTRY(pMI->lpstrText = new TCHAR[lstrlen(szString) + 1]);
ATLASSERT(pMI->lpstrText != NULL);
if(pMI->lpstrText != NULL)
lstrcpy(pMI->lpstrText, szString);
mii.dwItemData = (ULONG_PTR)pMI;
bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii);
ATLASSERT(bRet);
}
}
}
// Add it to the list
m_stackMenuHandle.Push(menuPopup.m_hMenu);
}
return lRet;
}
LRESULT OnMenuSelect(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if(!m_bAttachedMenu) // Not attached, do nothing, forward to parent
{
m_bPopupItem = (lParam != NULL) && ((HMENU)lParam != m_hMenu) && (HIWORD(wParam) & MF_POPUP);
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, _T("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 = NULL;
while((hMenu = m_stackMenuHandle.Pop()) != NULL)
{
CMenuHandle menuPopup = hMenu;
ATLASSERT(menuPopup.m_hMenu != NULL);
// Restore state and delete menu item data
BOOL bRet = FALSE;
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;
T* pT = static_cast<T*>(this);
pT->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((LPVOID)wParam != NULL)
*((DWORD*)wParam) = GetCurrentProcessId();
if(IsWindowVisible())
return (LRESULT)static_cast<CCommandBarCtrlBase*>(this);
else
return NULL;
}
LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
#ifndef SPI_GETKEYBOARDCUES
const UINT SPI_SETKEYBOARDCUES = 0x100B;
#endif // !SPI_GETKEYBOARDCUES
#ifndef SPI_GETFLATMENU
const UINT SPI_SETFLATMENU = 0x1023;
#endif // !SPI_GETFLATMENU
if(wParam == SPI_SETNONCLIENTMETRICS || wParam == SPI_SETKEYBOARDCUES || wParam == SPI_SETFLATMENU)
{
T* pT = static_cast<T*>(this);
pT->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, _T("CmdBar - OnMenuChar\n"));
#endif
bHandled = TRUE;
T* pT = static_cast<T*>(this);
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 = FALSE;
TCHAR szString[pT->_nMaxMenuItemTextLength];
WORD wMnem = 0;
bool bFound = false;
for(int i = 0; i < nCount; i++)
{
CMenuItemInfo mii;
mii.cch = pT->_nMaxMenuItemTextLength;
mii.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE;
mii.dwTypeData = szString;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -