📄 cmdbar.h
字号:
if(bmp.m_hBitmap == NULL)
return FALSE;
return ReplaceBitmap(bmp, nCommandID);
}
BOOL ReplaceBitmap(HBITMAP hBitmap, UINT nCommandID)
{
BOOL bRet = FALSE;
for(int i = 0; i < m_arrCommand.GetSize(); i++)
{
if(m_arrCommand[i] == nCommandID)
{
bRet = ::ImageList_Remove(m_hImageList, i);
if(bRet)
m_arrCommand.RemoveAt(i);
break;
}
}
if(bRet)
bRet = AddBitmap(hBitmap, nCommandID);
return bRet;
}
BOOL ReplaceIcon(HICON hIcon, UINT nCommandID)
{
BOOL bRet = FALSE;
for(int i = 0; i < m_arrCommand.GetSize(); i++)
{
if(m_arrCommand[i] == nCommandID)
{
bRet = (::ImageList_ReplaceIcon(m_hImageList, i, hIcon) != -1);
break;
}
}
return bRet;
}
BOOL RemoveImage(int nCommandID)
{
ATLASSERT(::IsWindow(m_hWnd));
BOOL bRet = FALSE;
for(int i = 0; i < m_arrCommand.GetSize(); i++)
{
if(m_arrCommand[i] == nCommandID)
{
bRet = ::ImageList_Remove(m_hImageList, i);
if(bRet)
m_arrCommand.RemoveAt(i);
break;
}
}
return bRet;
}
BOOL RemoveAllImages()
{
ATLASSERT(::IsWindow(m_hWnd));
ATLTRACE2(atlTraceUI, 0, "CmdBar - Removing all images\n");
BOOL bRet = ::ImageList_RemoveAll(m_hImageList);
if(bRet)
m_arrCommand.RemoveAll();
return bRet;
}
BOOL TrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, LPTPMPARAMS lpParams = NULL)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(::IsMenu(hMenu));
if(!::IsMenu(hMenu))
return FALSE;
m_bContextMenu = true;
return DoTrackPopupMenu(hMenu, uFlags, x, y, lpParams);
}
// NOTE: Limited support for MDI - no icon or min/max/close buttons
BOOL SetMDIClient(HWND hWndMDIClient)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(::IsWindow(hWndMDIClient));
if(!::IsWindow(hWndMDIClient))
return FALSE;
#ifdef _DEBUG
LPCTSTR lpszMDIClientClass = _T("MDICLIENT");
int nNameLen = lstrlen(lpszMDIClientClass) + 1;
LPTSTR lpstrClassName = (LPTSTR)_alloca(nNameLen * sizeof(TCHAR));
::GetClassName(hWndMDIClient, lpstrClassName, nNameLen);
ATLASSERT(lstrcmpi(lpstrClassName, lpszMDIClientClass) == 0);
if(lstrcmpi(lpstrClassName, lpszMDIClientClass) != 0)
return FALSE; // not an "MDIClient" window
#endif //_DEBUG
if(m_wndMDIClient.IsWindow())
m_wndMDIClient.UnsubclassWindow(); // scary!
return m_wndMDIClient.SubclassWindow(hWndMDIClient);
}
// Message map and handlers
BEGIN_MSG_MAP(RamonSmit_CCommandBarCtrlImpl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
MESSAGE_HANDLER(WM_INITMENU, OnInitMenu)
MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)
MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
MESSAGE_HANDLER(GetAutoPopupMessage(), OnInternalAutoPopup)
MESSAGE_HANDLER(GetGetBarMessage(), OnInternalGetBar)
MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
MESSAGE_HANDLER(WM_MENUCHAR, OnMenuChar)
MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
MESSAGE_HANDLER(WM_KEYUP, OnKeyUp)
MESSAGE_HANDLER(WM_CHAR, OnChar)
MESSAGE_HANDLER(WM_SYSKEYDOWN, OnSysKeyDown)
MESSAGE_HANDLER(WM_SYSKEYUP, OnSysKeyUp)
MESSAGE_HANDLER(WM_SYSCHAR, OnSysChar)
// public API handlers - these stay to support chevrons in atlframe.h
MESSAGE_HANDLER(CBRM_GETMENU, OnAPIGetMenu)
MESSAGE_HANDLER(CBRM_TRACKPOPUPMENU, OnAPITrackPopupMenu)
MESSAGE_HANDLER(CBRM_GETCMDBAR, OnAPIGetCmdBar)
MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem)
MESSAGE_HANDLER(WM_FORWARDMSG, OnForwardMsg)
ALT_MSG_MAP(1) // Parent window messages
NOTIFY_CODE_HANDLER(TBN_HOTITEMCHANGE, OnParentHotItemChange)
NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnParentDropDown)
MESSAGE_HANDLER(WM_INITMENUPOPUP, OnParentInitMenuPopup)
MESSAGE_HANDLER(WM_SETTINGCHANGE, OnParentSettingChange)
MESSAGE_HANDLER(GetGetBarMessage(), OnParentInternalGetBar)
MESSAGE_HANDLER(WM_SYSCOMMAND, OnParentSysCommand)
MESSAGE_HANDLER(CBRM_GETMENU, OnParentAPIGetMenu)
MESSAGE_HANDLER(WM_MENUCHAR, OnParentMenuChar)
MESSAGE_HANDLER(CBRM_TRACKPOPUPMENU, OnParentAPITrackPopupMenu)
MESSAGE_HANDLER(CBRM_GETCMDBAR, OnParentAPIGetCmdBar)
MESSAGE_HANDLER(WM_DRAWITEM, OnParentDrawItem)
MESSAGE_HANDLER(WM_MEASUREITEM, OnParentMeasureItem)
ALT_MSG_MAP(2) // MDI client window messages
MESSAGE_HANDLER(WM_MDISETMENU, OnMDISetMenu)
ALT_MSG_MAP(3) // Message hook messages
MESSAGE_HANDLER(WM_MOUSEMOVE, OnHookMouseMove)
MESSAGE_HANDLER(WM_SYSKEYDOWN, OnHookSysKeyDown)
MESSAGE_HANDLER(WM_SYSKEYUP, OnHookSysKeyUp)
MESSAGE_HANDLER(WM_SYSCHAR, OnHookSysChar)
MESSAGE_HANDLER(WM_KEYDOWN, OnHookKeyDown)
MESSAGE_HANDLER(WM_NEXTMENU, OnHookNextMenu)
MESSAGE_HANDLER(WM_CHAR, OnHookChar)
END_MSG_MAP()
LRESULT OnForwardMsg(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
LPMSG pMsg = (LPMSG)lParam;
LRESULT lRet = 0;
ProcessWindowMessage(pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam, lRet, 3);
return lRet;
}
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
// These styles are required
ModifyStyle(0, TBSTYLE_LIST | TBSTYLE_FLAT);
// Let the toolbar initialize itself
LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
// get and use system settings
GetSystemSettings();
// Parent init
CWindow wndParent = GetParent();
CWindow wndTopLevelParent = wndParent.GetTopLevelParent();
m_wndParent.SubclassWindow(wndTopLevelParent);
// Toolbar Init
SetButtonStructSize();
SetImageList(NULL);
// Create message hook if needed
::EnterCriticalSection(&_Module.m_csWindowCreate);
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);
HHOOK hMsgHook = ::SetWindowsHookEx(WH_GETMESSAGE, MessageHookProc, _Module.GetModuleInstance(), dwThreadID);
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)++;
}
}
::LeaveCriticalSection(&_Module.m_csWindowCreate);
return lRet;
}
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
::EnterCriticalSection(&_Module.m_csWindowCreate);
ATLASSERT(s_pmapMsgHook != NULL);
if(s_pmapMsgHook != NULL)
{
DWORD dwThreadID = ::GetCurrentThreadId();
_MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID);
if(pData != NULL)
{
BOOL bRet = ::UnhookWindowsHookEx(pData->hMsgHook);
ATLASSERT(bRet);
if(bRet)
{
(pData->dwUsage)--;
if(pData->dwUsage == 0)
{
bRet = s_pmapMsgHook->Remove(dwThreadID);
ATLASSERT(bRet);
if(bRet)
delete pData;
}
}
if(s_pmapMsgHook->GetSize() == 0)
{
delete s_pmapMsgHook;
s_pmapMsgHook = NULL;
}
}
}
::LeaveCriticalSection(&_Module.m_csWindowCreate);
return lRet;
}
LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, "CmdBar - OnKeyDown\n");
#endif
// Simulate Alt+Space for the parent
if(wParam == VK_SPACE)
{
m_wndParent.PostMessage(WM_SYSKEYDOWN, wParam, lParam | (1 << 29));
bHandled = TRUE;
return 0;
}
bHandled = FALSE;
return 0;
}
LRESULT OnKeyUp(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, "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, "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
UINT nID = 0;
if(wParam != VK_RETURN && 0 == SendMessage(TB_MAPACCELERATOR, LOWORD(wParam), (LPARAM)&nID))
::MessageBeep(0);
else
{
PostMessage(WM_KEYDOWN, VK_DOWN, 0L);
if(wParam != VK_RETURN)
SetHotItem(nID);
}
return 0;
}
LRESULT OnSysKeyDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
#ifdef _CMDBAR_EXTRA_TRACE
ATLTRACE2(atlTraceUI, 0, "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, "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, "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;
}
RECT rect;
GetClientRect(&rect);
::FillRect((HDC)wParam, &rect, (HBRUSH)LongToPtr(COLOR_MENU + 1));
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;
}
ATLTRACE2(atlTraceUI, 0, "CmdBar - OnInitMenuPopup\n");
// 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);
TCHAR szString[_nMaxMenuItemTextLength];
BOOL bRet;
for(int i = 0; i < menuPopup.GetMenuItemCount(); i++)
{
CMenuItemInfo mii;
mii.cch = _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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -