📄 atlctrlw.h
字号:
BOOL LoadMenu(ATL::_U_STRINGorID menu)
{
ATLASSERT(::IsWindow(m_hWnd));
if(m_bAttachedMenu) // doesn't work in this mode
return FALSE;
if(menu.m_lpstr == NULL)
return FALSE;
#if (_ATL_VER >= 0x0700)
HMENU hMenu = ::LoadMenu(ATL::_AtlBaseModule.GetResourceInstance(), menu.m_lpstr);
#else //!(_ATL_VER >= 0x0700)
HMENU hMenu = ::LoadMenu(_Module.GetResourceInstance(), menu.m_lpstr);
#endif //!(_ATL_VER >= 0x0700)
if(hMenu == NULL)
return FALSE;
return AttachMenu(hMenu);
}
BOOL AttachMenu(HMENU hMenu)
{
ATLASSERT(::IsWindow(m_hWnd));
ATLASSERT(::IsMenu(hMenu));
if(hMenu != NULL && !::IsMenu(hMenu))
return FALSE;
// destroy old menu, if needed, and set new one
if(m_hMenu != NULL && (m_dwExtendedStyle & CBR_EX_SHAREMENU) == 0)
::DestroyMenu(m_hMenu);
m_hMenu = hMenu;
if(m_bAttachedMenu) // Nothing else in this mode
return TRUE;
// Build buttons according to menu
SetRedraw(FALSE);
// Clear all
BOOL bRet;
int nCount = GetButtonCount();
for(int i = 0; i < nCount; i++)
{
bRet = DeleteButton(0);
ATLASSERT(bRet);
}
// Add buttons for each menu item
if(m_hMenu != NULL)
{
int nItems = ::GetMenuItemCount(m_hMenu);
T* pT = static_cast<T*>(this);
pT; // avoid level 4 warning
TCHAR szString[pT->_nMaxMenuItemTextLength];
for(int i = 0; i < nItems; i++)
{
CMenuItemInfo mii;
mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU;
mii.fType = MFT_STRING;
mii.dwTypeData = szString;
mii.cch = pT->_nMaxMenuItemTextLength;
bRet = ::GetMenuItemInfo(m_hMenu, i, TRUE, &mii);
ATLASSERT(bRet);
// If we have more than the buffer, we assume we have bitmaps bits
if(lstrlen(szString) > pT->_nMaxMenuItemTextLength - 1)
{
mii.fType = MFT_BITMAP;
::SetMenuItemInfo(m_hMenu, i, TRUE, &mii);
szString[0] = 0;
}
// NOTE: Command Bar currently supports only drop-down menu items
ATLASSERT(mii.hSubMenu != NULL);
TBBUTTON btn = { 0 };
btn.iBitmap = 0;
btn.idCommand = i;
btn.fsState = (BYTE)(((mii.fState & MFS_DISABLED) == 0) ? TBSTATE_ENABLED : 0);
btn.fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE | TBSTYLE_DROPDOWN;
btn.dwData = 0;
btn.iString = 0;
bRet = InsertButton(-1, &btn);
ATLASSERT(bRet);
TBBUTTONINFO bi = { 0 };
bi.cbSize = sizeof(TBBUTTONINFO);
bi.dwMask = TBIF_TEXT;
bi.pszText = szString;
bRet = SetButtonInfo(i, &bi);
ATLASSERT(bRet);
}
}
SetRedraw(TRUE);
Invalidate();
UpdateWindow();
return TRUE;
}
BOOL LoadImages(ATL::_U_STRINGorID image)
{
return _LoadImagesHelper(image, false);
}
BOOL LoadMappedImages(UINT nIDImage, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0)
{
return _LoadImagesHelper(nIDImage, true, nFlags , lpColorMap, nMapSize);
}
BOOL _LoadImagesHelper(ATL::_U_STRINGorID image, bool bMapped, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0)
{
ATLASSERT(::IsWindow(m_hWnd));
#if (_ATL_VER >= 0x0700)
HINSTANCE hInstance = ATL::_AtlBaseModule.GetResourceInstance();
#else //!(_ATL_VER >= 0x0700)
HINSTANCE hInstance = _Module.GetResourceInstance();
#endif //!(_ATL_VER >= 0x0700)
HRSRC hRsrc = ::FindResource(hInstance, image.m_lpstr, (LPTSTR)RT_TOOLBAR);
if(hRsrc == NULL)
return FALSE;
HGLOBAL hGlobal = ::LoadResource(hInstance, hRsrc);
if(hGlobal == NULL)
return FALSE;
_ToolBarData* pData = (_ToolBarData*)::LockResource(hGlobal);
if(pData == NULL)
return FALSE;
ATLASSERT(pData->wVersion == 1);
WORD* pItems = pData->items();
int nItems = pData->wItemCount;
// Set internal data
SetImageSize(pData->wWidth, pData->wHeight);
// Create image list if needed
if(m_hImageList == NULL)
{
// Check if the bitmap is 32-bit (alpha channel) bitmap (valid for Windows XP only)
T* pT = static_cast<T*>(this);
m_bAlphaImages = AtlIsAlphaBitmapResource(image);
if(!pT->CreateInternalImageList(pData->wItemCount))
return FALSE;
}
// Add bitmap to our image list
CBitmap bmp;
if(bMapped)
{
ATLASSERT(HIWORD(PtrToUlong(image.m_lpstr)) == 0); // if mapped, must be a numeric ID
int nIDImage = (int)(short)LOWORD(PtrToUlong(image.m_lpstr));
bmp.LoadMappedBitmap(nIDImage, (WORD)nFlags, lpColorMap, nMapSize);
}
else
{
if(m_bAlphaImages)
#if (_ATL_VER >= 0x0700)
bmp = (HBITMAP)::LoadImage(ATL::_AtlBaseModule.GetResourceInstance(), image.m_lpstr, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
#else //!(_ATL_VER >= 0x0700)
bmp = (HBITMAP)::LoadImage(_Module.GetResourceInstance(), image.m_lpstr, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
#endif //!(_ATL_VER >= 0x0700)
else
bmp.LoadBitmap(image.m_lpstr);
}
ATLASSERT(bmp.m_hBitmap != NULL);
if(bmp.m_hBitmap == NULL)
return FALSE;
if(::ImageList_AddMasked(m_hImageList, bmp, m_clrMask) == -1)
return FALSE;
// Fill the array with command IDs
for(int i = 0; i < nItems; i++)
{
if(pItems[i] != 0)
m_arrCommand.Add(pItems[i]);
}
ATLASSERT(::ImageList_GetImageCount(m_hImageList) == m_arrCommand.GetSize());
if(::ImageList_GetImageCount(m_hImageList) != m_arrCommand.GetSize())
return FALSE;
return TRUE;
}
BOOL AddBitmap(ATL::_U_STRINGorID bitmap, int nCommandID)
{
ATLASSERT(::IsWindow(m_hWnd));
CBitmap bmp;
bmp.LoadBitmap(bitmap.m_lpstr);
if(bmp.m_hBitmap == NULL)
return FALSE;
return AddBitmap(bmp, nCommandID);
}
BOOL AddBitmap(HBITMAP hBitmap, UINT nCommandID)
{
ATLASSERT(::IsWindow(m_hWnd));
// Create image list if it doesn't exist
if(m_hImageList == NULL)
{
T* pT = static_cast<T*>(this);
if(!pT->CreateInternalImageList(1))
return FALSE;
}
// check bitmap size
CBitmapHandle bmp = hBitmap;
SIZE size = { 0, 0 };
bmp.GetSize(size);
if(size.cx != m_szBitmap.cx || size.cy != m_szBitmap.cy)
{
ATLASSERT(FALSE); // must match size!
return FALSE;
}
// add bitmap
int nRet = ::ImageList_AddMasked(m_hImageList, hBitmap, m_clrMask);
if(nRet == -1)
return FALSE;
BOOL bRet = m_arrCommand.Add((WORD)nCommandID);
ATLASSERT(::ImageList_GetImageCount(m_hImageList) == m_arrCommand.GetSize());
return bRet;
}
BOOL AddIcon(ATL::_U_STRINGorID icon, UINT nCommandID)
{
ATLASSERT(::IsWindow(m_hWnd));
#if (_ATL_VER >= 0x0700)
HICON hIcon = ::LoadIcon(ATL::_AtlBaseModule.GetResourceInstance(), icon.m_lpstr);
#else //!(_ATL_VER >= 0x0700)
HICON hIcon = ::LoadIcon(_Module.GetResourceInstance(), icon.m_lpstr);
#endif //!(_ATL_VER >= 0x0700)
if(hIcon == NULL)
return FALSE;
return AddIcon(hIcon, nCommandID);
}
BOOL AddIcon(HICON hIcon, UINT nCommandID)
{
ATLASSERT(::IsWindow(m_hWnd));
// create image list if it doesn't exist
if(m_hImageList == NULL)
{
T* pT = static_cast<T*>(this);
if(!pT->CreateInternalImageList(1))
return FALSE;
}
int nRet = ::ImageList_AddIcon(m_hImageList, hIcon);
if(nRet == -1)
return FALSE;
BOOL bRet = m_arrCommand.Add((WORD)nCommandID);
ATLASSERT(::ImageList_GetImageCount(m_hImageList) == m_arrCommand.GetSize());
return bRet;
}
BOOL ReplaceBitmap(ATL::_U_STRINGorID bitmap, int nCommandID)
{
ATLASSERT(::IsWindow(m_hWnd));
CBitmap bmp;
bmp.LoadBitmap(bitmap.m_lpstr);
if(bmp.m_hBitmap == NULL)
return FALSE;
return ReplaceBitmap(bmp, nCommandID);
}
BOOL ReplaceBitmap(HBITMAP hBitmap, UINT 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;
}
}
if(bRet)
bRet = AddBitmap(hBitmap, nCommandID);
return bRet;
}
BOOL ReplaceIcon(ATL::_U_STRINGorID icon, UINT nCommandID)
{
ATLASSERT(::IsWindow(m_hWnd));
#if (_ATL_VER >= 0x0700)
HICON hIcon = ::LoadIcon(ATL::_AtlBaseModule.GetResourceInstance(), icon.m_lpstr);
#else //!(_ATL_VER >= 0x0700)
HICON hIcon = ::LoadIcon(_Module.GetResourceInstance(), icon.m_lpstr);
#endif //!(_ATL_VER >= 0x0700)
if(hIcon == NULL)
return FALSE;
return ReplaceIcon(hIcon, nCommandID);
}
BOOL ReplaceIcon(HICON hIcon, UINT nCommandID)
{
ATLASSERT(::IsWindow(m_hWnd));
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;
if(m_bUseKeyboardCues)
m_bShowKeyboardCues = m_bKeyboardInput;
T* pT = static_cast<T*>(this);
return pT->DoTrackPopupMenu(hMenu, uFlags, x, y, lpParams);
}
BOOL SetMDIClient(HWND /*hWndMDIClient*/)
{
// Use CMDICommandBarCtrl for MDI support
ATLASSERT(FALSE);
return FALSE;
}
// Message map and handlers
BEGIN_MSG_MAP(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(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)
MESSAGE_HANDLER(WM_ACTIVATE, OnParentActivate)
NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnParentCustomDraw)
ALT_MSG_MAP(2) // MDI client window messages
// Use CMDICommandBarCtrl for MDI support
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;
if(pMsg->message >= WM_MOUSEFIRST && pMsg->message <= WM_MOUSELAST)
m_bKeyboardInput = false;
else if(pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
m_bKeyboardInput = true;
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*/)
{
// Let the toolbar initialize itself
LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
// get and use system settings
T* pT = static_cast<T*>(this);
pT->GetSystemSettings();
// Parent init
ATL::CWindow wndParent = GetParent();
ATL::CWindow wndTopLevelParent = wndParent.GetTopLevelParent();
m_wndParent.SubclassWindow(wndTopLevelParent);
// Toolbar Init
SetButtonStructSize();
SetImageList(NULL);
// Create message hook if needed
CWindowCreateCriticalSectionLock lock;
if(FAILED(lock.Lock()))
{
ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::OnCreate.\n"));
ATLASSERT(FALSE);
return -1;
}
if(s_pmapMsgHook == NULL)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -