12 #ifndef __ATLCTRLW_H__ 13 #define __ATLCTRLW_H__ 18 #error atlctrlw.h is not supported on Windows CE 22 #error atlctrlw.h requires atlapp.h to be included first 25 #ifndef __ATLCTRLS_H__ 26 #error atlctrlw.h requires atlctrls.h to be included first 29 #if (_WIN32_IE < 0x0400) 30 #error atlctrlw.h requires _WIN32_IE >= 0x0400 34 #if !defined(_WTL_CMDBAR_VISTA_MENUS) && (WINVER >= 0x0500) && (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) 35 #define _WTL_CMDBAR_VISTA_MENUS 1 38 #if _WTL_CMDBAR_VISTA_MENUS 39 #if !((_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501)) 40 #error _WTL_CMDBAR_VISTA_MENUS requires (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) 61 #define CBRWS_TOP CCS_TOP 62 #define CBRWS_BOTTOM CCS_BOTTOM 63 #define CBRWS_NORESIZE CCS_NORESIZE 64 #define CBRWS_NOPARENTALIGN CCS_NOPARENTALIGN 65 #define CBRWS_NODIVIDER CCS_NODIVIDER 68 #define CBR_EX_TRANSPARENT 0x00000001L 69 #define CBR_EX_SHAREMENU 0x00000002L 70 #define CBR_EX_ALTFOCUSMODE 0x00000004L 71 #define CBR_EX_TRACKALWAYS 0x00000008L 72 #define CBR_EX_NOVISTAMENUS 0x00000010L 75 #define ATL_SIMPLE_CMDBAR_PANE_STYLE \ 76 (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CBRWS_NODIVIDER | CBRWS_NORESIZE | CBRWS_NOPARENTALIGN) 79 #define CBRM_GETCMDBAR (WM_USER + 301) // returns command bar HWND 80 #define CBRM_GETMENU (WM_USER + 302) // returns loaded or attached menu 81 #define CBRM_TRACKPOPUPMENU (WM_USER + 303) // displays a popup menu 100 #ifdef _CMDBAR_EXTRA_TRACE 101 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - STACK-PUSH (%8.8X) size = %i\n"), t, GetSize());
108 int nLast = GetSize() - 1;
112 #ifdef _CMDBAR_EXTRA_TRACE 113 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - STACK-POP (%8.8X) size = %i\n"), t, GetSize());
122 int nLast = GetSize() - 1;
145 typedef ATL::CSimpleMap<DWORD, _MsgHookData*> CMsgHookMap;
146 static CMsgHookMap* s_pmapMsgHook;
148 static HHOOK s_hCreateHook;
151 static bool s_bStaticInit;
166 if(FAILED(lock.Lock()))
168 ATLTRACE2(atlTraceUI, 0, _T(
"ERROR : Unable to lock critical section in CCommandBarCtrlBase::CCommandBarCtrlBase.\n"));
176 AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES);
178 s_bW2K = !AtlIsOldWindows();
180 s_bStaticInit =
true;
187 bool IsCommandBarBase()
const {
return m_dwMagic == 1314; }
190 __declspec(selectany) CCommandBarCtrlBase::CMsgHookMap* CCommandBarCtrlBase::s_pmapMsgHook = NULL;
191 __declspec(selectany) HHOOK CCommandBarCtrlBase::s_hCreateHook = NULL;
193 __declspec(selectany)
bool CCommandBarCtrlBase::s_bW2K =
false;
194 __declspec(selectany)
bool CCommandBarCtrlBase::s_bStaticInit =
false;
200 template <
class T,
class TBase = CCommandBarCtrlBase,
class TWinTraits = ATL::CControlWinTraits>
204 DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName())
215 _MenuItemData() { dwMagic = 0x1313; }
216 bool IsCmdBarMenuItem() {
return (dwMagic == 0x1313); }
228 {
return (WORD*)(
this+1); }
232 enum _CmdBarDrawConstants
236 s_kcxButtonMargin = 3,
237 s_kcyButtonMargin = 3
242 _nMaxMenuItemTextLength = 100,
243 _chChevronShortcut = _T(
'/')
246 #ifndef DT_HIDEPREFIX 247 enum { DT_HIDEPREFIX = 0x00100000 };
248 #endif // !DT_HIDEPREFIX 252 HIMAGELIST m_hImageList;
253 ATL::CSimpleValArray<WORD> m_arrCommand;
255 DWORD m_dwExtendedStyle;
257 ATL::CContainedWindow m_wndParent;
259 bool m_bMenuActive:1;
260 bool m_bAttachedMenu:1;
261 bool m_bImagesVisible:1;
263 bool m_bContextMenu:1;
264 bool m_bEscapePressed:1;
266 bool m_bParentActive:1;
268 bool m_bUseKeyboardCues:1;
269 bool m_bShowKeyboardCues:1;
270 bool m_bAllowKeyboardCues:1;
271 bool m_bKeyboardInput:1;
272 bool m_bAlphaImages:1;
274 bool m_bSkipPostDown:1;
275 bool m_bVistaMenus:1;
290 int m_cxExtraSpacing;
292 #if _WTL_CMDBAR_VISTA_MENUS 293 ATL::CSimpleValArray<HBITMAP> m_arrVistaBitmap;
294 #endif // _WTL_CMDBAR_VISTA_MENUS 300 m_wndParent(
this, 1),
301 m_bMenuActive(
false),
302 m_bAttachedMenu(
false),
306 m_bImagesVisible(
true),
310 m_bContextMenu(
false),
311 m_bEscapePressed(
false),
312 m_clrMask(RGB(192, 192, 192)),
313 m_dwExtendedStyle(CBR_EX_TRANSPARENT | CBR_EX_SHAREMENU | CBR_EX_TRACKALWAYS),
314 m_bParentActive(
true),
316 m_bUseKeyboardCues(
false),
317 m_bShowKeyboardCues(
false),
318 m_bAllowKeyboardCues(
true),
319 m_bKeyboardInput(
false),
321 m_bAlphaImages(
false),
323 m_bSkipPostDown(
false),
326 SetImageSize(16, 15);
331 if(m_wndParent.IsWindow())
332 m_wndParent.UnsubclassWindow();
334 if(m_hMenu != NULL && (m_dwExtendedStyle & CBR_EX_SHAREMENU) == 0)
335 ::DestroyMenu(m_hMenu);
337 if(m_hImageList != NULL)
338 ::ImageList_Destroy(m_hImageList);
342 DWORD GetCommandBarExtendedStyle()
const 344 return m_dwExtendedStyle;
347 DWORD SetCommandBarExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)
349 DWORD dwPrevStyle = m_dwExtendedStyle;
351 m_dwExtendedStyle = dwExtendedStyle;
353 m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);
359 ATLASSERT(::IsWindow(m_hWnd));
363 COLORREF GetImageMaskColor()
const 368 COLORREF SetImageMaskColor(COLORREF clrMask)
370 COLORREF clrOld = m_clrMask;
375 bool GetImagesVisible()
const 377 return m_bImagesVisible;
380 bool SetImagesVisible(
bool bVisible)
382 bool bOld = m_bImagesVisible;
383 m_bImagesVisible = bVisible;
387 void GetImageSize(SIZE& size)
const 392 bool SetImageSize(SIZE& size)
394 return SetImageSize(size.cx, size.cy);
397 bool SetImageSize(
int cx,
int cy)
399 if(m_hImageList != NULL)
401 if(::ImageList_GetImageCount(m_hImageList) == 0)
403 ::ImageList_Destroy(m_hImageList);
412 if(cx == 0 || cy == 0)
417 m_szButton.cx = m_szBitmap.cx + 2 * s_kcxButtonMargin;
418 m_szButton.cy = m_szBitmap.cy + 2 * s_kcyButtonMargin;
423 bool GetAlphaImages()
const 425 return m_bAlphaImages;
428 bool SetAlphaImages(
bool bAlphaImages)
430 if(m_hImageList != NULL)
432 if(::ImageList_GetImageCount(m_hImageList) == 0)
434 ::ImageList_Destroy(m_hImageList);
443 m_bAlphaImages = bAlphaImages;
447 HWND GetCmdBar()
const 449 ATLASSERT(::IsWindow(m_hWnd));
450 return (HWND)::SendMessage(m_hWnd, CBRM_GETCMDBAR, 0, 0L);
454 HWND Create(HWND hWndParent, RECT& rcPos, LPCTSTR szWindowName = NULL,
455 DWORD dwStyle = 0, DWORD dwExStyle = 0,
456 UINT nID = 0, LPVOID lpCreateParam = NULL)
459 dwStyle |= TBSTYLE_LIST | TBSTYLE_FLAT;
460 #if (_MSC_VER >= 1300) 461 return ATL::CWindowImpl< T, TBase, TWinTraits >::Create(hWndParent, rcPos, szWindowName, dwStyle, dwExStyle, nID, lpCreateParam);
462 #else // !(_MSC_VER >= 1300) 463 typedef ATL::CWindowImpl< T, TBase, TWinTraits > _baseClass;
464 return _baseClass::Create(hWndParent, rcPos, szWindowName, dwStyle, dwExStyle, nID, lpCreateParam);
465 #endif // !(_MSC_VER >= 1300) 468 BOOL AttachToWindow(HWND hWnd)
470 ATLASSERT(m_hWnd == NULL);
471 ATLASSERT(::IsWindow(hWnd));
472 BOOL bRet = SubclassWindow(hWnd);
475 m_bAttachedMenu =
true;
476 T* pT =
static_cast<T*
>(
this);
477 pT->GetSystemSettings();
484 ATLASSERT(::IsWindow(m_hWnd));
488 if(menu.m_lpstr == NULL)
491 HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr);
495 return AttachMenu(hMenu);
498 BOOL AttachMenu(HMENU hMenu)
500 ATLASSERT(::IsWindow(m_hWnd));
501 ATLASSERT(hMenu == NULL || ::IsMenu(hMenu));
502 if(hMenu != NULL && !::IsMenu(hMenu))
505 #if _WTL_CMDBAR_VISTA_MENUS 507 if(m_bVistaMenus && (m_hMenu != NULL))
509 T* pT =
static_cast<T*
>(
this);
510 pT->_RemoveVistaBitmapsFromMenu();
512 #endif // _WTL_CMDBAR_VISTA_MENUS 515 if(m_hMenu != NULL && (m_dwExtendedStyle & CBR_EX_SHAREMENU) == 0)
516 ::DestroyMenu(m_hMenu);
527 int nCount = GetButtonCount();
528 for(
int i = 0; i < nCount; i++)
529 ATLVERIFY(DeleteButton(0) != FALSE);
534 int nItems = ::GetMenuItemCount(m_hMenu);
536 T* pT =
static_cast<T*
>(
this);
538 TCHAR szString[pT->_nMaxMenuItemTextLength] = { 0 };
539 for(
int i = 0; i < nItems; i++)
542 mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU;
543 mii.fType = MFT_STRING;
544 mii.dwTypeData = szString;
545 mii.cch = pT->_nMaxMenuItemTextLength;
546 BOOL bRet = ::GetMenuItemInfo(m_hMenu, i, TRUE, &mii);
549 if(lstrlen(szString) > pT->_nMaxMenuItemTextLength - 1)
551 mii.fType = MFT_BITMAP;
552 ::SetMenuItemInfo(m_hMenu, i, TRUE, &mii);
557 ATLASSERT(mii.hSubMenu != NULL);
559 TBBUTTON btn = { 0 };
562 btn.fsState = (BYTE)(((mii.fState & MFS_DISABLED) == 0) ? TBSTATE_ENABLED : 0);
563 btn.fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE | TBSTYLE_DROPDOWN;
567 bRet = InsertButton(-1, &btn);
570 TBBUTTONINFO bi = { 0 };
571 bi.cbSize =
sizeof(TBBUTTONINFO);
572 bi.dwMask = TBIF_TEXT;
573 bi.pszText = szString;
575 bRet = SetButtonInfo(i, &bi);
589 return _LoadImagesHelper(image,
false);
592 BOOL LoadMappedImages(UINT nIDImage, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL,
int nMapSize = 0)
594 return _LoadImagesHelper(nIDImage,
true, nFlags , lpColorMap, nMapSize);
597 BOOL _LoadImagesHelper(
ATL::_U_STRINGorID image,
bool bMapped, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL,
int nMapSize = 0)
599 ATLASSERT(::IsWindow(m_hWnd));
600 HINSTANCE hInstance = ModuleHelper::GetResourceInstance();
602 HRSRC hRsrc = ::FindResource(hInstance, image.m_lpstr, (LPTSTR)RT_TOOLBAR);
606 HGLOBAL hGlobal = ::LoadResource(hInstance, hRsrc);
613 ATLASSERT(pData->wVersion == 1);
615 WORD* pItems = pData->items();
616 int nItems = pData->wItemCount;
619 SetImageSize(pData->wWidth, pData->wHeight);
622 if(m_hImageList == NULL)
625 T* pT =
static_cast<T*
>(
this);
626 m_bAlphaImages = AtlIsAlphaBitmapResource(image);
628 if(!pT->CreateInternalImageList(pData->wItemCount))
632 #if _WTL_CMDBAR_VISTA_MENUS 633 int nOldImageCount = ::ImageList_GetImageCount(m_hImageList);
634 #endif // _WTL_CMDBAR_VISTA_MENUS 640 ATLASSERT(HIWORD(PtrToUlong(image.m_lpstr)) == 0);
641 int nIDImage = (int)(
short)LOWORD(PtrToUlong(image.m_lpstr));
642 bmp.LoadMappedBitmap(nIDImage, (WORD)nFlags, lpColorMap, nMapSize);
647 bmp = (HBITMAP)::LoadImage(ModuleHelper::GetResourceInstance(), image.m_lpstr, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
649 bmp.LoadBitmap(image.m_lpstr);
651 ATLASSERT(bmp.m_hBitmap != NULL);
652 if(bmp.m_hBitmap == NULL)
654 if(::ImageList_AddMasked(m_hImageList, bmp, m_clrMask) == -1)
658 for(
int i = 0; i < nItems; i++)
661 m_arrCommand.Add(pItems[i]);
664 int nImageCount = ::ImageList_GetImageCount(m_hImageList);
665 ATLASSERT(nImageCount == m_arrCommand.GetSize());
666 if(nImageCount != m_arrCommand.GetSize())
669 #if _WTL_CMDBAR_VISTA_MENUS 670 if(RunTimeHelper::IsVista())
672 T* pT =
static_cast<T*
>(
this);
673 pT->_AddVistaBitmapsFromImageList(nOldImageCount, nImageCount - nOldImageCount);
674 ATLASSERT(nImageCount == m_arrVistaBitmap.GetSize());
676 #endif // _WTL_CMDBAR_VISTA_MENUS 683 ATLASSERT(::IsWindow(m_hWnd));
685 bmp.LoadBitmap(bitmap.m_lpstr);
686 if(bmp.m_hBitmap == NULL)
688 return AddBitmap(bmp, nCommandID);
691 BOOL AddBitmap(HBITMAP hBitmap, UINT nCommandID)
693 ATLASSERT(::IsWindow(m_hWnd));
694 T* pT =
static_cast<T*
>(
this);
696 if(m_hImageList == NULL)
698 if(!pT->CreateInternalImageList(1))
703 SIZE size = { 0, 0 };
705 if(size.cx != m_szBitmap.cx || size.cy != m_szBitmap.cy)
711 int nRet = ::ImageList_AddMasked(m_hImageList, hBitmap, m_clrMask);
714 BOOL bRet = m_arrCommand.Add((WORD)nCommandID);
715 ATLASSERT(::ImageList_GetImageCount(m_hImageList) == m_arrCommand.GetSize());
716 #if _WTL_CMDBAR_VISTA_MENUS 717 if(RunTimeHelper::IsVista())
719 pT->_AddVistaBitmapFromImageList(m_arrCommand.GetSize() - 1);
720 ATLASSERT(m_arrVistaBitmap.GetSize() == m_arrCommand.GetSize());
722 #endif // _WTL_CMDBAR_VISTA_MENUS 728 ATLASSERT(::IsWindow(m_hWnd));
729 HICON hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr);
732 return AddIcon(hIcon, nCommandID);
735 BOOL AddIcon(HICON hIcon, UINT nCommandID)
737 ATLASSERT(::IsWindow(m_hWnd));
738 T* pT =
static_cast<T*
>(
this);
740 if(m_hImageList == NULL)
742 if(!pT->CreateInternalImageList(1))
746 int nRet = ::ImageList_AddIcon(m_hImageList, hIcon);
749 BOOL bRet = m_arrCommand.Add((WORD)nCommandID);
750 ATLASSERT(::ImageList_GetImageCount(m_hImageList) == m_arrCommand.GetSize());
751 #if _WTL_CMDBAR_VISTA_MENUS 752 if(RunTimeHelper::IsVista())
754 pT->_AddVistaBitmapFromImageList(m_arrCommand.GetSize() - 1);
755 ATLASSERT(m_arrVistaBitmap.GetSize() == m_arrCommand.GetSize());
757 #endif // _WTL_CMDBAR_VISTA_MENUS 763 ATLASSERT(::IsWindow(m_hWnd));
765 bmp.LoadBitmap(bitmap.m_lpstr);
766 if(bmp.m_hBitmap == NULL)
768 return ReplaceBitmap(bmp, nCommandID);
771 BOOL ReplaceBitmap(HBITMAP hBitmap, UINT nCommandID)
773 ATLASSERT(::IsWindow(m_hWnd));
775 for(
int i = 0; i < m_arrCommand.GetSize(); i++)
777 if(m_arrCommand[i] == nCommandID)
779 bRet = ::ImageList_Remove(m_hImageList, i);
782 m_arrCommand.RemoveAt(i);
783 #if _WTL_CMDBAR_VISTA_MENUS 784 if(RunTimeHelper::IsVista())
786 if(m_arrVistaBitmap[i] != NULL)
787 ::DeleteObject(m_arrVistaBitmap[i]);
788 m_arrVistaBitmap.RemoveAt(i);
790 #endif // _WTL_CMDBAR_VISTA_MENUS 796 bRet = AddBitmap(hBitmap, nCommandID);
802 ATLASSERT(::IsWindow(m_hWnd));
803 HICON hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr);
806 return ReplaceIcon(hIcon, nCommandID);
809 BOOL ReplaceIcon(HICON hIcon, UINT nCommandID)
811 ATLASSERT(::IsWindow(m_hWnd));
813 for(
int i = 0; i < m_arrCommand.GetSize(); i++)
815 if(m_arrCommand[i] == nCommandID)
817 bRet = (::ImageList_ReplaceIcon(m_hImageList, i, hIcon) != -1);
818 #if _WTL_CMDBAR_VISTA_MENUS 819 if(RunTimeHelper::IsVista() && bRet != FALSE)
821 T* pT =
static_cast<T*
>(
this);
822 pT->_ReplaceVistaBitmapFromImageList(i);
824 #endif // _WTL_CMDBAR_VISTA_MENUS 831 BOOL RemoveImage(
int nCommandID)
833 ATLASSERT(::IsWindow(m_hWnd));
836 for(
int i = 0; i < m_arrCommand.GetSize(); i++)
838 if(m_arrCommand[i] == nCommandID)
840 bRet = ::ImageList_Remove(m_hImageList, i);
843 m_arrCommand.RemoveAt(i);
844 #if _WTL_CMDBAR_VISTA_MENUS 845 if(RunTimeHelper::IsVista())
847 if(m_arrVistaBitmap[i] != NULL)
848 ::DeleteObject(m_arrVistaBitmap[i]);
849 m_arrVistaBitmap.RemoveAt(i);
851 #endif // _WTL_CMDBAR_VISTA_MENUS 859 BOOL RemoveAllImages()
861 ATLASSERT(::IsWindow(m_hWnd));
863 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Removing all images\n"));
864 BOOL bRet = ::ImageList_RemoveAll(m_hImageList);
867 m_arrCommand.RemoveAll();
868 #if _WTL_CMDBAR_VISTA_MENUS 869 for(
int i = 0; i < m_arrVistaBitmap.GetSize(); i++)
871 if(m_arrVistaBitmap[i] != NULL)
872 ::DeleteObject(m_arrVistaBitmap[i]);
874 m_arrVistaBitmap.RemoveAll();
875 #endif // _WTL_CMDBAR_VISTA_MENUS 880 BOOL TrackPopupMenu(HMENU hMenu, UINT uFlags,
int x,
int y, LPTPMPARAMS lpParams = NULL)
882 ATLASSERT(::IsWindow(m_hWnd));
883 ATLASSERT(::IsMenu(hMenu));
886 m_bContextMenu =
true;
887 if(m_bUseKeyboardCues)
888 m_bShowKeyboardCues = m_bKeyboardInput;
889 T* pT =
static_cast<T*
>(
this);
890 return pT->DoTrackPopupMenu(hMenu, uFlags, x, y, lpParams);
893 BOOL SetMDIClient(HWND )
902 MESSAGE_HANDLER(WM_CREATE, OnCreate)
903 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
904 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
905 MESSAGE_HANDLER(WM_INITMENU, OnInitMenu)
906 MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)
907 MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
908 MESSAGE_HANDLER(GetAutoPopupMessage(), OnInternalAutoPopup)
909 MESSAGE_HANDLER(GetGetBarMessage(), OnInternalGetBar)
910 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
911 MESSAGE_HANDLER(WM_MENUCHAR, OnMenuChar)
913 MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
914 MESSAGE_HANDLER(WM_KEYUP, OnKeyUp)
915 MESSAGE_HANDLER(WM_CHAR, OnChar)
916 MESSAGE_HANDLER(WM_SYSKEYDOWN, OnSysKeyDown)
917 MESSAGE_HANDLER(WM_SYSKEYUP, OnSysKeyUp)
918 MESSAGE_HANDLER(WM_SYSCHAR, OnSysChar)
920 MESSAGE_HANDLER(CBRM_GETMENU, OnAPIGetMenu)
921 MESSAGE_HANDLER(CBRM_TRACKPOPUPMENU, OnAPITrackPopupMenu)
922 MESSAGE_HANDLER(CBRM_GETCMDBAR, OnAPIGetCmdBar)
924 MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
925 MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem)
927 MESSAGE_HANDLER(WM_FORWARDMSG, OnForwardMsg)
929 NOTIFY_CODE_HANDLER(TBN_HOTITEMCHANGE, OnParentHotItemChange)
930 NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnParentDropDown)
931 MESSAGE_HANDLER(WM_INITMENUPOPUP, OnParentInitMenuPopup)
932 MESSAGE_HANDLER(GetGetBarMessage(), OnParentInternalGetBar)
933 MESSAGE_HANDLER(WM_SYSCOMMAND, OnParentSysCommand)
934 MESSAGE_HANDLER(CBRM_GETMENU, OnParentAPIGetMenu)
935 MESSAGE_HANDLER(WM_MENUCHAR, OnParentMenuChar)
936 MESSAGE_HANDLER(CBRM_TRACKPOPUPMENU, OnParentAPITrackPopupMenu)
937 MESSAGE_HANDLER(CBRM_GETCMDBAR, OnParentAPIGetCmdBar)
938 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnParentSettingChange)
940 MESSAGE_HANDLER(WM_DRAWITEM, OnParentDrawItem)
941 MESSAGE_HANDLER(WM_MEASUREITEM, OnParentMeasureItem)
943 MESSAGE_HANDLER(WM_ACTIVATE, OnParentActivate)
944 NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnParentCustomDraw)
948 MESSAGE_HANDLER(WM_MOUSEMOVE, OnHookMouseMove)
949 MESSAGE_HANDLER(WM_SYSKEYDOWN, OnHookSysKeyDown)
950 MESSAGE_HANDLER(WM_SYSKEYUP, OnHookSysKeyUp)
951 MESSAGE_HANDLER(WM_SYSCHAR, OnHookSysChar)
952 MESSAGE_HANDLER(WM_KEYDOWN, OnHookKeyDown)
953 MESSAGE_HANDLER(WM_NEXTMENU, OnHookNextMenu)
954 MESSAGE_HANDLER(WM_CHAR, OnHookChar)
957 LRESULT OnForwardMsg(UINT , WPARAM , LPARAM lParam, BOOL& )
959 LPMSG pMsg = (LPMSG)lParam;
960 if(pMsg->message >= WM_MOUSEFIRST && pMsg->message <= WM_MOUSELAST)
961 m_bKeyboardInput =
false;
962 else if(pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
963 m_bKeyboardInput =
true;
965 ProcessWindowMessage(pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam, lRet, 3);
969 LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
972 LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
974 T* pT =
static_cast<T*
>(
this);
975 pT->GetSystemSettings();
977 ATL::CWindow wndParent = GetParent();
978 ATL::CWindow wndTopLevelParent = wndParent.GetTopLevelParent();
979 m_wndParent.SubclassWindow(wndTopLevelParent);
981 SetButtonStructSize();
986 if(FAILED(lock.Lock()))
988 ATLTRACE2(atlTraceUI, 0, _T(
"ERROR : Unable to lock critical section in CCommandBarCtrlImpl::OnCreate.\n"));
993 if(s_pmapMsgHook == NULL)
995 ATLTRY(s_pmapMsgHook =
new CMsgHookMap);
996 ATLASSERT(s_pmapMsgHook != NULL);
999 if(s_pmapMsgHook != NULL)
1001 DWORD dwThreadID = ::GetCurrentThreadId();
1002 _MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID);
1005 ATLTRY(pData =
new _MsgHookData);
1006 ATLASSERT(pData != NULL);
1007 HHOOK hMsgHook = ::SetWindowsHookEx(WH_GETMESSAGE, MessageHookProc, ModuleHelper::GetModuleInstance(), dwThreadID);
1008 ATLASSERT(hMsgHook != NULL);
1009 if(pData != NULL && hMsgHook != NULL)
1011 pData->hMsgHook = hMsgHook;
1013 BOOL bRet = s_pmapMsgHook->Add(dwThreadID, pData);
1026 #if (WINVER >= 0x0500) 1027 m_bLayoutRTL = ((GetExStyle() & WS_EX_LAYOUTRTL) != 0);
1028 #endif // (WINVER >= 0x0500) 1033 LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
1035 LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
1037 #if _WTL_CMDBAR_VISTA_MENUS 1038 if(m_bVistaMenus && (m_hMenu != NULL))
1040 T* pT =
static_cast<T*
>(
this);
1041 pT->_RemoveVistaBitmapsFromMenu();
1044 for(
int i = 0; i < m_arrVistaBitmap.GetSize(); i++)
1046 if(m_arrVistaBitmap[i] != NULL)
1047 ::DeleteObject(m_arrVistaBitmap[i]);
1049 #endif // _WTL_CMDBAR_VISTA_MENUS 1055 if(FAILED(lock.Lock()))
1057 ATLTRACE2(atlTraceUI, 0, _T(
"ERROR : Unable to lock critical section in CCommandBarCtrlImpl::OnDestroy.\n"));
1062 if(s_pmapMsgHook != NULL)
1064 DWORD dwThreadID = ::GetCurrentThreadId();
1065 _MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID);
1069 if(pData->dwUsage == 0)
1071 BOOL bRet = ::UnhookWindowsHookEx(pData->hMsgHook);
1073 bRet = s_pmapMsgHook->Remove(dwThreadID);
1079 if(s_pmapMsgHook->GetSize() == 0)
1081 delete s_pmapMsgHook;
1082 s_pmapMsgHook = NULL;
1092 LRESULT OnKeyDown(UINT , WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1094 #ifdef _CMDBAR_EXTRA_TRACE 1095 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnKeyDown\n"));
1099 if(wParam == VK_SPACE)
1101 m_wndParent.PostMessage(WM_SYSKEYDOWN, wParam, lParam | (1 << 29));
1104 #if (_WIN32_IE >= 0x0500) 1105 else if(wParam == VK_LEFT || wParam == VK_RIGHT)
1107 WPARAM wpNext = m_bLayoutRTL ? VK_LEFT : VK_RIGHT;
1111 T* pT =
static_cast<T*
>(
this);
1112 int nBtn = GetHotItem();
1113 int nNextBtn = (wParam == wpNext) ? pT->GetNextMenuItem(nBtn) : pT->GetPreviousMenuItem(nBtn);
1117 if(pT->DisplayChevronMenu())
1122 #endif // (_WIN32_IE >= 0x0500) 1126 LRESULT OnKeyUp(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1128 #ifdef _CMDBAR_EXTRA_TRACE 1129 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnKeyUp\n"));
1131 if(wParam != VK_SPACE)
1136 LRESULT OnChar(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1138 #ifdef _CMDBAR_EXTRA_TRACE 1139 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnChar\n"));
1141 if(wParam != VK_SPACE)
1146 if(!m_wndParent.IsWindowEnabled() || ::GetFocus() != m_hWnd)
1151 if(wParam != VK_RETURN && !MapAccelerator((TCHAR)LOWORD(wParam), nBtn))
1153 #if (_WIN32_IE >= 0x0500) 1154 if((TCHAR)LOWORD(wParam) != _chChevronShortcut)
1160 #if (_WIN32_IE >= 0x0500) 1161 RECT rcClient = { 0 };
1162 GetClientRect(&rcClient);
1164 GetItemRect(nBtn, &rcBtn);
1165 TBBUTTON tbb = { 0 };
1166 GetButton(nBtn, &tbb);
1167 if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0 && rcBtn.right <= rcClient.right)
1169 #endif // (_WIN32_IE >= 0x0500) 1170 PostMessage(WM_KEYDOWN, VK_DOWN, 0L);
1171 if(wParam != VK_RETURN)
1173 #if (_WIN32_IE >= 0x0500) 1180 #endif // (_WIN32_IE >= 0x0500) 1185 LRESULT OnSysKeyDown(UINT , WPARAM , LPARAM , BOOL& bHandled)
1187 #ifdef _CMDBAR_EXTRA_TRACE 1188 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnSysKeyDown\n"));
1194 LRESULT OnSysKeyUp(UINT , WPARAM , LPARAM , BOOL& bHandled)
1196 #ifdef _CMDBAR_EXTRA_TRACE 1197 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnSysKeyUp\n"));
1203 LRESULT OnSysChar(UINT , WPARAM , LPARAM , BOOL& bHandled)
1205 #ifdef _CMDBAR_EXTRA_TRACE 1206 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnSysChar\n"));
1212 LRESULT OnEraseBackground(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1214 if(m_bAttachedMenu || (m_dwExtendedStyle & CBR_EX_TRANSPARENT))
1222 GetClientRect(&rect);
1223 dc.FillRect(&rect, COLOR_MENU);
1228 LRESULT OnInitMenu(UINT , WPARAM , LPARAM , BOOL& bHandled)
1230 int nIndex = GetHotItem();
1231 SendMessage(WM_MENUSELECT, MAKEWPARAM(nIndex, MF_POPUP|MF_HILITE), (LPARAM)m_hMenu);
1236 LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1238 if((BOOL)HIWORD(lParam))
1244 if(!(m_bAttachedMenu || m_bMenuActive))
1250 #ifdef _CMDBAR_EXTRA_TRACE 1251 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnInitMenuPopup\n"));
1256 lRet = DefWindowProc(uMsg, wParam, (lParam || m_bContextMenu) ? lParam : GetHotItem());
1258 lRet = m_wndParent.DefWindowProc(uMsg, wParam, (lParam || m_bContextMenu) ? lParam : GetHotItem());
1260 #if _WTL_CMDBAR_VISTA_MENUS 1265 ATLASSERT(menu.m_hMenu != NULL);
1267 for(
int i = 0; i < menu.GetMenuItemCount(); i++)
1269 WORD nID = (WORD)menu.GetMenuItemID(i);
1270 int nIndex = m_arrCommand.Find(nID);
1273 mii.fMask = MIIM_BITMAP;
1274 mii.hbmpItem = (m_bImagesVisible && (nIndex != -1)) ? m_arrVistaBitmap[nIndex] : NULL;
1275 menu.SetMenuItemInfo(i, TRUE, &mii);
1280 #endif // _WTL_CMDBAR_VISTA_MENUS 1283 if(m_bImagesVisible)
1286 ATLASSERT(menuPopup.m_hMenu != NULL);
1288 T* pT =
static_cast<T*
>(
this);
1290 TCHAR szString[pT->_nMaxMenuItemTextLength] = { 0 };
1292 for(
int i = 0; i < menuPopup.GetMenuItemCount(); i++)
1295 mii.cch = pT->_nMaxMenuItemTextLength;
1296 mii.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE;
1297 mii.dwTypeData = szString;
1298 bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii);
1301 if(!(mii.fType & MFT_OWNERDRAW))
1303 mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE;
1306 ATLASSERT(pMI != NULL);
1309 pMI->fType = mii.fType;
1310 pMI->fState = mii.fState;
1311 mii.fType |= MFT_OWNERDRAW;
1313 for(
int j = 0; j < m_arrCommand.GetSize(); j++)
1315 if(m_arrCommand[j] == mii.wID)
1321 int cchLen = lstrlen(szString) + 1;
1322 pMI->lpstrText = NULL;
1323 ATLTRY(pMI->lpstrText =
new TCHAR[cchLen]);
1324 ATLASSERT(pMI->lpstrText != NULL);
1325 if(pMI->lpstrText != NULL)
1326 SecureHelper::strcpy_x(pMI->lpstrText, cchLen, szString);
1327 mii.dwItemData = (ULONG_PTR)pMI;
1328 bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii);
1335 m_stackMenuHandle.Push(menuPopup.m_hMenu);
1341 LRESULT OnMenuSelect(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1343 if(!m_bAttachedMenu)
1345 m_bPopupItem = (lParam != NULL) && ((HMENU)lParam != m_hMenu) && (HIWORD(wParam) & MF_POPUP);
1346 if(m_wndParent.IsWindow())
1347 m_wndParent.SendMessage(uMsg, wParam, lParam);
1353 if(HIWORD(wParam) == 0xFFFF && lParam == NULL)
1355 #ifdef _CMDBAR_EXTRA_TRACE 1356 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnMenuSelect - CLOSING!!!!\n"));
1358 ATLASSERT(m_stackMenuWnd.GetSize() == 0);
1360 if(m_bImagesVisible)
1363 while((hMenu = m_stackMenuHandle.Pop()) != NULL)
1366 ATLASSERT(menuPopup.m_hMenu != NULL);
1369 for(
int i = 0; i < menuPopup.GetMenuItemCount(); i++)
1372 mii.fMask = MIIM_DATA | MIIM_TYPE;
1373 bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii);
1377 if(pMI != NULL && pMI->IsCmdBarMenuItem())
1379 mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE;
1380 mii.fType = pMI->fType;
1381 mii.dwTypeData = pMI->lpstrText;
1382 mii.cch = lstrlen(pMI->lpstrText);
1383 mii.dwItemData = NULL;
1385 bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii);
1388 delete [] pMI->lpstrText;
1389 pMI->dwMagic = 0x6666;
1401 LRESULT OnInternalAutoPopup(UINT , WPARAM wParam, LPARAM , BOOL& )
1403 int nIndex = (int)wParam;
1404 T* pT =
static_cast<T*
>(
this);
1405 pT->DoPopupMenu(nIndex,
false);
1409 LRESULT OnInternalGetBar(UINT , WPARAM wParam, LPARAM , BOOL& )
1412 if((LPVOID)wParam != NULL)
1413 *((DWORD*)wParam) = GetCurrentProcessId();
1414 if(IsWindowVisible())
1420 LRESULT OnSettingChange(UINT , WPARAM wParam, LPARAM , BOOL& )
1422 #ifndef SPI_GETKEYBOARDCUES 1423 const UINT SPI_SETKEYBOARDCUES = 0x100B;
1424 #endif // !SPI_GETKEYBOARDCUES 1425 #ifndef SPI_GETFLATMENU 1426 const UINT SPI_SETFLATMENU = 0x1023;
1427 #endif // !SPI_GETFLATMENU 1429 if(wParam == SPI_SETNONCLIENTMETRICS || wParam == SPI_SETKEYBOARDCUES || wParam == SPI_SETFLATMENU)
1431 T* pT =
static_cast<T*
>(
this);
1432 pT->GetSystemSettings();
1438 LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
1440 LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
1442 LPWINDOWPOS lpWP = (LPWINDOWPOS)lParam;
1443 int cyMin = ::GetSystemMetrics(SM_CYMENU);
1444 if(lpWP->cy < cyMin)
1450 LRESULT OnMenuChar(UINT , WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1452 #ifdef _CMDBAR_EXTRA_TRACE 1453 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnMenuChar\n"));
1456 T* pT =
static_cast<T*
>(
this);
1459 if(m_bMenuActive && LOWORD(wParam) != 0x0D)
1462 lRet = MAKELRESULT(1, 1);
1464 if(m_bMenuActive && HIWORD(wParam) == MF_POPUP)
1467 TCHAR ch = (TCHAR)LOWORD(wParam);
1469 int nCount = ::GetMenuItemCount(menu);
1470 int nRetCode = MNC_EXECUTE;
1472 TCHAR szString[pT->_nMaxMenuItemTextLength] = { 0 };
1474 bool bFound =
false;
1475 for(
int i = 0; i < nCount; i++)
1478 mii.cch = pT->_nMaxMenuItemTextLength;
1479 mii.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE;
1480 mii.dwTypeData = szString;
1481 bRet = menu.GetMenuItemInfo(i, TRUE, &mii);
1482 if(!bRet || (mii.fType & MFT_SEPARATOR))
1485 if(pmd != NULL && pmd->IsCmdBarMenuItem())
1487 LPTSTR p = pmd->lpstrText;
1491 while(*p && *p != _T(
'&'))
1495 DWORD dwP = MAKELONG(*(++p), 0);
1496 DWORD dwC = MAKELONG(ch, 0);
1497 if(::CharLower((LPTSTR)ULongToPtr(dwP)) == ::CharLower((LPTSTR)ULongToPtr(dwC)))
1506 nRetCode = MNC_SELECT;
1516 if(nRetCode == MNC_EXECUTE)
1518 PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
1519 pT->GiveFocusBack();
1522 lRet = MAKELRESULT(wMnem, nRetCode);
1525 else if(!m_bMenuActive)
1528 if(!MapAccelerator((TCHAR)LOWORD(wParam), nBtn))
1531 PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
1532 pT->GiveFocusBack();
1534 #if (_WIN32_IE >= 0x0500) 1536 if((TCHAR)LOWORD(wParam) == pT->_chChevronShortcut)
1538 if(pT->DisplayChevronMenu())
1541 #endif // (_WIN32_IE >= 0x0500) 1543 else if(m_wndParent.IsWindowEnabled())
1545 #if (_WIN32_IE >= 0x0500) 1546 RECT rcClient = { 0 };
1547 GetClientRect(&rcClient);
1549 GetItemRect(nBtn, &rcBtn);
1550 TBBUTTON tbb = { 0 };
1551 GetButton(nBtn, &tbb);
1552 if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0 && rcBtn.right <= rcClient.right)
1554 #endif // (_WIN32_IE >= 0x0500) 1555 if(m_bUseKeyboardCues && !m_bShowKeyboardCues)
1557 m_bAllowKeyboardCues =
true;
1558 ShowKeyboardCues(
true);
1561 PostMessage(WM_KEYDOWN, VK_DOWN, 0L);
1563 #if (_WIN32_IE >= 0x0500) 1569 #endif // (_WIN32_IE >= 0x0500) 1576 LRESULT OnDrawItem(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1578 LPDRAWITEMSTRUCT lpDrawItemStruct = (LPDRAWITEMSTRUCT)lParam;
1580 if(lpDrawItemStruct->CtlType == ODT_MENU && pmd != NULL && pmd->IsCmdBarMenuItem())
1582 T* pT =
static_cast<T*
>(
this);
1583 pT->DrawItem(lpDrawItemStruct);
1589 return (LRESULT)TRUE;
1592 LRESULT OnMeasureItem(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1594 LPMEASUREITEMSTRUCT lpMeasureItemStruct = (LPMEASUREITEMSTRUCT)lParam;
1596 if(lpMeasureItemStruct->CtlType == ODT_MENU && pmd != NULL && pmd->IsCmdBarMenuItem())
1598 T* pT =
static_cast<T*
>(
this);
1599 pT->MeasureItem(lpMeasureItemStruct);
1605 return (LRESULT)TRUE;
1609 LRESULT OnAPIGetMenu(UINT , WPARAM , LPARAM , BOOL& )
1611 return (LRESULT)m_hMenu;
1614 LRESULT OnAPITrackPopupMenu(UINT , WPARAM , LPARAM lParam, BOOL& )
1618 LPCBRPOPUPMENU lpCBRPopupMenu = (LPCBRPOPUPMENU)lParam;
1622 T* pT =
static_cast<T*
>(
this);
1623 return pT->TrackPopupMenu(lpCBRPopupMenu->hMenu, lpCBRPopupMenu->uFlags, lpCBRPopupMenu->x, lpCBRPopupMenu->y, lpCBRPopupMenu->lptpm);
1626 LRESULT OnAPIGetCmdBar(UINT , WPARAM , LPARAM , BOOL& )
1628 return (LRESULT)m_hWnd;
1632 LRESULT OnParentHotItemChange(
int , LPNMHDR pnmh, BOOL& bHandled)
1634 LPNMTBHOTITEM lpNMHT = (LPNMTBHOTITEM)pnmh;
1637 if(pnmh->hwndFrom != m_hWnd)
1643 bool bBlockTracking =
false;
1644 if((m_dwExtendedStyle & CBR_EX_TRACKALWAYS) == 0)
1647 ::GetWindowThreadProcessId(::GetActiveWindow(), &dwProcessID);
1648 bBlockTracking = (::GetCurrentProcessId() != dwProcessID);
1651 if((!m_wndParent.IsWindowEnabled() || bBlockTracking) && (lpNMHT->dwFlags & HICF_MOUSE))
1658 const DWORD HICF_LMOUSE = 0x00000080;
1663 if(!(lpNMHT->dwFlags & HICF_MOUSE)
1664 && !(lpNMHT->dwFlags & HICF_ACCELERATOR)
1665 && !(lpNMHT->dwFlags & HICF_LMOUSE))
1667 if(lpNMHT->dwFlags & HICF_ENTERING)
1668 m_wndParent.SendMessage(WM_MENUSELECT, 0, (LPARAM)m_hMenu);
1669 if(lpNMHT->dwFlags & HICF_LEAVING)
1670 m_wndParent.SendMessage(WM_MENUSELECT, MAKEWPARAM(0, 0xFFFF), NULL);
1677 LRESULT OnParentDropDown(
int , LPNMHDR pnmh, BOOL& bHandled)
1680 if(pnmh->hwndFrom != m_hWnd)
1686 T* pT =
static_cast<T*
>(
this);
1687 if(::GetFocus() != m_hWnd)
1689 LPNMTOOLBAR pNMToolBar = (LPNMTOOLBAR)pnmh;
1690 int nIndex = CommandToIndex(pNMToolBar->iItem);
1691 m_bContextMenu =
false;
1692 m_bEscapePressed =
false;
1693 pT->DoPopupMenu(nIndex,
true);
1695 return TBDDRET_DEFAULT;
1698 LRESULT OnParentInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1700 return OnInitMenuPopup(uMsg, wParam, lParam, bHandled);
1703 LRESULT OnParentInternalGetBar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1705 return OnInternalGetBar(uMsg, wParam, lParam, bHandled);
1708 LRESULT OnParentSysCommand(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1711 if((m_uSysKey == VK_MENU
1712 || (m_uSysKey == VK_F10 && !(::GetKeyState(VK_SHIFT) & 0x80))
1713 || m_uSysKey == VK_SPACE)
1714 && wParam == SC_KEYMENU)
1716 T* pT =
static_cast<T*
>(
this);
1717 if(::GetFocus() == m_hWnd)
1719 pT->GiveFocusBack();
1720 PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
1722 else if(m_uSysKey != VK_SPACE && !m_bSkipMsg)
1724 if(m_bUseKeyboardCues && !m_bShowKeyboardCues && m_bAllowKeyboardCues)
1725 ShowKeyboardCues(
true);
1730 else if(m_uSysKey != VK_SPACE)
1739 LRESULT OnParentAPIGetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1741 return OnAPIGetMenu(uMsg, wParam, lParam, bHandled);
1744 LRESULT OnParentMenuChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1746 return OnMenuChar(uMsg, wParam, lParam, bHandled);
1749 LRESULT OnParentAPITrackPopupMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1751 return OnAPITrackPopupMenu(uMsg, wParam, lParam, bHandled);
1754 LRESULT OnParentAPIGetCmdBar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1756 return OnAPIGetCmdBar(uMsg, wParam, lParam, bHandled);
1759 LRESULT OnParentSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1761 OnSettingChange(uMsg, wParam, lParam, bHandled);
1766 LRESULT OnParentDrawItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1768 return OnDrawItem(uMsg, wParam, lParam, bHandled);
1771 LRESULT OnParentMeasureItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1773 return OnMeasureItem(uMsg, wParam, lParam, bHandled);
1776 LRESULT OnParentActivate(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1778 m_bParentActive = (LOWORD(wParam) != WA_INACTIVE);
1779 if(!m_bParentActive && m_bUseKeyboardCues && m_bShowKeyboardCues)
1781 ShowKeyboardCues(
false);
1792 LRESULT OnParentCustomDraw(
int , LPNMHDR pnmh, BOOL& bHandled)
1794 LRESULT lRet = CDRF_DODEFAULT;
1796 if(pnmh->hwndFrom == m_hWnd)
1798 LPNMTBCUSTOMDRAW lpTBCustomDraw = (LPNMTBCUSTOMDRAW)pnmh;
1799 if(lpTBCustomDraw->nmcd.dwDrawStage == CDDS_PREPAINT)
1801 lRet = CDRF_NOTIFYITEMDRAW;
1804 else if(lpTBCustomDraw->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
1808 #ifndef COLOR_MENUHILIGHT 1809 const int COLOR_MENUHILIGHT = 29;
1810 #endif // !COLOR_MENUHILIGHT 1811 bool bDisabled = ((lpTBCustomDraw->nmcd.uItemState & CDIS_DISABLED) == CDIS_DISABLED);
1812 if(!bDisabled && ((lpTBCustomDraw->nmcd.uItemState & CDIS_HOT) == CDIS_HOT ||
1813 (lpTBCustomDraw->nmcd.uItemState & CDIS_SELECTED) == CDIS_SELECTED))
1815 ::FillRect(lpTBCustomDraw->nmcd.hdc, &lpTBCustomDraw->nmcd.rc, ::GetSysColorBrush(COLOR_MENUHILIGHT));
1816 ::FrameRect(lpTBCustomDraw->nmcd.hdc, &lpTBCustomDraw->nmcd.rc, ::GetSysColorBrush(COLOR_HIGHLIGHT));
1817 lpTBCustomDraw->clrText = ::GetSysColor(m_bParentActive ? COLOR_HIGHLIGHTTEXT : COLOR_GRAYTEXT);
1819 else if(bDisabled || !m_bParentActive)
1821 lpTBCustomDraw->clrText = ::GetSysColor(COLOR_GRAYTEXT);
1823 CDCHandle dc = lpTBCustomDraw->nmcd.hdc;
1824 dc.SetTextColor(lpTBCustomDraw->clrText);
1825 dc.SetBkMode(lpTBCustomDraw->nStringBkMode);
1826 HFONT hFont = GetFont();
1827 HFONT hFontOld = NULL;
1829 hFontOld = dc.SelectFont(hFont);
1830 const int cchText = 200;
1831 TCHAR szText[cchText] = { 0 };
1832 TBBUTTONINFO tbbi = { 0 };
1833 tbbi.cbSize =
sizeof(TBBUTTONINFO);
1834 tbbi.dwMask = TBIF_TEXT;
1835 tbbi.pszText = szText;
1836 tbbi.cchText = cchText;
1837 GetButtonInfo((
int)lpTBCustomDraw->nmcd.dwItemSpec, &tbbi);
1838 dc.DrawText(szText, -1, &lpTBCustomDraw->nmcd.rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX));
1840 dc.SelectFont(hFontOld);
1841 lRet = CDRF_SKIPDEFAULT;
1844 else if(!m_bParentActive)
1846 lpTBCustomDraw->clrText = ::GetSysColor(COLOR_GRAYTEXT);
1855 LRESULT OnHookMouseMove(UINT , WPARAM , LPARAM , BOOL& bHandled)
1857 static POINT s_point = { -1, -1 };
1858 DWORD dwPoint = ::GetMessagePos();
1859 POINT point = { GET_X_LPARAM(dwPoint), GET_Y_LPARAM(dwPoint) };
1864 if(::WindowFromPoint(point) == m_hWnd)
1866 ScreenToClient(&point);
1867 int nHit = HitTest(&point);
1869 if((point.x != s_point.x || point.y != s_point.y) && nHit >= 0 && nHit < ::GetMenuItemCount(m_hMenu) && nHit != m_nPopBtn && m_nPopBtn != -1)
1871 TBBUTTON tbb = { 0 };
1872 GetButton(nHit, &tbb);
1873 if((tbb.fsState & TBSTATE_ENABLED) != 0)
1875 m_nNextPopBtn = nHit | 0xFFFF0000;
1876 HWND hWndMenu = m_stackMenuWnd.GetCurrent();
1877 ATLASSERT(hWndMenu != NULL);
1880 ::PostMessage(hWndMenu, WM_LBUTTONUP, 0, MAKELPARAM(point.x, point.y));
1882 ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L);
1891 ScreenToClient(&point);
1898 LRESULT OnHookSysKeyDown(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1901 #ifdef _CMDBAR_EXTRA_TRACE 1902 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Hook WM_SYSKEYDOWN (0x%2.2X)\n"), wParam);
1905 if(wParam == VK_MENU && m_bParentActive && m_bUseKeyboardCues && !m_bShowKeyboardCues && m_bAllowKeyboardCues)
1906 ShowKeyboardCues(
true);
1908 if(wParam != VK_SPACE && !m_bMenuActive && ::GetFocus() == m_hWnd)
1910 m_bAllowKeyboardCues =
false;
1911 PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
1912 T* pT =
static_cast<T*
>(
this);
1913 pT->GiveFocusBack();
1918 if(wParam == VK_SPACE && m_bUseKeyboardCues && m_bShowKeyboardCues)
1920 m_bAllowKeyboardCues =
true;
1921 ShowKeyboardCues(
false);
1923 m_uSysKey = (UINT)wParam;
1928 LRESULT OnHookSysKeyUp(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1930 if(!m_bAllowKeyboardCues)
1931 m_bAllowKeyboardCues =
true;
1934 #ifdef _CMDBAR_EXTRA_TRACE 1935 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Hook WM_SYSKEYUP (0x%2.2X)\n"), wParam);
1940 LRESULT OnHookSysChar(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1943 #ifdef _CMDBAR_EXTRA_TRACE 1944 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Hook WM_SYSCHAR (0x%2.2X)\n"), wParam);
1947 if(!m_bMenuActive && m_hWndHook != m_hWnd && wParam != VK_SPACE)
1952 LRESULT OnHookKeyDown(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1954 #ifdef _CMDBAR_EXTRA_TRACE 1955 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Hook WM_KEYDOWN (0x%2.2X)\n"), wParam);
1958 T* pT =
static_cast<T*
>(
this);
1960 if(wParam == VK_ESCAPE && m_stackMenuWnd.GetSize() <= 1)
1962 if(m_bMenuActive && !m_bContextMenu)
1964 int nHot = GetHotItem();
1972 m_bEscapePressed =
true;
1973 m_bSkipPostDown =
false;
1975 else if(::GetFocus() == m_hWnd && m_wndParent.IsWindow())
1978 pT->GiveFocusBack();
1982 else if(wParam == VK_RETURN || wParam == VK_UP || wParam == VK_DOWN)
1984 if(!m_bMenuActive && ::GetFocus() == m_hWnd && m_wndParent.IsWindow())
1986 int nHot = GetHotItem();
1989 if(wParam != VK_RETURN)
1991 if(!m_bSkipPostDown)
1994 #if (_WIN32_IE < 0x0500) 1995 DWORD dwMajor = 0, dwMinor = 0;
1996 ATL::AtlGetCommCtrlVersion(&dwMajor, &dwMinor);
1997 if(dwMajor <= 4 || (dwMajor == 5 && dwMinor < 80))
2000 GetItemRect(nHot, &rect);
2001 PostMessage(WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(rect.left, rect.top));
2003 #endif // (_WIN32_IE < 0x0500) 2004 PostMessage(WM_KEYDOWN, VK_DOWN, 0L);
2005 m_bSkipPostDown =
true;
2009 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - skipping posting another VK_DOWN\n"));
2010 m_bSkipPostDown =
false;
2016 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Can't find hot button\n"));
2019 if(wParam == VK_RETURN && m_bMenuActive)
2021 PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
2023 pT->GiveFocusBack();
2026 else if(wParam == VK_LEFT || wParam == VK_RIGHT)
2028 WPARAM wpNext = m_bLayoutRTL ? VK_LEFT : VK_RIGHT;
2029 WPARAM wpPrev = m_bLayoutRTL ? VK_RIGHT : VK_LEFT;
2031 if(m_bMenuActive && !m_bContextMenu && !(wParam == wpNext && m_bPopupItem))
2033 bool bAction =
false;
2034 if(wParam == wpPrev && s_pCurrentBar->m_stackMenuWnd.GetSize() == 1)
2036 m_nNextPopBtn = pT->GetPreviousMenuItem(m_nPopBtn);
2037 if(m_nNextPopBtn != -1)
2040 else if(wParam == wpNext)
2042 m_nNextPopBtn = pT->GetNextMenuItem(m_nPopBtn);
2043 if(m_nNextPopBtn != -1)
2046 HWND hWndMenu = m_stackMenuWnd.GetCurrent();
2047 ATLASSERT(hWndMenu != NULL);
2052 ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L);
2053 if(wParam == wpNext)
2055 int cItem = m_stackMenuWnd.GetSize() - 1;
2058 hWndMenu = m_stackMenuWnd[cItem];
2059 if(hWndMenu != NULL)
2060 ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L);
2064 #if (_WIN32_IE >= 0x0500) 2065 if(m_nNextPopBtn == -2)
2068 pT->DisplayChevronMenu();
2070 #endif // (_WIN32_IE >= 0x0500) 2078 LRESULT OnHookNextMenu(UINT , WPARAM , LPARAM , BOOL& bHandled)
2080 #ifdef _CMDBAR_EXTRA_TRACE 2081 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Hook WM_NEXTMENU\n"));
2087 LRESULT OnHookChar(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
2089 #ifdef _CMDBAR_EXTRA_TRACE 2090 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Hook WM_CHAR (0x%2.2X)\n"), wParam);
2092 bHandled = (wParam == VK_ESCAPE);
2097 void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
2099 T* pT =
static_cast<T*
>(
this);
2101 pT->DrawItemFlat(lpDrawItemStruct);
2103 pT->DrawItem3D(lpDrawItemStruct);
2107 void DrawItem3D(LPDRAWITEMSTRUCT lpDrawItemStruct)
2111 const RECT& rcItem = lpDrawItemStruct->rcItem;
2112 T* pT = static_cast<T*>(
this);
2114 if(pmd->fType & MFT_SEPARATOR)
2118 rc.top += (rc.bottom - rc.top) / 2;
2119 dc.DrawEdge(&rc, EDGE_ETCHED, BF_TOP);
2123 BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED;
2124 BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED;
2125 BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED;
2126 BOOL bHasImage = FALSE;
2128 if(LOWORD(lpDrawItemStruct->itemID) == (WORD)-1)
2130 RECT rcButn = { rcItem.left, rcItem.top, rcItem.left + m_szButton.cx, rcItem.top + m_szButton.cy };
2131 ::OffsetRect(&rcButn, 0, ((rcItem.bottom - rcItem.top) - (rcButn.bottom - rcButn.top)) / 2);
2133 int iButton = pmd->iButton;
2139 SIZE sz = { rcButn.right - rcButn.left - m_szBitmap.cx, rcButn.bottom - rcButn.top - m_szBitmap.cy };
2142 POINT point = { rcButn.left + sz.cx, rcButn.top + sz.cy };
2145 if(!bChecked || (bSelected && !bDisabled))
2148 dc.FillRect(&rcButn, (bChecked && !bSelected) ? COLOR_3DLIGHT : COLOR_MENU);
2150 dc.FillRect(&rcButn, COLOR_MENU);
2154 COLORREF crTxt = dc.SetTextColor(::GetSysColor(COLOR_BTNFACE));
2155 COLORREF crBk = dc.SetBkColor(::GetSysColor(COLOR_BTNHILIGHT));
2156 CBrush hbr(CDCHandle::GetHalftoneBrush());
2157 dc.SetBrushOrg(rcButn.left, rcButn.top);
2158 dc.FillRect(&rcButn, hbr);
2159 dc.SetTextColor(crTxt);
2160 dc.SetBkColor(crBk);
2167 if(bSelected || bChecked)
2170 dc.DrawEdge(&rc2, bChecked ? BDR_SUNKENOUTER : BDR_RAISEDINNER, BF_RECT);
2173 ::ImageList_Draw(m_hImageList, iButton, dc, point.x, point.y, ILD_TRANSPARENT);
2177 HBRUSH hBrushBackground = bChecked ? NULL : ::GetSysColorBrush(COLOR_MENU);
2178 pT->DrawBitmapDisabled(dc, iButton, point, hBrushBackground);
2185 info.fMask = MIIM_CHECKMARKS | MIIM_TYPE;
2186 ::GetMenuItemInfo((HMENU)lpDrawItemStruct->hwndItem, lpDrawItemStruct->itemID, MF_BYCOMMAND, &info);
2187 if(bChecked || info.hbmpUnchecked != NULL)
2189 BOOL bRadio = ((info.fType & MFT_RADIOCHECK) != 0);
2190 bHasImage = pT->DrawCheckmark(dc, rcButn, bSelected, bDisabled, bRadio, bChecked ? info.hbmpChecked : info.hbmpUnchecked);
2195 int cxButn = m_szButton.cx;
2196 COLORREF colorBG = ::GetSysColor(bSelected ? COLOR_HIGHLIGHT : COLOR_MENU);
2197 if(bSelected || lpDrawItemStruct->itemAction == ODA_SELECT)
2201 rcBG.left += cxButn + s_kcxGap;
2202 dc.FillRect(&rcBG, bSelected ? COLOR_HIGHLIGHT : COLOR_MENU);
2206 RECT rcText = rcItem;
2207 rcText.left += cxButn + s_kcxGap + s_kcxTextMargin;
2208 rcText.right -= cxButn;
2209 dc.SetBkMode(TRANSPARENT);
2210 COLORREF colorText = ::GetSysColor(bDisabled ? (bSelected ? COLOR_GRAYTEXT : COLOR_3DSHADOW) : (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT));
2213 if(bDisabled && (!bSelected || colorText == colorBG))
2216 RECT rcDisabled = rcText;
2217 ::OffsetRect(&rcDisabled, 1, 1);
2218 pT->DrawMenuText(dc, rcDisabled, pmd->lpstrText, ::GetSysColor(COLOR_3DHILIGHT));
2220 pT->DrawMenuText(dc, rcText, pmd->lpstrText, colorText);
2224 void DrawItemFlat(LPDRAWITEMSTRUCT lpDrawItemStruct)
2228 const RECT& rcItem = lpDrawItemStruct->rcItem;
2229 T* pT = static_cast<T*>(
this);
2231 #ifndef COLOR_MENUHILIGHT 2232 const int COLOR_MENUHILIGHT = 29;
2233 #endif // !COLOR_MENUHILIGHT 2235 BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED;
2236 BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED;
2237 BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED;
2240 if(bSelected || lpDrawItemStruct->itemAction == ODA_SELECT)
2244 dc.FillRect(&rcItem, ::GetSysColorBrush(COLOR_MENUHILIGHT));
2245 dc.FrameRect(&rcItem, ::GetSysColorBrush(COLOR_HIGHLIGHT));
2249 dc.FillRect(&rcItem, ::GetSysColorBrush(COLOR_MENU));
2253 if(pmd->fType & MFT_SEPARATOR)
2257 rc.top += (rc.bottom - rc.top) / 2;
2258 dc.DrawEdge(&rc, EDGE_ETCHED, BF_TOP);
2262 if(LOWORD(lpDrawItemStruct->itemID) == (WORD)-1)
2264 RECT rcButn = { rcItem.left, rcItem.top, rcItem.left + m_szButton.cx, rcItem.top + m_szButton.cy };
2265 ::OffsetRect(&rcButn, 0, ((rcItem.bottom - rcItem.top) - (rcButn.bottom - rcButn.top)) / 2);
2270 RECT rcCheck = rcButn;
2271 ::InflateRect(&rcCheck, -1, -1);
2273 dc.FillRect(&rcCheck, ::GetSysColorBrush(COLOR_MENU));
2274 dc.FrameRect(&rcCheck, ::GetSysColorBrush(COLOR_HIGHLIGHT));
2277 int iButton = pmd->iButton;
2281 SIZE sz = { rcButn.right - rcButn.left - m_szBitmap.cx, rcButn.bottom - rcButn.top - m_szBitmap.cy };
2284 POINT point = { rcButn.left + sz.cx, rcButn.top + sz.cy };
2289 ::ImageList_Draw(m_hImageList, iButton, dc, point.x, point.y, ILD_TRANSPARENT);
2293 HBRUSH hBrushBackground = ::GetSysColorBrush((bSelected && !(bDisabled && bChecked)) ? COLOR_MENUHILIGHT : COLOR_MENU);
2294 HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW);
2295 pT->DrawBitmapDisabled(dc, iButton, point, hBrushBackground, hBrushBackground, hBrushDisabledImage);
2302 info.fMask = MIIM_CHECKMARKS | MIIM_TYPE;
2303 ::GetMenuItemInfo((HMENU)lpDrawItemStruct->hwndItem, lpDrawItemStruct->itemID, MF_BYCOMMAND, &info);
2304 if(bChecked || info.hbmpUnchecked != NULL)
2306 BOOL bRadio = ((info.fType & MFT_RADIOCHECK) != 0);
2307 pT->DrawCheckmark(dc, rcButn, bSelected, bDisabled, bRadio, bChecked ? info.hbmpChecked : info.hbmpUnchecked);
2312 int cxButn = m_szButton.cx;
2314 RECT rcText = rcItem;
2315 rcText.left += cxButn + s_kcxGap + s_kcxTextMargin;
2316 rcText.right -= cxButn;
2317 dc.SetBkMode(TRANSPARENT);
2318 COLORREF colorText = ::GetSysColor(bDisabled ? (bSelected ? COLOR_GRAYTEXT : COLOR_3DSHADOW) : (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT));
2320 pT->DrawMenuText(dc, rcText, pmd->lpstrText, colorText);
2324 void DrawMenuText(
CDCHandle& dc, RECT& rc, LPCTSTR lpstrText, COLORREF color)
2327 for(
int i = 0; i < lstrlen(lpstrText); i++)
2329 if(lpstrText[i] == _T(
'\t'))
2335 dc.SetTextColor(color);
2336 dc.DrawText(lpstrText, nTab, &rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX));
2338 dc.DrawText(&lpstrText[nTab + 1], -1, &rc, DT_SINGLELINE | DT_RIGHT | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX));
2341 void DrawBitmapDisabled(
CDCHandle& dc,
int nImage, POINT point,
2342 HBRUSH hBrushBackground = ::GetSysColorBrush(COLOR_3DFACE),
2343 HBRUSH hBrush3DEffect = ::GetSysColorBrush(COLOR_3DHILIGHT),
2344 HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW))
2346 #if (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) 2349 IMAGELISTDRAWPARAMS ildp = { 0 };
2350 ildp.cbSize =
sizeof(IMAGELISTDRAWPARAMS);
2351 ildp.himl = m_hImageList;
2360 ildp.fStyle = ILD_TRANSPARENT;
2361 ildp.fState = ILS_SATURATE;
2363 ::ImageList_DrawIndirect(&ildp);
2366 #endif // (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) 2370 dcMem.CreateCompatibleDC(dc);
2373 bmp.CreateCompatibleBitmap(dc, m_szBitmap.cx, m_szBitmap.cy);
2374 ATLASSERT(bmp.m_hBitmap != NULL);
2376 HBITMAP hBmpOld = dcMem.SelectBitmap(bmp);
2377 dcMem.PatBlt(0, 0, m_szBitmap.cx, m_szBitmap.cy, WHITENESS);
2380 UINT uDrawStyle = (::GetSysColor(COLOR_BTNTEXT) == RGB(255, 255, 255)) ? ILD_MASK : ILD_NORMAL;
2381 ::ImageList_Draw(m_hImageList, nImage, dcMem, 0, 0, uDrawStyle);
2382 dc.DitherBlt(point.x, point.y, m_szBitmap.cx, m_szBitmap.cy, dcMem, NULL, 0, 0, hBrushBackground, hBrush3DEffect, hBrushDisabledImage);
2383 dcMem.SelectBitmap(hBmpOld);
2388 BOOL Draw3DCheckmark(
CDCHandle& dc,
const RECT& rc, BOOL bSelected, BOOL bDisabled, BOOL bRadio, HBITMAP hBmpCheck)
2390 return DrawCheckmark(dc, rc, bSelected, bDisabled, bRadio, hBmpCheck);
2393 BOOL DrawCheckmark(
CDCHandle& dc,
const RECT& rc, BOOL bSelected, BOOL bDisabled, BOOL bRadio, HBITMAP hBmpCheck)
2396 SIZE size = { 0, 0 };
2398 if(hBmpCheck != NULL)
2404 size.cx = ::GetSystemMetrics(SM_CXMENUCHECK);
2405 size.cy = ::GetSystemMetrics(SM_CYMENUCHECK);
2406 bmp.CreateCompatibleBitmap(dc, size.cx, size.cy);
2407 ATLASSERT(bmp.m_hBitmap != NULL);
2411 if((rc.right - rc.left) > size.cx)
2413 rcDest.left = rc.left + (rc.right - rc.left - size.cx) / 2;
2414 rcDest.right = rcDest.left + size.cx;
2416 if((rc.bottom - rc.top) > size.cy)
2418 rcDest.top = rc.top + (rc.bottom - rc.top - size.cy) / 2;
2419 rcDest.bottom = rcDest.top + size.cy;
2424 if(bSelected && !bDisabled)
2426 dc.FillRect(&rcDest, COLOR_MENU);
2430 COLORREF clrTextOld = dc.SetTextColor(::GetSysColor(COLOR_BTNFACE));
2431 COLORREF clrBkOld = dc.SetBkColor(::GetSysColor(COLOR_BTNHILIGHT));
2432 CBrush hbr(CDCHandle::GetHalftoneBrush());
2433 dc.SetBrushOrg(rcDest.left, rcDest.top);
2434 dc.FillRect(&rcDest, hbr);
2435 dc.SetTextColor(clrTextOld);
2436 dc.SetBkColor(clrBkOld);
2442 dcSource.CreateCompatibleDC(dc);
2443 HBITMAP hBmpOld = dcSource.SelectBitmap(bmp);
2445 const COLORREF clrBlack = RGB(0, 0, 0);
2446 const COLORREF clrWhite = RGB(255, 255, 255);
2447 COLORREF clrTextOld = dc.SetTextColor(clrBlack);
2448 COLORREF clrBkOld = dc.SetBkColor(clrWhite);
2451 dcMask.CreateCompatibleDC(dc);
2453 bmpMask.CreateBitmap(size.cx, size.cy, 1, 1, NULL);
2454 HBITMAP hBmpOld1 = dcMask.SelectBitmap(bmpMask);
2457 int cx = rcDest.right - rcDest.left;
2458 int cy = rcDest.bottom - rcDest.top;
2459 if(hBmpCheck != NULL)
2462 dcSource.SetBkColor(m_clrMask);
2463 dcMask.SetBkColor(clrBlack);
2464 dcMask.SetTextColor(clrWhite);
2465 dcMask.BitBlt(0, 0, size.cx, size.cy, dcSource, 0, 0, SRCCOPY);
2467 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, SRCINVERT);
2468 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, SRCAND);
2469 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, SRCINVERT);
2473 const DWORD ROP_DSno = 0x00BB0226L;
2474 const DWORD ROP_DSa = 0x008800C6L;
2475 const DWORD ROP_DSo = 0x00EE0086L;
2476 const DWORD ROP_DSna = 0x00220326L;
2479 RECT rcSource = { 0, 0, min(size.cx, rc.right - rc.left), min(size.cy, rc.bottom - rc.top) };
2480 dcMask.DrawFrameControl(&rcSource, DFC_MENU, bRadio ? DFCS_MENUBULLET : DFCS_MENUCHECK);
2483 if(!m_bFlatMenus && bDisabled)
2486 int x = rcDest.left + 1;
2487 int y = rcDest.top + 1;
2489 const int nColor = COLOR_3DHILIGHT;
2490 dcSource.FillRect(&rcSource, nColor);
2492 COLORREF clrCheck = ::GetSysColor(nColor);
2493 if(clrCheck == clrWhite)
2495 dc.BitBlt(x, y, cx, cy, dcMask, 0, 0, ROP_DSno);
2496 dc.BitBlt(x, y, cx, cy, dcSource, 0, 0, ROP_DSa);
2500 if(clrCheck != clrBlack)
2502 ATLASSERT(dcSource.GetTextColor() == clrBlack);
2503 ATLASSERT(dcSource.GetBkColor() == clrWhite);
2504 dcSource.BitBlt(0, 0, size.cx, size.cy, dcMask, 0, 0, ROP_DSna);
2506 dc.BitBlt(x, y, cx, cy, dcMask, 0, 0, ROP_DSa);
2507 dc.BitBlt(x, y, cx, cy, dcSource, 0, 0, ROP_DSo);
2512 const int nColor = bDisabled ? COLOR_BTNSHADOW : COLOR_MENUTEXT;
2513 dcSource.FillRect(&rcSource, nColor);
2515 COLORREF clrCheck = ::GetSysColor(nColor);
2516 if(clrCheck == clrWhite)
2518 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, ROP_DSno);
2519 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, ROP_DSa);
2523 if(clrCheck != clrBlack)
2525 ATLASSERT(dcSource.GetTextColor() == clrBlack);
2526 ATLASSERT(dcSource.GetBkColor() == clrWhite);
2527 dcSource.BitBlt(0, 0, size.cx, size.cy, dcMask, 0, 0, ROP_DSna);
2529 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, ROP_DSa);
2530 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, ROP_DSo);
2534 dc.SetTextColor(clrTextOld);
2535 dc.SetBkColor(clrBkOld);
2536 dcSource.SelectBitmap(hBmpOld);
2537 dcMask.SelectBitmap(hBmpOld1);
2538 if(hBmpCheck == NULL)
2541 if(!m_bFlatMenus && !bDisabled)
2543 if(rc.right - rc.left > size.cx)
2544 ::InflateRect(&rcDest, 1,1);
2545 dc.DrawEdge(&rcDest, BDR_SUNKENOUTER, BF_RECT);
2551 void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
2555 if(pmd->fType & MFT_SEPARATOR)
2557 lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU) / 2;
2558 lpMeasureItemStruct->itemWidth = 0;
2565 HFONT hOldFont = NULL;
2566 if(pmd->fState & MFS_DEFAULT)
2570 m_fontMenu.GetLogFont(lf);
2572 fontBold.CreateFontIndirect(&lf);
2573 ATLASSERT(fontBold.m_hFont != NULL);
2574 hOldFont = dc.SelectFont(fontBold);
2578 hOldFont = dc.SelectFont(m_fontMenu);
2581 RECT rcText = { 0, 0, 0, 0 };
2582 dc.DrawText(pmd->lpstrText, -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT);
2583 int cx = rcText.right - rcText.left;
2584 dc.SelectFont(hOldFont);
2587 m_fontMenu.GetLogFont(lf);
2588 int cy = lf.lfHeight;
2591 const int cyMargin = 8;
2595 lpMeasureItemStruct->itemHeight = max(cy, (
int)m_szButton.cy);
2598 cx += 2 * s_kcxTextMargin;
2600 cx += 2 * m_szButton.cx;
2601 cx += m_cxExtraSpacing;
2604 cx -= ::GetSystemMetrics(SM_CXMENUCHECK) - 1;
2605 lpMeasureItemStruct->itemWidth = cx;
2610 static LRESULT CALLBACK CreateHookProc(
int nCode, WPARAM wParam, LPARAM lParam)
2612 const int cchClassName = 7;
2613 TCHAR szClassName[cchClassName] = { 0 };
2615 if(nCode == HCBT_CREATEWND)
2617 HWND hWndMenu = (HWND)wParam;
2618 #ifdef _CMDBAR_EXTRA_TRACE 2619 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - HCBT_CREATEWND (HWND = %8.8X)\n"), hWndMenu);
2622 ::GetClassName(hWndMenu, szClassName, cchClassName);
2623 if(!lstrcmp(_T(
"#32768"), szClassName))
2624 s_pCurrentBar->m_stackMenuWnd.Push(hWndMenu);
2626 else if(nCode == HCBT_DESTROYWND)
2628 HWND hWndMenu = (HWND)wParam;
2629 #ifdef _CMDBAR_EXTRA_TRACE 2630 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - HCBT_DESTROYWND (HWND = %8.8X)\n"), hWndMenu);
2633 ::GetClassName(hWndMenu, szClassName, cchClassName);
2634 if(!lstrcmp(_T(
"#32768"), szClassName))
2636 ATLASSERT(hWndMenu == s_pCurrentBar->m_stackMenuWnd.GetCurrent());
2637 s_pCurrentBar->m_stackMenuWnd.Pop();
2641 return ::CallNextHookEx(s_hCreateHook, nCode, wParam, lParam);
2644 static LRESULT CALLBACK MessageHookProc(
int nCode, WPARAM wParam, LPARAM lParam)
2646 LPMSG pMsg = (LPMSG)lParam;
2648 if(nCode == HC_ACTION && wParam == PM_REMOVE && pMsg->message != GetGetBarMessage() && pMsg->message != WM_FORWARDMSG)
2651 HWND hWnd = pMsg->hwnd;
2653 while(pCmdBar == NULL && hWnd != NULL)
2655 pCmdBar = (
CCommandBarCtrlBase*)::SendMessage(hWnd, GetGetBarMessage(), (WPARAM)&dwPID, 0L);
2656 hWnd = ::GetParent(hWnd);
2659 if(pCmdBar != NULL && dwPID == GetCurrentProcessId())
2661 pCmdBar->m_hWndHook = pMsg->hwnd;
2662 ATLASSERT(pCmdBar->IsCommandBarBase());
2664 if(::IsWindow(pCmdBar->m_hWnd))
2665 pCmdBar->SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg);
2667 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Hook skipping message, can't find command bar!\n"));
2672 ATLASSERT(s_pmapMsgHook != NULL);
2673 if(s_pmapMsgHook != NULL)
2675 DWORD dwThreadID = ::GetCurrentThreadId();
2676 _MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID);
2679 lRet = ::CallNextHookEx(pData->hMsgHook, nCode, wParam, lParam);
2686 void DoPopupMenu(
int nIndex,
bool bAnimate)
2688 #ifdef _CMDBAR_EXTRA_TRACE 2689 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - DoPopupMenu, bAnimate = %s\n"), bAnimate ?
"true" :
"false");
2693 #ifndef TPM_VERPOSANIMATION 2694 const UINT TPM_VERPOSANIMATION = 0x1000L;
2696 #ifndef TPM_NOANIMATION 2697 const UINT TPM_NOANIMATION = 0x4000L;
2699 T* pT =
static_cast<T*
>(
this);
2703 GetItemRect(nIndex, &rect);
2704 POINT pt = { rect.left, rect.bottom };
2705 MapWindowPoints(NULL, &pt, 1);
2706 MapWindowPoints(NULL, &rect);
2707 TPMPARAMS TPMParams = { 0 };
2708 TPMParams.cbSize =
sizeof(TPMPARAMS);
2709 TPMParams.rcExclude = rect;
2710 HMENU hMenuPopup = ::GetSubMenu(m_hMenu, nIndex);
2711 ATLASSERT(hMenuPopup != NULL);
2714 TBBUTTON tbb = { 0 };
2715 GetButton(nIndex, &tbb);
2716 int nCmdID = tbb.idCommand;
2721 PressButton(nCmdID, TRUE);
2723 pT->DoTrackPopupMenu(hMenuPopup, TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN |
2724 (s_bW2K ? (bAnimate ? TPM_VERPOSANIMATION : TPM_NOANIMATION) : 0), pt.x, pt.y, &TPMParams);
2725 PressButton(nCmdID, FALSE);
2726 if(::GetFocus() != m_hWnd)
2733 if(::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rect, msg.pt))
2734 ::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE);
2737 if(m_nNextPopBtn != -1)
2739 PostMessage(GetAutoPopupMessage(), m_nNextPopBtn & 0xFFFF);
2740 if(!(m_nNextPopBtn & 0xFFFF0000) && !m_bPopupItem)
2741 PostMessage(WM_KEYDOWN, VK_DOWN, 0);
2746 m_bContextMenu =
false;
2748 if(!m_bEscapePressed)
2750 if(m_bUseKeyboardCues && m_bShowKeyboardCues)
2751 m_bAllowKeyboardCues =
false;
2752 pT->GiveFocusBack();
2757 SetAnchorHighlight(TRUE);
2762 BOOL DoTrackPopupMenu(HMENU hMenu, UINT uFlags,
int x,
int y, LPTPMPARAMS lpParams = NULL)
2767 if(FAILED(lock.Lock()))
2769 ATLTRACE2(atlTraceUI, 0, _T(
"ERROR : Unable to lock critical section in CCommandBarCtrlImpl::DoTrackPopupMenu.\n"));
2774 ATLASSERT(s_hCreateHook == NULL);
2778 s_hCreateHook = ::SetWindowsHookEx(WH_CBT, CreateHookProc, ModuleHelper::GetModuleInstance(), GetCurrentThreadId());
2779 ATLASSERT(s_hCreateHook != NULL);
2781 m_bPopupItem =
false;
2782 m_bMenuActive =
true;
2784 BOOL bTrackRet = menuPopup.TrackPopupMenuEx(uFlags, x, y, m_hWnd, lpParams);
2785 m_bMenuActive =
false;
2787 ::UnhookWindowsHookEx(s_hCreateHook);
2789 s_hCreateHook = NULL;
2790 s_pCurrentBar = NULL;
2795 #ifdef _CMDBAR_EXTRA_TRACE 2796 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - TrackPopupMenu - cleanup\n"));
2799 ATLASSERT(m_stackMenuWnd.GetSize() == 0);
2802 ATL::CWindow wndTL = GetTopLevelParent();
2803 wndTL.UpdateWindow();
2806 if(m_bImagesVisible)
2808 HMENU hMenuSav = NULL;
2809 while((hMenuSav = m_stackMenuHandle.Pop()) != NULL)
2811 menuPopup = hMenuSav;
2814 for(
int i = 0; i < menuPopup.GetMenuItemCount(); i++)
2817 mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID;
2818 bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii);
2822 if(pMI != NULL && pMI->IsCmdBarMenuItem())
2824 mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE;
2825 mii.fType = pMI->fType;
2826 mii.fState = pMI->fState;
2827 mii.dwTypeData = pMI->lpstrText;
2828 mii.cch = lstrlen(pMI->lpstrText);
2829 mii.dwItemData = NULL;
2831 bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii);
2833 menuPopup.ModifyMenu(i, MF_BYPOSITION | mii.fType | mii.fState, mii.wID, pMI->lpstrText);
2836 delete [] pMI->lpstrText;
2845 int GetPreviousMenuItem(
int nBtn)
const 2849 #if (_WIN32_IE >= 0x0500) 2851 GetClientRect(&rcClient);
2852 #endif // (_WIN32_IE >= 0x0500) 2854 for(nNextBtn = nBtn - 1; nNextBtn != nBtn; nNextBtn--)
2857 nNextBtn = ::GetMenuItemCount(m_hMenu) - 1;
2858 TBBUTTON tbb = { 0 };
2859 GetButton(nNextBtn, &tbb);
2860 #if (_WIN32_IE >= 0x0500) 2862 GetItemRect(nNextBtn, &rcBtn);
2863 if(rcBtn.right > rcClient.right)
2868 #endif // (_WIN32_IE >= 0x0500) 2869 if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0)
2872 return (nNextBtn != nBtn) ? nNextBtn : -1;
2875 int GetNextMenuItem(
int nBtn)
const 2879 #if (_WIN32_IE >= 0x0500) 2880 RECT rcClient = { 0 };
2881 GetClientRect(&rcClient);
2882 #endif // (_WIN32_IE >= 0x0500) 2884 int nCount = ::GetMenuItemCount(m_hMenu);
2885 for(nNextBtn = nBtn + 1; nNextBtn != nBtn; nNextBtn++)
2887 if(nNextBtn >= nCount)
2889 TBBUTTON tbb = { 0 };
2890 GetButton(nNextBtn, &tbb);
2891 #if (_WIN32_IE >= 0x0500) 2893 GetItemRect(nNextBtn, &rcBtn);
2894 if(rcBtn.right > rcClient.right)
2899 #endif // (_WIN32_IE >= 0x0500) 2900 if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0)
2903 return (nNextBtn != nBtn) ? nNextBtn : -1;
2906 #if (_WIN32_IE >= 0x0500) 2907 bool DisplayChevronMenu()
2910 HWND hWndReBar = GetParent();
2911 int nCount = (int)::SendMessage(hWndReBar, RB_GETBANDCOUNT, 0, 0L);
2913 for(
int i = 0; i < nCount; i++)
2915 REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_STYLE };
2916 BOOL bRetBandInfo = (BOOL)::SendMessage(hWndReBar, RB_GETBANDINFO, i, (LPARAM)&rbbi);
2917 if(bRetBandInfo && rbbi.hwndChild == m_hWnd)
2919 if((rbbi.fStyle & RBBS_USECHEVRON) != 0)
2921 ::PostMessage(hWndReBar, RB_PUSHCHEVRON, i, 0L);
2922 PostMessage(WM_KEYDOWN, VK_DOWN, 0L);
2930 #endif // (_WIN32_IE >= 0x0500) 2932 void GetSystemSettings()
2935 NONCLIENTMETRICS
info = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };
2936 BOOL bRet = ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
sizeof(info), &info, 0);
2940 LOGFONT logfont = { 0 };
2941 if(m_fontMenu.m_hFont != NULL)
2942 m_fontMenu.GetLogFont(logfont);
2943 if(logfont.lfHeight != info.lfMenuFont.lfHeight ||
2944 logfont.lfWidth != info.lfMenuFont.lfWidth ||
2945 logfont.lfEscapement != info.lfMenuFont.lfEscapement ||
2946 logfont.lfOrientation != info.lfMenuFont.lfOrientation ||
2947 logfont.lfWeight != info.lfMenuFont.lfWeight ||
2948 logfont.lfItalic != info.lfMenuFont.lfItalic ||
2949 logfont.lfUnderline != info.lfMenuFont.lfUnderline ||
2950 logfont.lfStrikeOut != info.lfMenuFont.lfStrikeOut ||
2951 logfont.lfCharSet != info.lfMenuFont.lfCharSet ||
2952 logfont.lfOutPrecision != info.lfMenuFont.lfOutPrecision ||
2953 logfont.lfClipPrecision != info.lfMenuFont.lfClipPrecision ||
2954 logfont.lfQuality != info.lfMenuFont.lfQuality ||
2955 logfont.lfPitchAndFamily != info.lfMenuFont.lfPitchAndFamily ||
2956 lstrcmp(logfont.lfFaceName, info.lfMenuFont.lfFaceName) != 0)
2958 HFONT hFontMenu = ::CreateFontIndirect(&info.lfMenuFont);
2959 ATLASSERT(hFontMenu != NULL);
2960 if(hFontMenu != NULL)
2962 if(m_fontMenu.m_hFont != NULL)
2963 m_fontMenu.DeleteObject();
2964 m_fontMenu.Attach(hFontMenu);
2965 SetFont(m_fontMenu);
2966 AddStrings(_T(
"NS\0"));
2974 HFONT hFontOld = dc.SelectFont(m_fontMenu);
2975 RECT rcText = { 0, 0, 0, 0 };
2976 dc.DrawText(_T(
"\t"), -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT);
2977 if((rcText.right - rcText.left) < 4)
2979 ::SetRectEmpty(&rcText);
2980 dc.DrawText(_T(
"x"), -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT);
2981 m_cxExtraSpacing = rcText.right - rcText.left;
2985 m_cxExtraSpacing = 0;
2987 dc.SelectFont(hFontOld);
2990 OSVERSIONINFO ovi = {
sizeof(OSVERSIONINFO) };
2991 ::GetVersionEx(&ovi);
2994 if(ovi.dwMajorVersion >= 5)
2996 #ifndef SPI_GETKEYBOARDCUES 2997 const UINT SPI_GETKEYBOARDCUES = 0x100A;
2998 #endif // !SPI_GETKEYBOARDCUES 2999 BOOL bRetVal = TRUE;
3000 bRet = ::SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, &bRetVal, 0);
3001 m_bUseKeyboardCues = (bRet && !bRetVal);
3002 m_bAllowKeyboardCues =
true;
3003 ShowKeyboardCues(!m_bUseKeyboardCues);
3007 if((ovi.dwMajorVersion == 5 && ovi.dwMinorVersion >= 1) || (ovi.dwMajorVersion > 5))
3009 #ifndef SPI_GETFLATMENU 3010 const UINT SPI_GETFLATMENU = 0x1022;
3011 #endif // !SPI_GETFLATMENU 3012 BOOL bRetVal = FALSE;
3013 bRet = ::SystemParametersInfo(SPI_GETFLATMENU, 0, &bRetVal, 0);
3014 m_bFlatMenus = (bRet && bRetVal);
3017 #if _WTL_CMDBAR_VISTA_MENUS 3019 bool bVistaMenus = (RunTimeHelper::IsVista() && RunTimeHelper::IsCommCtrl6() && ((m_dwExtendedStyle & CBR_EX_NOVISTAMENUS) == 0));
3023 HMODULE hThemeDLL = ::LoadLibrary(_T(
"uxtheme.dll"));
3024 if(hThemeDLL != NULL)
3026 typedef BOOL (STDAPICALLTYPE *PFN_IsThemeActive)();
3027 PFN_IsThemeActive pfnIsThemeActive = (PFN_IsThemeActive)::GetProcAddress(hThemeDLL,
"IsThemeActive");
3028 ATLASSERT(pfnIsThemeActive != NULL);
3029 bVistaMenus = bVistaMenus && (pfnIsThemeActive != NULL) && (pfnIsThemeActive() != FALSE);
3031 typedef BOOL (STDAPICALLTYPE *PFN_IsAppThemed)();
3032 PFN_IsAppThemed pfnIsAppThemed = (PFN_IsAppThemed)::GetProcAddress(hThemeDLL,
"IsAppThemed");
3033 ATLASSERT(pfnIsAppThemed != NULL);
3034 bVistaMenus = bVistaMenus && (pfnIsAppThemed != NULL) && (pfnIsAppThemed() != FALSE);
3036 ::FreeLibrary(hThemeDLL);
3040 if(!bVistaMenus && m_bVistaMenus && (m_hMenu != NULL) && (m_arrCommand.GetSize() > 0))
3042 T* pT =
static_cast<T*
>(
this);
3043 pT->_RemoveVistaBitmapsFromMenu();
3046 m_bVistaMenus = bVistaMenus;
3047 #endif // _WTL_CMDBAR_VISTA_MENUS 3049 #ifdef _CMDBAR_EXTRA_TRACE 3050 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - GetSystemSettings:\n m_bFlatMenus = %s\n m_bUseKeyboardCues = %s m_bVistaMenus = %s\n"),
3051 m_bFlatMenus ?
"true" :
"false", m_bUseKeyboardCues ?
"true" :
"false", m_bVistaMenus ?
"true" :
"false");
3058 if((m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && m_hWndFocus == NULL)
3059 m_hWndFocus = ::GetFocus();
3063 void GiveFocusBack()
3067 if((m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && ::IsWindow(m_hWndFocus))
3068 ::SetFocus(m_hWndFocus);
3069 else if(!(m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && m_wndParent.IsWindow())
3070 m_wndParent.SetFocus();
3073 SetAnchorHighlight(FALSE);
3074 if(m_bUseKeyboardCues && m_bShowKeyboardCues)
3075 ShowKeyboardCues(
false);
3076 m_bSkipPostDown =
false;
3079 void ShowKeyboardCues(
bool bShow)
3081 m_bShowKeyboardCues = bShow;
3082 SetDrawTextFlags(DT_HIDEPREFIX, m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX);
3088 static UINT GetAutoPopupMessage()
3090 static UINT uAutoPopupMessage = 0;
3091 if(uAutoPopupMessage == 0)
3094 if(FAILED(lock.Lock()))
3096 ATLTRACE2(atlTraceUI, 0, _T(
"ERROR : Unable to lock critical section in CCommandBarCtrlImpl::GetAutoPopupMessage.\n"));
3101 if(uAutoPopupMessage == 0)
3102 uAutoPopupMessage = ::RegisterWindowMessage(_T(
"WTL_CmdBar_InternalAutoPopupMsg"));
3106 ATLASSERT(uAutoPopupMessage != 0);
3107 return uAutoPopupMessage;
3110 static UINT GetGetBarMessage()
3112 static UINT uGetBarMessage = 0;
3113 if(uGetBarMessage == 0)
3116 if(FAILED(lock.Lock()))
3118 ATLTRACE2(atlTraceUI, 0, _T(
"ERROR : Unable to lock critical section in CCommandBarCtrlImpl::GetGetBarMessage.\n"));
3123 if(uGetBarMessage == 0)
3124 uGetBarMessage = ::RegisterWindowMessage(_T(
"WTL_CmdBar_InternalGetBarMsg"));
3128 ATLASSERT(uGetBarMessage != 0);
3129 return uGetBarMessage;
3133 bool CreateInternalImageList(
int cImages)
3135 UINT uFlags = (m_bAlphaImages ? ILC_COLOR32 : ILC_COLOR24) | ILC_MASK;
3136 m_hImageList = ::ImageList_Create(m_szBitmap.cx, m_szBitmap.cy, uFlags, cImages, 1);
3137 ATLASSERT(m_hImageList != NULL);
3138 return (m_hImageList != NULL);
3142 #if _WTL_CMDBAR_VISTA_MENUS 3143 void _AddVistaBitmapsFromImageList(
int nStartIndex,
int nCount)
3148 dcMem.CreateCompatibleDC(dc);
3149 HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();
3151 T* pT =
static_cast<T*
>(
this);
3153 for(
int i = 0; i < nCount; i++)
3155 HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nStartIndex + i, dc, dcMem);
3156 dcMem.SelectBitmap(hBitmapSave);
3157 m_arrVistaBitmap.Add(hBitmap);
3161 void _AddVistaBitmapFromImageList(
int nIndex)
3166 dcMem.CreateCompatibleDC(dc);
3167 HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();
3170 T* pT =
static_cast<T*
>(
this);
3171 HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, dc, dcMem);
3174 dcMem.SelectBitmap(hBitmapSave);
3175 m_arrVistaBitmap.Add(hBitmap);
3178 void _ReplaceVistaBitmapFromImageList(
int nIndex)
3181 if(m_arrVistaBitmap[nIndex] != NULL)
3182 ::DeleteObject(m_arrVistaBitmap[nIndex]);
3187 dcMem.CreateCompatibleDC(dc);
3188 HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();
3191 T* pT =
static_cast<T*
>(
this);
3192 HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, dc, dcMem);
3195 dcMem.SelectBitmap(hBitmapSave);
3196 m_arrVistaBitmap.SetAtIndex(nIndex, hBitmap);
3199 HBITMAP _CreateVistaBitmapHelper(
int nIndex, HDC hDCSource, HDC hDCTarget)
3202 BITMAPINFO bi = { 0 };
3203 bi.bmiHeader.biSize =
sizeof(BITMAPINFOHEADER);
3204 bi.bmiHeader.biWidth = m_szBitmap.cx;
3205 bi.bmiHeader.biHeight = m_szBitmap.cy;
3206 bi.bmiHeader.biPlanes = 1;
3207 bi.bmiHeader.biBitCount = 32;
3208 bi.bmiHeader.biCompression = BI_RGB;
3209 bi.bmiHeader.biSizeImage = 0;
3210 bi.bmiHeader.biXPelsPerMeter = 0;
3211 bi.bmiHeader.biYPelsPerMeter = 0;
3212 bi.bmiHeader.biClrUsed = 0;
3213 bi.bmiHeader.biClrImportant = 0;
3214 HBITMAP hBitmap = ::CreateDIBSection(hDCSource, &bi, DIB_RGB_COLORS, NULL, NULL, 0);
3215 ATLASSERT(hBitmap != NULL);
3220 ::SelectObject(hDCTarget, hBitmap);
3222 IMAGELISTDRAWPARAMS ildp = { 0 };
3223 ildp.cbSize =
sizeof(IMAGELISTDRAWPARAMS);
3224 ildp.himl = m_hImageList;
3226 ildp.hdcDst = hDCTarget;
3233 ildp.fStyle = ILD_TRANSPARENT;
3234 ildp.fState = ILS_ALPHA;
3236 ::ImageList_DrawIndirect(&ildp);
3242 void _RemoveVistaBitmapsFromMenu()
3245 for(
int i = 0; i < m_arrCommand.GetSize(); i++)
3248 mii.fMask = MIIM_BITMAP;
3249 mii.hbmpItem = NULL;
3250 menu.SetMenuItemInfo(m_arrCommand[i], FALSE, &mii);
3253 #endif // _WTL_CMDBAR_VISTA_MENUS 3260 DECLARE_WND_SUPERCLASS(_T(
"WTL_CommandBar"), GetWndClassName())
3267 template <
class T,
class TBase = CCommandBarCtrlBase,
class TWinTraits = ATL::CControlWinTraits>
3272 ATL::CContainedWindow m_wndMDIClient;
3273 bool m_bChildMaximized;
3274 HWND m_hWndChildMaximized;
3275 HICON m_hIconChildMaximized;
3277 int m_nBtnWasPressed;
3288 #ifndef _WTL_NO_AUTO_THEME 3290 typedef HANDLE HTHEME;
3291 #endif // !_UXTHEME_H_ 3292 typedef HTHEME (STDAPICALLTYPE *PFN_OpenThemeData)(HWND hwnd, LPCWSTR pszClassList);
3293 typedef HRESULT (STDAPICALLTYPE *PFN_CloseThemeData)(HTHEME hTheme);
3294 typedef HRESULT (STDAPICALLTYPE *PFN_DrawThemeBackground)(HTHEME hTheme, HDC hdc,
int iPartId,
int iStateId,
const RECT *pRect, OPTIONAL
const RECT *pClipRect);
3295 typedef HRESULT (STDAPICALLTYPE *PFN_DrawThemeParentBackground)(HWND hwnd, HDC hdc, OPTIONAL RECT* prc);
3297 HMODULE m_hThemeDLL;
3299 PFN_DrawThemeBackground m_pfnDrawThemeBackground;
3300 PFN_DrawThemeParentBackground m_pfnDrawThemeParentBackground;
3301 #endif // !_WTL_NO_AUTO_THEME 3305 m_wndMDIClient(
this, 2), m_bChildMaximized(
false),
3306 m_hWndChildMaximized(NULL), m_hIconChildMaximized(NULL),
3307 m_nBtnPressed(-1), m_nBtnWasPressed(-1),
3308 #ifndef _WTL_NO_AUTO_THEME 3309 m_hThemeDLL(NULL), m_hTheme(NULL), m_pfnDrawThemeBackground(NULL), m_pfnDrawThemeParentBackground(NULL),
3310 #endif // !_WTL_NO_AUTO_THEME 3312 m_cxIconWidth(16), m_cyIconHeight(16),
3313 m_cxBtnWidth(16), m_cyBtnHeight(14),
3314 m_cxLeft(20), m_cxRight(55)
3319 if(m_wndMDIClient.IsWindow())
3320 m_wndMDIClient.UnsubclassWindow();
3324 BOOL SetMDIClient(HWND hWndMDIClient)
3326 ATLASSERT(::IsWindow(m_hWnd));
3327 ATLASSERT(::IsWindow(hWndMDIClient));
3328 if(!::IsWindow(hWndMDIClient))
3334 LPCTSTR lpszMDIClientClass = _T(
"MDICLIENT");
3335 const int nNameLen = 9 + 1;
3336 TCHAR szClassName[nNameLen] = { 0 };
3337 ::GetClassName(hWndMDIClient, szClassName, nNameLen);
3338 ATLASSERT(lstrcmpi(szClassName, lpszMDIClientClass) == 0);
3342 if(m_wndMDIClient.IsWindow())
3343 m_wndMDIClient.UnsubclassWindow();
3345 return m_wndMDIClient.SubclassWindow(hWndMDIClient);
3351 MESSAGE_HANDLER(WM_CREATE, OnCreate)
3352 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
3353 #ifndef _WTL_NO_AUTO_THEME 3354 MESSAGE_HANDLER(_GetThemeChangedMsg(), OnThemeChanged)
3355 #endif // !_WTL_NO_AUTO_THEME 3356 MESSAGE_HANDLER(WM_SIZE, OnSize)
3357 MESSAGE_HANDLER(WM_NCCALCSIZE, OnNcCalcSize)
3358 MESSAGE_HANDLER(WM_NCPAINT, OnNcPaint)
3359 MESSAGE_HANDLER(WM_NCHITTEST, OnNcHitTest)
3360 MESSAGE_HANDLER(WM_NCLBUTTONDOWN, OnNcLButtonDown)
3361 MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
3362 MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
3363 MESSAGE_HANDLER(WM_NCLBUTTONDBLCLK, OnNcLButtonDblClk)
3364 MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged)
3365 CHAIN_MSG_MAP(_baseClass)
3367 MESSAGE_HANDLER(WM_ACTIVATE, OnParentActivate)
3368 CHAIN_MSG_MAP_ALT(_baseClass, 1)
3370 MESSAGE_HANDLER(WM_MDISETMENU, OnMDISetMenu)
3373 MESSAGE_RANGE_HANDLER(0, 0xFFFF, OnAllHookMessages)
3374 CHAIN_MSG_MAP_ALT(_baseClass, 3)
3378 LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
3380 LRESULT lRet = _baseClass::OnCreate(uMsg, wParam, lParam, bHandled);
3381 if(lRet == (LRESULT)-1)
3384 #ifndef _WTL_NO_AUTO_THEME 3386 m_hThemeDLL = ::LoadLibrary(_T(
"uxtheme.dll"));
3387 if(m_hThemeDLL != NULL)
3389 m_pfnDrawThemeBackground = (PFN_DrawThemeBackground)::GetProcAddress(m_hThemeDLL,
"DrawThemeBackground");
3390 ATLASSERT(m_pfnDrawThemeBackground != NULL);
3391 if(m_pfnDrawThemeBackground != NULL)
3393 T* pT =
static_cast<T*
>(
this);
3394 pT->_OpenThemeData();
3398 ::FreeLibrary(m_hThemeDLL);
3401 m_pfnDrawThemeParentBackground = (PFN_DrawThemeParentBackground)::GetProcAddress(m_hThemeDLL,
"DrawThemeParentBackground");
3402 ATLASSERT(m_pfnDrawThemeParentBackground != NULL);
3404 #endif // !_WTL_NO_AUTO_THEME 3409 LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
3411 LRESULT lRet = _baseClass::OnDestroy(uMsg, wParam, lParam, bHandled);
3413 #ifndef _WTL_NO_AUTO_THEME 3414 if(m_hThemeDLL != NULL)
3416 T* pT =
static_cast<T*
>(
this);
3417 pT->_CloseThemeData();
3418 ::FreeLibrary(m_hThemeDLL);
3421 #endif // !_WTL_NO_AUTO_THEME 3426 #ifndef _WTL_NO_AUTO_THEME 3427 LRESULT OnThemeChanged(UINT , WPARAM , LPARAM , BOOL& )
3429 if(m_hThemeDLL != NULL)
3431 T* pT =
static_cast<T*
>(
this);
3432 pT->_CloseThemeData();
3433 pT->_OpenThemeData();
3437 #endif // !_WTL_NO_AUTO_THEME 3439 LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
3441 LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
3442 T* pT =
static_cast<T*
>(
this);
3443 pT->_AdjustBtnSize(GET_Y_LPARAM(lParam));
3447 LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
3449 LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
3451 if(m_bChildMaximized && (BOOL)wParam)
3453 LPNCCALCSIZE_PARAMS lpParams = (LPNCCALCSIZE_PARAMS)lParam;
3456 lpParams->rgrc[0].left += m_cxRight;
3457 lpParams->rgrc[0].right -= m_cxLeft;
3461 lpParams->rgrc[0].left += m_cxLeft;
3462 lpParams->rgrc[0].right -= m_cxRight;
3469 LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
3471 LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
3473 if(!m_bChildMaximized)
3476 ATLASSERT(m_hWndChildMaximized != NULL && m_hIconChildMaximized != NULL);
3481 GetWindowRect(&rect);
3482 int cxWidth = rect.right - rect.left;
3483 int cyHeight = rect.bottom - rect.top;
3486 ::SetRect(&rect, 0, 0, m_cxLeft, cyHeight);
3487 #ifndef _WTL_NO_AUTO_THEME 3488 if(m_hTheme != NULL)
3490 if(m_pfnDrawThemeParentBackground != NULL)
3491 m_pfnDrawThemeParentBackground(m_hWnd, dc, &rect);
3493 dc.FillRect(&rect, COLOR_WINDOW);
3496 #endif // !_WTL_NO_AUTO_THEME 3498 if((m_dwExtendedStyle & CBR_EX_TRANSPARENT) != 0)
3499 dc.FillRect(&rect, COLOR_3DFACE);
3501 dc.FillRect(&rect, COLOR_MENU);
3504 RECT rcIcon = { 0 };
3505 T* pT =
static_cast<T*
>(
this);
3506 pT->_CalcIconRect(cxWidth, cyHeight, rcIcon);
3507 dc.DrawIconEx(rcIcon.left, rcIcon.top, m_hIconChildMaximized, m_cxIconWidth, m_cyIconHeight);
3510 ::SetRect(&rect, cxWidth - m_cxRight, 0, cxWidth, cyHeight);
3511 #ifndef _WTL_NO_AUTO_THEME 3512 if(m_hTheme != NULL)
3514 if(m_pfnDrawThemeParentBackground != NULL)
3517 POINT ptOrg = { 0, 0 };
3518 dc.GetViewportOrg(&ptOrg);
3519 dc.SetViewportOrg(ptOrg.x + m_cxLeft, ptOrg.y);
3520 ::OffsetRect(&rect, -m_cxLeft, 0);
3522 m_pfnDrawThemeParentBackground(m_hWnd, dc, &rect);
3525 dc.SetViewportOrg(ptOrg);
3526 ::OffsetRect(&rect, m_cxLeft, 0);
3530 dc.FillRect(&rect, COLOR_3DFACE);
3534 #endif // !_WTL_NO_AUTO_THEME 3536 if((m_dwExtendedStyle & CBR_EX_TRANSPARENT) != 0)
3537 dc.FillRect(&rect, COLOR_3DFACE);
3539 dc.FillRect(&rect, COLOR_MENU);
3543 RECT arrRect[3] = { 0 };
3544 pT->_CalcBtnRects(cxWidth, cyHeight, arrRect);
3545 pT->_DrawMDIButton(dc, arrRect, -1);
3550 LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
3552 LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
3553 if(m_bChildMaximized)
3556 GetWindowRect(&rect);
3557 POINT pt = { GET_X_LPARAM(lParam) - rect.left, GET_Y_LPARAM(lParam) - rect.top };
3560 if((pt.x < m_cxRight) || (pt.x > ((rect.right - rect.left) - m_cxLeft)))
3565 if((pt.x < m_cxLeft) || (pt.x > ((rect.right - rect.left) - m_cxRight)))
3572 LRESULT OnNcLButtonDown(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
3574 if(!m_bChildMaximized)
3580 ATLASSERT(_DebugCheckChild());
3582 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
3584 GetWindowRect(&rect);
3588 RECT rcIcon = { 0 };
3589 T* pT =
static_cast<T*
>(
this);
3590 pT->_CalcIconRect(rect.right - rect.left, rect.bottom - rect.top, rcIcon, m_bLayoutRTL);
3591 RECT arrRect[3] = { 0 };
3592 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL);
3594 if(::PtInRect(&rcIcon, pt))
3596 #ifdef _CMDBAR_EXTRA_TRACE 3597 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - LButtonDown: icon\n"));
3599 #ifndef TPM_VERPOSANIMATION 3600 const UINT TPM_VERPOSANIMATION = 0x1000L;
3602 CMenuHandle menu = ::GetSystemMenu(m_hWndChildMaximized, FALSE);
3603 UINT uRet = (UINT)menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD |
3604 (s_bW2K ? TPM_VERPOSANIMATION : 0), m_bLayoutRTL ? rect.right : rect.left, rect.bottom, m_hWndChildMaximized);
3607 ::OffsetRect(&rcIcon, rect.left, rect.top);
3609 if(::PeekMessage(&msg, m_hWnd, WM_NCLBUTTONDOWN, WM_NCLBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rcIcon, msg.pt))
3610 ::PeekMessage(&msg, m_hWnd, WM_NCLBUTTONDOWN, WM_NCLBUTTONDOWN, PM_REMOVE);
3613 ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, uRet, 0L);
3615 else if(::PtInRect(&arrRect[0], pt))
3617 #ifdef _CMDBAR_EXTRA_TRACE 3618 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - LButtonDown: close button\n"));
3620 m_nBtnWasPressed = m_nBtnPressed = 0;
3622 else if(::PtInRect(&arrRect[1], pt))
3624 #ifdef _CMDBAR_EXTRA_TRACE 3625 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - LButtonDown: restore button\n"));
3627 m_nBtnWasPressed = m_nBtnPressed = 1;
3629 else if(::PtInRect(&arrRect[2], pt))
3631 #ifdef _CMDBAR_EXTRA_TRACE 3632 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - LButtonDown: minimize button\n"));
3634 m_nBtnWasPressed = m_nBtnPressed = 2;
3642 if(m_nBtnPressed != -1)
3646 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect);
3647 pT->_DrawMDIButton(dc, arrRect, m_nBtnPressed);
3653 LRESULT OnMouseMove(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
3655 if(!m_bChildMaximized || ::GetCapture() != m_hWnd || m_nBtnWasPressed == -1)
3661 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
3662 ClientToScreen(&pt);
3664 GetWindowRect(&rect);
3667 RECT arrRect[3] = { 0 };
3668 T* pT =
static_cast<T*
>(
this);
3669 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL);
3670 int nOldBtnPressed = m_nBtnPressed;
3671 m_nBtnPressed = ::PtInRect(&arrRect[m_nBtnWasPressed], pt) ? m_nBtnWasPressed : -1;
3672 if(nOldBtnPressed != m_nBtnPressed)
3675 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect);
3676 pT->_DrawMDIButton(dc, arrRect, (m_nBtnPressed != -1) ? m_nBtnPressed : nOldBtnPressed);
3682 LRESULT OnLButtonUp(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
3684 if(!m_bChildMaximized || ::GetCapture() != m_hWnd || m_nBtnWasPressed == -1)
3690 ATLASSERT(_DebugCheckChild());
3692 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
3693 ClientToScreen(&pt);
3695 GetWindowRect(&rect);
3699 int nBtn = m_nBtnWasPressed;
3702 RECT arrRect[3] = { 0 };
3703 T* pT =
static_cast<T*
>(
this);
3704 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL);
3705 if(::PtInRect(&arrRect[nBtn], pt))
3710 #ifdef _CMDBAR_EXTRA_TRACE 3711 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - LButtonUp: close button\n"));
3713 ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_CLOSE, 0L);
3716 #ifdef _CMDBAR_EXTRA_TRACE 3717 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - LButtonUp: restore button\n"));
3719 ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_RESTORE, 0L);
3722 #ifdef _CMDBAR_EXTRA_TRACE 3723 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - LButtonUp: minimize button\n"));
3725 ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_MINIMIZE, 0L);
3735 LRESULT OnNcLButtonDblClk(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
3737 if(!m_bChildMaximized || m_nBtnWasPressed != -1)
3743 ATLASSERT(_DebugCheckChild());
3745 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
3747 GetWindowRect(&rect);
3751 RECT rcIcon = { 0 };
3752 T* pT =
static_cast<T*
>(
this);
3753 pT->_CalcIconRect(rect.right - rect.left, rect.bottom - rect.top, rcIcon, m_bLayoutRTL);
3754 RECT arrRect[3] = { 0 };
3755 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL);
3757 if(::PtInRect(&rcIcon, pt))
3759 CMenuHandle menu = ::GetSystemMenu(m_hWndChildMaximized, FALSE);
3760 UINT uDefID = menu.GetMenuDefaultItem();
3761 if(uDefID == (UINT)-1)
3763 ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, uDefID, 0L);
3769 LRESULT OnCaptureChanged(UINT , WPARAM , LPARAM , BOOL& bHandled)
3771 if(m_bChildMaximized)
3773 if(m_nBtnPressed != -1)
3775 ATLASSERT(m_nBtnPressed == m_nBtnWasPressed);
3778 GetWindowRect(&rect);
3779 RECT arrRect[3] = { 0 };
3780 T* pT =
static_cast<T*
>(
this);
3781 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect);
3783 pT->_DrawMDIButton(dc, arrRect, m_nBtnWasPressed);
3785 m_nBtnWasPressed = -1;
3795 LRESULT OnParentActivate(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
3797 m_bParentActive = (LOWORD(wParam) != WA_INACTIVE);
3798 RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW);
3804 LRESULT OnMDISetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
3806 m_wndMDIClient.DefWindowProc(uMsg, NULL, lParam);
3807 HMENU hOldMenu = GetMenu();
3808 BOOL bRet = AttachMenu((HMENU)wParam);
3812 #if (_WIN32_IE >= 0x0400) 3813 T* pT =
static_cast<T*
>(
this);
3814 pT->UpdateRebarBandIdealSize();
3815 #endif // (_WIN32_IE >= 0x0400) 3817 return (LRESULT)hOldMenu;
3821 LRESULT OnAllHookMessages(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
3823 T* pT =
static_cast<T*
>(
this);
3824 pT->_ProcessAllHookMessages(uMsg, wParam, lParam);
3832 void UpdateRebarBandIdealSize()
3836 int nCount = (int)::SendMessage(GetParent(), RB_GETBANDCOUNT, 0, 0L);
3837 for(
int i = 0; i < nCount; i++)
3839 REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE };
3840 ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi);
3841 if(rbi.hwndChild == m_hWnd)
3843 rbi.fMask = RBBIM_IDEALSIZE;
3844 rbi.cxIdeal = m_bChildMaximized ? m_cxLeft + m_cxRight : 0;
3845 int nBtnCount = GetButtonCount();
3849 GetItemRect(nBtnCount - 1, &rect);
3850 rbi.cxIdeal += rect.right;
3852 ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi);
3859 void _ProcessAllHookMessages(UINT uMsg, WPARAM , LPARAM )
3861 if(uMsg == WM_MDIGETACTIVE || uMsg == WM_MDISETMENU)
3864 BOOL bMaximized = FALSE;
3865 HWND hWndChild = (HWND)::SendMessage(m_wndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized);
3866 bool bMaxOld = m_bChildMaximized;
3867 m_bChildMaximized = (hWndChild != NULL && bMaximized);
3868 HICON hIconOld = m_hIconChildMaximized;
3870 if(m_bChildMaximized)
3872 if(m_hWndChildMaximized != hWndChild)
3874 ATL::CWindow wnd = m_hWndChildMaximized = hWndChild;
3875 m_hIconChildMaximized = wnd.GetIcon(FALSE);
3876 if(m_hIconChildMaximized == NULL)
3878 m_hIconChildMaximized = wnd.GetIcon(TRUE);
3879 if(m_hIconChildMaximized == NULL)
3884 m_hIconChildMaximized = (HICON)::GetClassLongPtr(wnd, GCLP_HICONSM);
3886 m_hIconChildMaximized = (HICON)LongToHandle(::GetClassLongPtr(wnd, GCLP_HICONSM));
3894 m_hWndChildMaximized = NULL;
3895 m_hIconChildMaximized = NULL;
3898 if(bMaxOld != m_bChildMaximized)
3900 #ifdef _CMDBAR_EXTRA_TRACE 3901 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - All messages hook change: m_bChildMaximized = %s\n"), m_bChildMaximized ?
"true" :
"false");
3905 int nCount = (int)::SendMessage(GetParent(), RB_GETBANDCOUNT, 0, 0L);
3906 int cxDiff = (m_bChildMaximized ? 1 : -1) * (m_cxLeft + m_cxRight);
3907 for(
int i = 0; i < nCount; i++)
3909 #if (_WIN32_IE >= 0x0500) 3910 REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_STYLE };
3911 ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi);
3912 if(rbi.hwndChild == m_hWnd)
3914 if((rbi.fStyle & RBBS_USECHEVRON) != 0)
3916 rbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE;
3917 rbi.cxMinChild += cxDiff;
3918 rbi.cxIdeal += cxDiff;
3919 ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi);
3923 #elif (_WIN32_IE >= 0x0400) 3924 REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE };
3925 ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi);
3926 if(rbi.hwndChild == m_hWnd)
3928 rbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE;
3929 rbi.cxMinChild += cxDiff;
3930 rbi.cxIdeal += cxDiff;
3931 ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi);
3934 #else // (_WIN32_IE < 0x0400) 3935 REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE };
3936 ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi);
3937 if(rbi.hwndChild == m_hWnd)
3939 rbi.fMask = RBBIM_CHILDSIZE;
3940 rbi.cxMinChild += cxDiff;
3941 ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi);
3944 #endif // (_WIN32_IE < 0x0400) 3948 if(bMaxOld != m_bChildMaximized || hIconOld != m_hIconChildMaximized)
3952 GetWindowRect(&rect);
3953 ::MapWindowPoints(NULL, GetParent(), (LPPOINT)&rect, 2);
3955 SetWindowPos(NULL, 0, 0, 1, 1, SWP_NOZORDER | SWP_NOMOVE);
3956 SetWindowPos(NULL, &rect, SWP_NOZORDER | SWP_NOMOVE);
3958 RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW);
3963 void GetSystemSettings()
3965 #ifdef _CMDBAR_EXTRA_TRACE 3966 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - GetSystemSettings\n"));
3968 _baseClass::GetSystemSettings();
3970 NONCLIENTMETRICS
info = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };
3971 BOOL bRet = ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
sizeof(info), &info, 0);
3975 m_cxIconWidth = ::GetSystemMetrics(SM_CXSMICON);
3976 m_cyIconHeight = ::GetSystemMetrics(SM_CYSMICON);
3977 m_cxLeft = m_cxIconWidth;
3979 #ifndef _WTL_NO_AUTO_THEME 3980 if(m_hTheme != NULL)
3982 m_cxBtnWidth = info.iCaptionWidth - 2 * m_cxyOffset;
3983 m_cyBtnHeight = info.iCaptionHeight - 2 * m_cxyOffset;
3984 m_cxRight = 3 * m_cxBtnWidth;
3987 #endif // !_WTL_NO_AUTO_THEME 3989 m_cxBtnWidth = info.iCaptionWidth - m_cxyOffset;
3990 m_cyBtnHeight = info.iCaptionHeight - 2 * m_cxyOffset;
3991 m_cxRight = 3 * m_cxBtnWidth + m_cxyOffset;
3996 GetClientRect(&rect);
3997 T* pT =
static_cast<T*
>(
this);
3998 pT->_AdjustBtnSize(rect.bottom);
4001 void _AdjustBtnSize(
int cyHeight)
4003 if(cyHeight > 1 && m_cyBtnHeight > cyHeight)
4005 #ifndef _WTL_NO_AUTO_THEME 4006 if(m_hTheme != NULL)
4008 m_cyBtnHeight = cyHeight;
4009 m_cxBtnWidth = cyHeight;
4010 m_cxRight = 3 * m_cxBtnWidth;
4013 #endif // !_WTL_NO_AUTO_THEME 4015 m_cyBtnHeight = cyHeight;
4016 m_cxBtnWidth = cyHeight + m_cxyOffset;
4017 m_cxRight = 3 * m_cxBtnWidth + m_cxyOffset;
4022 void _CalcIconRect(
int cxWidth,
int cyHeight, RECT& rect,
bool bInvertX =
false)
const 4024 int xStart = (m_cxLeft - m_cxIconWidth) / 2;
4027 int yStart = (cyHeight - m_cyIconHeight) / 2;
4032 ::SetRect(&rect, cxWidth - (xStart + m_cxBtnWidth), yStart, cxWidth - xStart, yStart + m_cyBtnHeight);
4034 ::SetRect(&rect, xStart, yStart, xStart + m_cxBtnWidth, yStart + m_cyBtnHeight);
4037 void _CalcBtnRects(
int cxWidth,
int cyHeight, RECT arrRect[3],
bool bInvertX =
false)
const 4039 int yStart = (cyHeight - m_cyBtnHeight) / 2;
4043 RECT rcBtn = { cxWidth - m_cxBtnWidth, yStart, cxWidth, yStart + m_cyBtnHeight };
4044 int nDirection = -1;
4047 ::SetRect(&rcBtn, 0, yStart, m_cxBtnWidth, yStart + m_cyBtnHeight);
4052 #ifndef _WTL_NO_AUTO_THEME 4053 if(m_hTheme != NULL)
4054 ::OffsetRect(&rcBtn, nDirection * m_cxBtnWidth, 0);
4056 #endif // !_WTL_NO_AUTO_THEME 4057 ::OffsetRect(&rcBtn, nDirection * (m_cxBtnWidth + m_cxyOffset), 0);
4059 ::OffsetRect(&rcBtn, nDirection * m_cxBtnWidth, 0);
4063 void _DrawMDIButton(
CWindowDC& dc, LPRECT pRects,
int nBtn)
4065 #ifndef _WTL_NO_AUTO_THEME 4066 if(m_hTheme != NULL)
4069 const int WP_MDICLOSEBUTTON = 20;
4070 const int CBS_NORMAL = 1;
4071 const int CBS_PUSHED = 3;
4072 const int CBS_DISABLED = 4;
4073 const int WP_MDIRESTOREBUTTON = 22;
4074 const int RBS_NORMAL = 1;
4075 const int RBS_PUSHED = 3;
4076 const int RBS_DISABLED = 4;
4077 const int WP_MDIMINBUTTON = 16;
4078 const int MINBS_NORMAL = 1;
4079 const int MINBS_PUSHED = 3;
4080 const int MINBS_DISABLED = 4;
4081 #endif // TMSCHEMA_H 4082 if(nBtn == -1 || nBtn == 0)
4083 m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDICLOSEBUTTON, m_bParentActive ? ((m_nBtnPressed == 0) ? CBS_PUSHED : CBS_NORMAL) : CBS_DISABLED, &pRects[0], NULL);
4084 if(nBtn == -1 || nBtn == 1)
4085 m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDIRESTOREBUTTON, m_bParentActive ? ((m_nBtnPressed == 1) ? RBS_PUSHED : RBS_NORMAL) : RBS_DISABLED, &pRects[1], NULL);
4086 if(nBtn == -1 || nBtn == 2)
4087 m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDIMINBUTTON, m_bParentActive ? ((m_nBtnPressed == 2) ? MINBS_PUSHED : MINBS_NORMAL) : MINBS_DISABLED, &pRects[2], NULL);
4090 #endif // !_WTL_NO_AUTO_THEME 4092 if(nBtn == -1 || nBtn == 0)
4093 dc.DrawFrameControl(&pRects[0], DFC_CAPTION, DFCS_CAPTIONCLOSE | ((m_nBtnPressed == 0) ? DFCS_PUSHED : 0));
4094 if(nBtn == -1 || nBtn == 1)
4095 dc.DrawFrameControl(&pRects[1], DFC_CAPTION, DFCS_CAPTIONRESTORE | ((m_nBtnPressed == 1) ? DFCS_PUSHED : 0));
4096 if(nBtn == -1 || nBtn == 2)
4097 dc.DrawFrameControl(&pRects[2], DFC_CAPTION, DFCS_CAPTIONMIN | ((m_nBtnPressed == 2) ? DFCS_PUSHED : 0));
4101 #ifndef _WTL_NO_AUTO_THEME 4102 static UINT _GetThemeChangedMsg()
4104 #ifndef WM_THEMECHANGED 4105 static const UINT WM_THEMECHANGED = 0x031A;
4106 #endif // !WM_THEMECHANGED 4107 return WM_THEMECHANGED;
4110 void _OpenThemeData()
4112 ATLASSERT(m_hThemeDLL != NULL);
4114 PFN_OpenThemeData pfnOpenThemeData = (PFN_OpenThemeData)::GetProcAddress(m_hThemeDLL,
"OpenThemeData");
4115 ATLASSERT(pfnOpenThemeData != NULL);
4116 if(pfnOpenThemeData != NULL)
4117 m_hTheme = pfnOpenThemeData(m_hWnd, L
"Window");
4120 void _CloseThemeData()
4122 ATLASSERT(m_hThemeDLL != NULL);
4124 if(m_hTheme == NULL)
4127 PFN_CloseThemeData pfnCloseThemeData = (PFN_CloseThemeData)::GetProcAddress(m_hThemeDLL,
"CloseThemeData");
4128 ATLASSERT(pfnCloseThemeData != NULL);
4129 if(pfnCloseThemeData != NULL)
4131 pfnCloseThemeData(m_hTheme);
4135 #endif // !_WTL_NO_AUTO_THEME 4137 bool _DebugCheckChild()
4140 BOOL bMaximized = FALSE;
4141 HWND hWndChild = (HWND)::SendMessage(m_wndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized);
4142 return (bMaximized && hWndChild == m_hWndChildMaximized);
4152 DECLARE_WND_SUPERCLASS(_T(
"WTL_MDICommandBar"), GetWndClassName())
4157 #endif // __ATLCTRLW_H__
Definition: atlwinx.h:455
Definition: atlctrlw.h:3268
Definition: atlctrlw.h:3257
Definition: atlapp.h:1231
Definition: nestegg.c:186
Definition: atlgdi.h:3388
Definition: atlctrlw.h:95
Definition: atlapp.h:1262
Definition: atlctrlw.h:136
Definition: atlgdi.h:1211
Definition: atlgdi.h:3409
Definition: atlctrlw.h:133
Definition: atlctrlw.h:207
Definition: atlctrlw.h:4149
Definition: atlctrlw.h:201