10 #define __ATLCTRLW_H__ 15 #error atlctrlw.h is not supported on Windows CE 19 #error atlctrlw.h requires atlapp.h to be included first 22 #ifndef __ATLCTRLS_H__ 23 #error atlctrlw.h requires atlctrls.h to be included first 26 #if (_WIN32_IE < 0x0400) 27 #error atlctrlw.h requires _WIN32_IE >= 0x0400 31 #if !defined(_WTL_CMDBAR_VISTA_MENUS) && (WINVER >= 0x0500) && (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) 32 #define _WTL_CMDBAR_VISTA_MENUS 1 35 #if _WTL_CMDBAR_VISTA_MENUS 36 #if !((_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501)) 37 #error _WTL_CMDBAR_VISTA_MENUS requires (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) 60 #define CBRWS_TOP CCS_TOP 61 #define CBRWS_BOTTOM CCS_BOTTOM 62 #define CBRWS_NORESIZE CCS_NORESIZE 63 #define CBRWS_NOPARENTALIGN CCS_NOPARENTALIGN 64 #define CBRWS_NODIVIDER CCS_NODIVIDER 67 #define CBR_EX_TRANSPARENT 0x00000001L 68 #define CBR_EX_SHAREMENU 0x00000002L 69 #define CBR_EX_ALTFOCUSMODE 0x00000004L 70 #define CBR_EX_TRACKALWAYS 0x00000008L 71 #define CBR_EX_NOVISTAMENUS 0x00000010L 74 #define ATL_SIMPLE_CMDBAR_PANE_STYLE \ 75 (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CBRWS_NODIVIDER | CBRWS_NORESIZE | CBRWS_NOPARENTALIGN) 78 #define CBRM_GETCMDBAR (WM_USER + 301) // returns command bar HWND 79 #define CBRM_GETMENU (WM_USER + 302) // returns loaded or attached menu 80 #define CBRM_TRACKPOPUPMENU (WM_USER + 303) // displays a popup menu 99 #ifdef _CMDBAR_EXTRA_TRACE 100 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - STACK-PUSH (%8.8X) size = %i\n"), t, GetSize());
107 int nLast = GetSize() - 1;
111 #ifdef _CMDBAR_EXTRA_TRACE 112 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - STACK-POP (%8.8X) size = %i\n"), t, GetSize());
121 int nLast = GetSize() - 1;
144 typedef ATL::CSimpleMap<DWORD, _MsgHookData*> CMsgHookMap;
145 static CMsgHookMap* s_pmapMsgHook;
147 static HHOOK s_hCreateHook;
150 static bool s_bStaticInit;
165 if(FAILED(lock.Lock()))
167 ATLTRACE2(atlTraceUI, 0, _T(
"ERROR : Unable to lock critical section in CCommandBarCtrlBase::CCommandBarCtrlBase.\n"));
175 AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES);
177 s_bW2K = !AtlIsOldWindows();
179 s_bStaticInit =
true;
186 bool IsCommandBarBase()
const {
return m_dwMagic == 1314; }
189 __declspec(selectany) CCommandBarCtrlBase::CMsgHookMap* CCommandBarCtrlBase::s_pmapMsgHook = NULL;
190 __declspec(selectany) HHOOK CCommandBarCtrlBase::s_hCreateHook = NULL;
192 __declspec(selectany)
bool CCommandBarCtrlBase::s_bW2K =
false;
193 __declspec(selectany)
bool CCommandBarCtrlBase::s_bStaticInit =
false;
199 template <
class T,
class TBase = CCommandBarCtrlBase,
class TWinTraits = ATL::CControlWinTraits>
203 DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName())
214 _MenuItemData() { dwMagic = 0x1313; }
215 bool IsCmdBarMenuItem() {
return (dwMagic == 0x1313); }
227 {
return (WORD*)(
this+1); }
231 enum _CmdBarDrawConstants
235 s_kcxButtonMargin = 3,
236 s_kcyButtonMargin = 3
241 _nMaxMenuItemTextLength = 100,
242 _chChevronShortcut = _T(
'/')
245 #ifndef DT_HIDEPREFIX 246 enum { DT_HIDEPREFIX = 0x00100000 };
247 #endif // !DT_HIDEPREFIX 251 HIMAGELIST m_hImageList;
252 ATL::CSimpleValArray<WORD> m_arrCommand;
254 DWORD m_dwExtendedStyle;
256 ATL::CContainedWindow m_wndParent;
258 bool m_bMenuActive:1;
259 bool m_bAttachedMenu:1;
260 bool m_bImagesVisible:1;
262 bool m_bContextMenu:1;
263 bool m_bEscapePressed:1;
265 bool m_bParentActive:1;
267 bool m_bUseKeyboardCues:1;
268 bool m_bShowKeyboardCues:1;
269 bool m_bAllowKeyboardCues:1;
270 bool m_bKeyboardInput:1;
271 bool m_bAlphaImages:1;
273 bool m_bSkipPostDown:1;
274 bool m_bVistaMenus:1;
289 int m_cxExtraSpacing;
291 #if _WTL_CMDBAR_VISTA_MENUS 292 ATL::CSimpleValArray<HBITMAP> m_arrVistaBitmap;
293 #endif // _WTL_CMDBAR_VISTA_MENUS 299 m_wndParent(
this, 1),
300 m_bMenuActive(
false),
301 m_bAttachedMenu(
false),
305 m_bImagesVisible(
true),
309 m_bContextMenu(
false),
310 m_bEscapePressed(
false),
311 m_clrMask(RGB(192, 192, 192)),
312 m_dwExtendedStyle(CBR_EX_TRANSPARENT | CBR_EX_SHAREMENU | CBR_EX_TRACKALWAYS),
313 m_bParentActive(
true),
315 m_bUseKeyboardCues(
false),
316 m_bShowKeyboardCues(
false),
317 m_bAllowKeyboardCues(
true),
318 m_bKeyboardInput(
false),
320 m_bAlphaImages(
false),
322 m_bSkipPostDown(
false),
325 SetImageSize(16, 15);
330 if(m_wndParent.IsWindow())
331 m_wndParent.UnsubclassWindow();
333 if(m_hMenu != NULL && (m_dwExtendedStyle & CBR_EX_SHAREMENU) == 0)
334 ::DestroyMenu(m_hMenu);
336 if(m_hImageList != NULL)
337 ::ImageList_Destroy(m_hImageList);
341 DWORD GetCommandBarExtendedStyle()
const 343 return m_dwExtendedStyle;
346 DWORD SetCommandBarExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)
348 DWORD dwPrevStyle = m_dwExtendedStyle;
350 m_dwExtendedStyle = dwExtendedStyle;
352 m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask);
358 ATLASSERT(::IsWindow(m_hWnd));
362 COLORREF GetImageMaskColor()
const 367 COLORREF SetImageMaskColor(COLORREF clrMask)
369 COLORREF clrOld = m_clrMask;
374 bool GetImagesVisible()
const 376 return m_bImagesVisible;
379 bool SetImagesVisible(
bool bVisible)
381 bool bOld = m_bImagesVisible;
382 m_bImagesVisible = bVisible;
386 void GetImageSize(SIZE& size)
const 391 bool SetImageSize(SIZE& size)
393 return SetImageSize(size.cx, size.cy);
396 bool SetImageSize(
int cx,
int cy)
398 if(m_hImageList != NULL)
400 if(::ImageList_GetImageCount(m_hImageList) == 0)
402 ::ImageList_Destroy(m_hImageList);
411 if(cx == 0 || cy == 0)
416 m_szButton.cx = m_szBitmap.cx + 2 * s_kcxButtonMargin;
417 m_szButton.cy = m_szBitmap.cy + 2 * s_kcyButtonMargin;
422 bool GetAlphaImages()
const 424 return m_bAlphaImages;
427 bool SetAlphaImages(
bool bAlphaImages)
429 if(m_hImageList != NULL)
431 if(::ImageList_GetImageCount(m_hImageList) == 0)
433 ::ImageList_Destroy(m_hImageList);
442 m_bAlphaImages = bAlphaImages;
446 HWND GetCmdBar()
const 448 ATLASSERT(::IsWindow(m_hWnd));
449 return (HWND)::SendMessage(m_hWnd, CBRM_GETCMDBAR, 0, 0L);
453 HWND Create(HWND hWndParent, RECT& rcPos, LPCTSTR szWindowName = NULL,
454 DWORD dwStyle = 0, DWORD dwExStyle = 0,
455 UINT nID = 0, LPVOID lpCreateParam = NULL)
458 dwStyle |= TBSTYLE_LIST | TBSTYLE_FLAT;
459 #if (_MSC_VER >= 1300) 460 return ATL::CWindowImpl< T, TBase, TWinTraits >::Create(hWndParent, rcPos, szWindowName, dwStyle, dwExStyle, nID, lpCreateParam);
461 #else // !(_MSC_VER >= 1300) 462 typedef ATL::CWindowImpl< T, TBase, TWinTraits > _baseClass;
463 return _baseClass::Create(hWndParent, rcPos, szWindowName, dwStyle, dwExStyle, nID, lpCreateParam);
464 #endif // !(_MSC_VER >= 1300) 467 BOOL AttachToWindow(HWND hWnd)
469 ATLASSERT(m_hWnd == NULL);
470 ATLASSERT(::IsWindow(hWnd));
471 BOOL bRet = SubclassWindow(hWnd);
474 m_bAttachedMenu =
true;
475 T* pT =
static_cast<T*
>(
this);
476 pT->GetSystemSettings();
483 ATLASSERT(::IsWindow(m_hWnd));
487 if(menu.m_lpstr == NULL)
490 HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr);
494 return AttachMenu(hMenu);
497 BOOL AttachMenu(HMENU hMenu)
499 ATLASSERT(::IsWindow(m_hWnd));
500 ATLASSERT(hMenu == NULL || ::IsMenu(hMenu));
501 if(hMenu != NULL && !::IsMenu(hMenu))
504 #if _WTL_CMDBAR_VISTA_MENUS 506 if(m_bVistaMenus && (m_hMenu != NULL))
508 T* pT =
static_cast<T*
>(
this);
509 pT->_RemoveVistaBitmapsFromMenu();
511 #endif // _WTL_CMDBAR_VISTA_MENUS 514 if(m_hMenu != NULL && (m_dwExtendedStyle & CBR_EX_SHAREMENU) == 0)
515 ::DestroyMenu(m_hMenu);
526 int nCount = GetButtonCount();
527 for(
int i = 0; i < nCount; i++)
528 ATLVERIFY(DeleteButton(0) != FALSE);
533 int nItems = ::GetMenuItemCount(m_hMenu);
535 T* pT =
static_cast<T*
>(
this);
537 TCHAR szString[pT->_nMaxMenuItemTextLength] = { 0 };
538 for(
int i = 0; i < nItems; i++)
541 mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU;
542 mii.fType = MFT_STRING;
543 mii.dwTypeData = szString;
544 mii.cch = pT->_nMaxMenuItemTextLength;
545 BOOL bRet = ::GetMenuItemInfo(m_hMenu, i, TRUE, &mii);
548 if(lstrlen(szString) > pT->_nMaxMenuItemTextLength - 1)
550 mii.fType = MFT_BITMAP;
551 ::SetMenuItemInfo(m_hMenu, i, TRUE, &mii);
556 ATLASSERT(mii.hSubMenu != NULL);
558 TBBUTTON btn = { 0 };
561 btn.fsState = (BYTE)(((mii.fState & MFS_DISABLED) == 0) ? TBSTATE_ENABLED : 0);
562 btn.fsStyle = BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_DROPDOWN;
566 bRet = InsertButton(-1, &btn);
569 TBBUTTONINFO bi = { 0 };
570 bi.cbSize =
sizeof(TBBUTTONINFO);
571 bi.dwMask = TBIF_TEXT;
572 bi.pszText = szString;
574 bRet = SetButtonInfo(i, &bi);
588 return _LoadImagesHelper(image,
false);
591 BOOL LoadMappedImages(UINT nIDImage, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL,
int nMapSize = 0)
593 return _LoadImagesHelper(nIDImage,
true, nFlags , lpColorMap, nMapSize);
596 BOOL _LoadImagesHelper(
ATL::_U_STRINGorID image,
bool bMapped, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL,
int nMapSize = 0)
598 ATLASSERT(::IsWindow(m_hWnd));
599 HINSTANCE hInstance = ModuleHelper::GetResourceInstance();
601 HRSRC hRsrc = ::FindResource(hInstance, image.m_lpstr, (LPTSTR)RT_TOOLBAR);
605 HGLOBAL hGlobal = ::LoadResource(hInstance, hRsrc);
612 ATLASSERT(pData->wVersion == 1);
614 WORD* pItems = pData->items();
615 int nItems = pData->wItemCount;
618 SetImageSize(pData->wWidth, pData->wHeight);
621 if(m_hImageList == NULL)
624 T* pT =
static_cast<T*
>(
this);
625 m_bAlphaImages = AtlIsAlphaBitmapResource(image);
627 if(!pT->CreateInternalImageList(pData->wItemCount))
631 #if _WTL_CMDBAR_VISTA_MENUS 632 int nOldImageCount = ::ImageList_GetImageCount(m_hImageList);
633 #endif // _WTL_CMDBAR_VISTA_MENUS 639 ATLASSERT(HIWORD(PtrToUlong(image.m_lpstr)) == 0);
640 int nIDImage = (int)(
short)LOWORD(PtrToUlong(image.m_lpstr));
641 bmp.LoadMappedBitmap(nIDImage, (WORD)nFlags, lpColorMap, nMapSize);
646 bmp = (HBITMAP)::LoadImage(ModuleHelper::GetResourceInstance(), image.m_lpstr, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
648 bmp.LoadBitmap(image.m_lpstr);
650 ATLASSERT(bmp.m_hBitmap != NULL);
651 if(bmp.m_hBitmap == NULL)
653 if(::ImageList_AddMasked(m_hImageList, bmp, m_clrMask) == -1)
657 for(
int i = 0; i < nItems; i++)
660 m_arrCommand.Add(pItems[i]);
663 int nImageCount = ::ImageList_GetImageCount(m_hImageList);
664 ATLASSERT(nImageCount == m_arrCommand.GetSize());
665 if(nImageCount != m_arrCommand.GetSize())
668 #if _WTL_CMDBAR_VISTA_MENUS 669 if(RunTimeHelper::IsVista())
671 T* pT =
static_cast<T*
>(
this);
672 pT->_AddVistaBitmapsFromImageList(nOldImageCount, nImageCount - nOldImageCount);
673 ATLASSERT(nImageCount == m_arrVistaBitmap.GetSize());
675 #endif // _WTL_CMDBAR_VISTA_MENUS 682 ATLASSERT(::IsWindow(m_hWnd));
684 bmp.LoadBitmap(bitmap.m_lpstr);
685 if(bmp.m_hBitmap == NULL)
687 return AddBitmap(bmp, nCommandID);
690 BOOL AddBitmap(HBITMAP hBitmap, UINT nCommandID)
692 ATLASSERT(::IsWindow(m_hWnd));
693 T* pT =
static_cast<T*
>(
this);
695 if(m_hImageList == NULL)
697 if(!pT->CreateInternalImageList(1))
702 SIZE size = { 0, 0 };
704 if(size.cx != m_szBitmap.cx || size.cy != m_szBitmap.cy)
710 int nRet = ::ImageList_AddMasked(m_hImageList, hBitmap, m_clrMask);
713 BOOL bRet = m_arrCommand.Add((WORD)nCommandID);
714 ATLASSERT(::ImageList_GetImageCount(m_hImageList) == m_arrCommand.GetSize());
715 #if _WTL_CMDBAR_VISTA_MENUS 716 if(RunTimeHelper::IsVista())
718 pT->_AddVistaBitmapFromImageList(m_arrCommand.GetSize() - 1);
719 ATLASSERT(m_arrVistaBitmap.GetSize() == m_arrCommand.GetSize());
721 #endif // _WTL_CMDBAR_VISTA_MENUS 727 ATLASSERT(::IsWindow(m_hWnd));
728 HICON hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr);
731 return AddIcon(hIcon, nCommandID);
734 BOOL AddIcon(HICON hIcon, UINT nCommandID)
736 ATLASSERT(::IsWindow(m_hWnd));
737 T* pT =
static_cast<T*
>(
this);
739 if(m_hImageList == NULL)
741 if(!pT->CreateInternalImageList(1))
745 int nRet = ::ImageList_AddIcon(m_hImageList, hIcon);
748 BOOL bRet = m_arrCommand.Add((WORD)nCommandID);
749 ATLASSERT(::ImageList_GetImageCount(m_hImageList) == m_arrCommand.GetSize());
750 #if _WTL_CMDBAR_VISTA_MENUS 751 if(RunTimeHelper::IsVista())
753 pT->_AddVistaBitmapFromImageList(m_arrCommand.GetSize() - 1);
754 ATLASSERT(m_arrVistaBitmap.GetSize() == m_arrCommand.GetSize());
756 #endif // _WTL_CMDBAR_VISTA_MENUS 762 ATLASSERT(::IsWindow(m_hWnd));
764 bmp.LoadBitmap(bitmap.m_lpstr);
765 if(bmp.m_hBitmap == NULL)
767 return ReplaceBitmap(bmp, nCommandID);
770 BOOL ReplaceBitmap(HBITMAP hBitmap, UINT nCommandID)
772 ATLASSERT(::IsWindow(m_hWnd));
774 for(
int i = 0; i < m_arrCommand.GetSize(); i++)
776 if(m_arrCommand[i] == nCommandID)
778 bRet = ::ImageList_Remove(m_hImageList, i);
781 m_arrCommand.RemoveAt(i);
782 #if _WTL_CMDBAR_VISTA_MENUS 783 if(RunTimeHelper::IsVista())
785 if(m_arrVistaBitmap[i] != NULL)
786 ::DeleteObject(m_arrVistaBitmap[i]);
787 m_arrVistaBitmap.RemoveAt(i);
789 #endif // _WTL_CMDBAR_VISTA_MENUS 795 bRet = AddBitmap(hBitmap, nCommandID);
801 ATLASSERT(::IsWindow(m_hWnd));
802 HICON hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr);
805 return ReplaceIcon(hIcon, nCommandID);
808 BOOL ReplaceIcon(HICON hIcon, UINT nCommandID)
810 ATLASSERT(::IsWindow(m_hWnd));
812 for(
int i = 0; i < m_arrCommand.GetSize(); i++)
814 if(m_arrCommand[i] == nCommandID)
816 bRet = (::ImageList_ReplaceIcon(m_hImageList, i, hIcon) != -1);
817 #if _WTL_CMDBAR_VISTA_MENUS 818 if(RunTimeHelper::IsVista() && bRet != FALSE)
820 T* pT =
static_cast<T*
>(
this);
821 pT->_ReplaceVistaBitmapFromImageList(i);
823 #endif // _WTL_CMDBAR_VISTA_MENUS 830 BOOL RemoveImage(
int nCommandID)
832 ATLASSERT(::IsWindow(m_hWnd));
835 for(
int i = 0; i < m_arrCommand.GetSize(); i++)
837 if(m_arrCommand[i] == nCommandID)
839 bRet = ::ImageList_Remove(m_hImageList, i);
842 m_arrCommand.RemoveAt(i);
843 #if _WTL_CMDBAR_VISTA_MENUS 844 if(RunTimeHelper::IsVista())
846 if(m_arrVistaBitmap[i] != NULL)
847 ::DeleteObject(m_arrVistaBitmap[i]);
848 m_arrVistaBitmap.RemoveAt(i);
850 #endif // _WTL_CMDBAR_VISTA_MENUS 858 BOOL RemoveAllImages()
860 ATLASSERT(::IsWindow(m_hWnd));
862 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Removing all images\n"));
863 BOOL bRet = ::ImageList_RemoveAll(m_hImageList);
866 m_arrCommand.RemoveAll();
867 #if _WTL_CMDBAR_VISTA_MENUS 868 for(
int i = 0; i < m_arrVistaBitmap.GetSize(); i++)
870 if(m_arrVistaBitmap[i] != NULL)
871 ::DeleteObject(m_arrVistaBitmap[i]);
873 m_arrVistaBitmap.RemoveAll();
874 #endif // _WTL_CMDBAR_VISTA_MENUS 879 BOOL TrackPopupMenu(HMENU hMenu, UINT uFlags,
int x,
int y, LPTPMPARAMS lpParams = NULL)
881 ATLASSERT(::IsWindow(m_hWnd));
882 ATLASSERT(::IsMenu(hMenu));
885 m_bContextMenu =
true;
886 if(m_bUseKeyboardCues)
887 m_bShowKeyboardCues = m_bKeyboardInput;
888 T* pT =
static_cast<T*
>(
this);
889 return pT->DoTrackPopupMenu(hMenu, uFlags, x, y, lpParams);
892 BOOL SetMDIClient(HWND )
901 MESSAGE_HANDLER(WM_CREATE, OnCreate)
902 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
903 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
904 MESSAGE_HANDLER(WM_INITMENU, OnInitMenu)
905 MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)
906 MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect)
907 MESSAGE_HANDLER(GetAutoPopupMessage(), OnInternalAutoPopup)
908 MESSAGE_HANDLER(GetGetBarMessage(), OnInternalGetBar)
909 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
910 MESSAGE_HANDLER(WM_MENUCHAR, OnMenuChar)
911 MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
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"));
1105 if(wParam == VK_SPACE)
1107 m_wndParent.PostMessage(WM_SYSKEYDOWN, wParam, lParam | (1 << 29));
1110 #if (_WIN32_IE >= 0x0500) 1111 else if(wParam == VK_LEFT || wParam == VK_RIGHT)
1113 WPARAM wpNext = m_bLayoutRTL ? VK_LEFT : VK_RIGHT;
1117 T* pT =
static_cast<T*
>(
this);
1118 int nBtn = GetHotItem();
1119 int nNextBtn = (wParam == wpNext) ? pT->GetNextMenuItem(nBtn) : pT->GetPreviousMenuItem(nBtn);
1123 if(pT->DisplayChevronMenu())
1128 #endif // (_WIN32_IE >= 0x0500) 1132 LRESULT OnKeyUp(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1134 #ifdef _CMDBAR_EXTRA_TRACE 1135 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnKeyUp\n"));
1143 if(wParam != VK_SPACE)
1149 LRESULT OnChar(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1151 #ifdef _CMDBAR_EXTRA_TRACE 1152 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnChar\n"));
1160 if(wParam != VK_SPACE)
1165 if(!m_wndParent.IsWindowEnabled() || ::GetFocus() != m_hWnd)
1170 if(wParam != VK_RETURN && !MapAccelerator((TCHAR)LOWORD(wParam), nBtn))
1172 #if (_WIN32_IE >= 0x0500) 1173 if((TCHAR)LOWORD(wParam) != _chChevronShortcut)
1179 #if (_WIN32_IE >= 0x0500) 1180 RECT rcClient = { 0 };
1181 GetClientRect(&rcClient);
1183 GetItemRect(nBtn, &rcBtn);
1184 TBBUTTON tbb = { 0 };
1185 GetButton(nBtn, &tbb);
1186 if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0 && rcBtn.right <= rcClient.right)
1188 #endif // (_WIN32_IE >= 0x0500) 1189 PostMessage(WM_KEYDOWN, VK_DOWN, 0L);
1190 if(wParam != VK_RETURN)
1192 #if (_WIN32_IE >= 0x0500) 1199 #endif // (_WIN32_IE >= 0x0500) 1204 LRESULT OnSysKeyDown(UINT , WPARAM , LPARAM , BOOL& bHandled)
1206 #ifdef _CMDBAR_EXTRA_TRACE 1207 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnSysKeyDown\n"));
1213 LRESULT OnSysKeyUp(UINT , WPARAM , LPARAM , BOOL& bHandled)
1215 #ifdef _CMDBAR_EXTRA_TRACE 1216 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnSysKeyUp\n"));
1222 LRESULT OnSysChar(UINT , WPARAM , LPARAM , BOOL& bHandled)
1224 #ifdef _CMDBAR_EXTRA_TRACE 1225 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnSysChar\n"));
1231 LRESULT OnEraseBackground(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1233 if(m_bAttachedMenu || (m_dwExtendedStyle & CBR_EX_TRANSPARENT))
1241 GetClientRect(&rect);
1242 dc.FillRect(&rect, COLOR_MENU);
1247 LRESULT OnInitMenu(UINT , WPARAM , LPARAM , BOOL& bHandled)
1249 int nIndex = GetHotItem();
1250 SendMessage(WM_MENUSELECT, MAKEWPARAM(nIndex, MF_POPUP|MF_HILITE), (LPARAM)m_hMenu);
1255 LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1257 if((BOOL)HIWORD(lParam))
1263 if(!(m_bAttachedMenu || m_bMenuActive))
1269 #ifdef _CMDBAR_EXTRA_TRACE 1270 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnInitMenuPopup\n"));
1275 lRet = DefWindowProc(uMsg, wParam, (lParam || m_bContextMenu) ? lParam : GetHotItem());
1277 lRet = m_wndParent.DefWindowProc(uMsg, wParam, (lParam || m_bContextMenu) ? lParam : GetHotItem());
1279 #if _WTL_CMDBAR_VISTA_MENUS 1284 ATLASSERT(menu.m_hMenu != NULL);
1286 for(
int i = 0; i < menu.GetMenuItemCount(); i++)
1288 WORD nID = (WORD)menu.GetMenuItemID(i);
1289 int nIndex = m_arrCommand.Find(nID);
1292 mii.fMask = MIIM_BITMAP;
1293 mii.hbmpItem = (m_bImagesVisible && (nIndex != -1)) ? m_arrVistaBitmap[nIndex] : NULL;
1294 menu.SetMenuItemInfo(i, TRUE, &mii);
1299 #endif // _WTL_CMDBAR_VISTA_MENUS 1302 if(m_bImagesVisible)
1305 ATLASSERT(menuPopup.m_hMenu != NULL);
1307 T* pT =
static_cast<T*
>(
this);
1309 TCHAR szString[pT->_nMaxMenuItemTextLength] = { 0 };
1311 for(
int i = 0; i < menuPopup.GetMenuItemCount(); i++)
1314 mii.cch = pT->_nMaxMenuItemTextLength;
1315 mii.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE;
1316 mii.dwTypeData = szString;
1317 bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii);
1320 if(!(mii.fType & MFT_OWNERDRAW))
1322 mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE;
1325 ATLASSERT(pMI != NULL);
1328 pMI->fType = mii.fType;
1329 pMI->fState = mii.fState;
1330 mii.fType |= MFT_OWNERDRAW;
1332 for(
int j = 0; j < m_arrCommand.GetSize(); j++)
1334 if(m_arrCommand[j] == mii.wID)
1340 int cchLen = lstrlen(szString) + 1;
1341 pMI->lpstrText = NULL;
1342 ATLTRY(pMI->lpstrText =
new TCHAR[cchLen]);
1343 ATLASSERT(pMI->lpstrText != NULL);
1344 if(pMI->lpstrText != NULL)
1345 SecureHelper::strcpy_x(pMI->lpstrText, cchLen, szString);
1346 mii.dwItemData = (ULONG_PTR)pMI;
1347 bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii);
1354 m_stackMenuHandle.Push(menuPopup.m_hMenu);
1360 LRESULT OnMenuSelect(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1362 if(!m_bAttachedMenu)
1364 m_bPopupItem = (lParam != NULL) && ((HMENU)lParam != m_hMenu) && (HIWORD(wParam) & MF_POPUP);
1365 if(m_wndParent.IsWindow())
1366 m_wndParent.SendMessage(uMsg, wParam, lParam);
1372 if(HIWORD(wParam) == 0xFFFF && lParam == NULL)
1374 #ifdef _CMDBAR_EXTRA_TRACE 1375 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnMenuSelect - CLOSING!!!!\n"));
1377 ATLASSERT(m_stackMenuWnd.GetSize() == 0);
1379 if(m_bImagesVisible)
1382 while((hMenu = m_stackMenuHandle.Pop()) != NULL)
1385 ATLASSERT(menuPopup.m_hMenu != NULL);
1388 for(
int i = 0; i < menuPopup.GetMenuItemCount(); i++)
1391 mii.fMask = MIIM_DATA | MIIM_TYPE;
1392 bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii);
1396 if(pMI != NULL && pMI->IsCmdBarMenuItem())
1398 mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE;
1399 mii.fType = pMI->fType;
1400 mii.dwTypeData = pMI->lpstrText;
1401 mii.cch = lstrlen(pMI->lpstrText);
1402 mii.dwItemData = NULL;
1404 bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii);
1407 delete [] pMI->lpstrText;
1408 pMI->dwMagic = 0x6666;
1420 LRESULT OnInternalAutoPopup(UINT , WPARAM wParam, LPARAM , BOOL& )
1422 int nIndex = (int)wParam;
1423 T* pT =
static_cast<T*
>(
this);
1424 pT->DoPopupMenu(nIndex,
false);
1428 LRESULT OnInternalGetBar(UINT , WPARAM wParam, LPARAM , BOOL& )
1431 if((LPVOID)wParam != NULL)
1432 *((DWORD*)wParam) = GetCurrentProcessId();
1433 if(IsWindowVisible())
1439 LRESULT OnSettingChange(UINT , WPARAM wParam, LPARAM , BOOL& )
1441 #ifndef SPI_SETKEYBOARDCUES 1442 const UINT SPI_SETKEYBOARDCUES = 0x100B;
1443 #endif // !SPI_SETKEYBOARDCUES 1444 #ifndef SPI_GETFLATMENU 1445 const UINT SPI_SETFLATMENU = 0x1023;
1446 #endif // !SPI_GETFLATMENU 1448 if(wParam == SPI_SETNONCLIENTMETRICS || wParam == SPI_SETKEYBOARDCUES || wParam == SPI_SETFLATMENU)
1450 T* pT =
static_cast<T*
>(
this);
1451 pT->GetSystemSettings();
1457 LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
1459 LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
1461 LPWINDOWPOS lpWP = (LPWINDOWPOS)lParam;
1462 int cyMin = ::GetSystemMetrics(SM_CYMENU);
1463 if(lpWP->cy < cyMin)
1469 LRESULT OnMenuChar(UINT , WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1471 #ifdef _CMDBAR_EXTRA_TRACE 1472 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - OnMenuChar\n"));
1475 T* pT =
static_cast<T*
>(
this);
1478 if(m_bMenuActive && LOWORD(wParam) != 0x0D)
1481 lRet = MAKELRESULT(1, 1);
1483 if(m_bMenuActive && HIWORD(wParam) == MF_POPUP)
1486 TCHAR ch = (TCHAR)LOWORD(wParam);
1488 int nCount = ::GetMenuItemCount(menu);
1489 int nRetCode = MNC_EXECUTE;
1491 TCHAR szString[pT->_nMaxMenuItemTextLength] = { 0 };
1493 bool bFound =
false;
1494 for(
int i = 0; i < nCount; i++)
1497 mii.cch = pT->_nMaxMenuItemTextLength;
1498 mii.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE;
1499 mii.dwTypeData = szString;
1500 bRet = menu.GetMenuItemInfo(i, TRUE, &mii);
1501 if(!bRet || (mii.fType & MFT_SEPARATOR))
1504 if(pmd != NULL && pmd->IsCmdBarMenuItem())
1506 LPTSTR p = pmd->lpstrText;
1510 while(*p && *p != _T(
'&'))
1514 DWORD dwP = MAKELONG(*(++p), 0);
1515 DWORD dwC = MAKELONG(ch, 0);
1516 if(::CharLower((LPTSTR)ULongToPtr(dwP)) == ::CharLower((LPTSTR)ULongToPtr(dwC)))
1525 nRetCode = MNC_SELECT;
1535 if(nRetCode == MNC_EXECUTE)
1537 PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
1538 pT->GiveFocusBack();
1541 lRet = MAKELRESULT(wMnem, nRetCode);
1544 else if(!m_bMenuActive)
1547 if(!MapAccelerator((TCHAR)LOWORD(wParam), nBtn))
1550 PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
1551 pT->GiveFocusBack();
1553 #if (_WIN32_IE >= 0x0500) 1555 if((TCHAR)LOWORD(wParam) == pT->_chChevronShortcut)
1557 if(pT->DisplayChevronMenu())
1560 #endif // (_WIN32_IE >= 0x0500) 1562 else if(m_wndParent.IsWindowEnabled())
1564 #if (_WIN32_IE >= 0x0500) 1565 RECT rcClient = { 0 };
1566 GetClientRect(&rcClient);
1568 GetItemRect(nBtn, &rcBtn);
1569 TBBUTTON tbb = { 0 };
1570 GetButton(nBtn, &tbb);
1571 if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0 && rcBtn.right <= rcClient.right)
1573 #endif // (_WIN32_IE >= 0x0500) 1574 if(m_bUseKeyboardCues && !m_bShowKeyboardCues)
1576 m_bAllowKeyboardCues =
true;
1577 ShowKeyboardCues(
true);
1580 PostMessage(WM_KEYDOWN, VK_DOWN, 0L);
1582 #if (_WIN32_IE >= 0x0500) 1588 #endif // (_WIN32_IE >= 0x0500) 1595 LRESULT OnKillFocus(UINT , WPARAM , LPARAM , BOOL& bHandled)
1597 if(m_bUseKeyboardCues && m_bShowKeyboardCues)
1598 ShowKeyboardCues(
false);
1604 LRESULT OnDrawItem(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1606 LPDRAWITEMSTRUCT lpDrawItemStruct = (LPDRAWITEMSTRUCT)lParam;
1608 if(lpDrawItemStruct->CtlType == ODT_MENU && pmd != NULL && pmd->IsCmdBarMenuItem())
1610 T* pT =
static_cast<T*
>(
this);
1611 pT->DrawItem(lpDrawItemStruct);
1617 return (LRESULT)TRUE;
1620 LRESULT OnMeasureItem(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
1622 LPMEASUREITEMSTRUCT lpMeasureItemStruct = (LPMEASUREITEMSTRUCT)lParam;
1624 if(lpMeasureItemStruct->CtlType == ODT_MENU && pmd != NULL && pmd->IsCmdBarMenuItem())
1626 T* pT =
static_cast<T*
>(
this);
1627 pT->MeasureItem(lpMeasureItemStruct);
1633 return (LRESULT)TRUE;
1637 LRESULT OnAPIGetMenu(UINT , WPARAM , LPARAM , BOOL& )
1639 return (LRESULT)m_hMenu;
1642 LRESULT OnAPITrackPopupMenu(UINT , WPARAM , LPARAM lParam, BOOL& )
1646 LPCBRPOPUPMENU lpCBRPopupMenu = (LPCBRPOPUPMENU)lParam;
1650 T* pT =
static_cast<T*
>(
this);
1651 return pT->TrackPopupMenu(lpCBRPopupMenu->hMenu, lpCBRPopupMenu->uFlags, lpCBRPopupMenu->x, lpCBRPopupMenu->y, lpCBRPopupMenu->lptpm);
1654 LRESULT OnAPIGetCmdBar(UINT , WPARAM , LPARAM , BOOL& )
1656 return (LRESULT)m_hWnd;
1660 LRESULT OnParentHotItemChange(
int , LPNMHDR pnmh, BOOL& bHandled)
1662 LPNMTBHOTITEM lpNMHT = (LPNMTBHOTITEM)pnmh;
1665 if(pnmh->hwndFrom != m_hWnd)
1671 bool bBlockTracking =
false;
1672 if((m_dwExtendedStyle & CBR_EX_TRACKALWAYS) == 0)
1675 ::GetWindowThreadProcessId(::GetActiveWindow(), &dwProcessID);
1676 bBlockTracking = (::GetCurrentProcessId() != dwProcessID);
1679 if((!m_wndParent.IsWindowEnabled() || bBlockTracking) && (lpNMHT->dwFlags & HICF_MOUSE))
1686 const DWORD HICF_LMOUSE = 0x00000080;
1691 if(!(lpNMHT->dwFlags & HICF_MOUSE)
1692 && !(lpNMHT->dwFlags & HICF_ACCELERATOR)
1693 && !(lpNMHT->dwFlags & HICF_LMOUSE))
1695 if(lpNMHT->dwFlags & HICF_ENTERING)
1696 m_wndParent.SendMessage(WM_MENUSELECT, 0, (LPARAM)m_hMenu);
1697 if(lpNMHT->dwFlags & HICF_LEAVING)
1698 m_wndParent.SendMessage(WM_MENUSELECT, MAKEWPARAM(0, 0xFFFF), NULL);
1705 LRESULT OnParentDropDown(
int , LPNMHDR pnmh, BOOL& bHandled)
1708 if(pnmh->hwndFrom != m_hWnd)
1714 T* pT =
static_cast<T*
>(
this);
1715 if(::GetFocus() != m_hWnd)
1717 LPNMTOOLBAR pNMToolBar = (LPNMTOOLBAR)pnmh;
1718 int nIndex = CommandToIndex(pNMToolBar->iItem);
1719 m_bContextMenu =
false;
1720 m_bEscapePressed =
false;
1721 pT->DoPopupMenu(nIndex,
true);
1723 return TBDDRET_DEFAULT;
1726 LRESULT OnParentInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1728 return OnInitMenuPopup(uMsg, wParam, lParam, bHandled);
1731 LRESULT OnParentInternalGetBar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1733 return OnInternalGetBar(uMsg, wParam, lParam, bHandled);
1736 LRESULT OnParentSysCommand(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1739 if((m_uSysKey == VK_MENU
1740 || (m_uSysKey == VK_F10 && !(::GetKeyState(VK_SHIFT) & 0x80))
1741 || m_uSysKey == VK_SPACE)
1742 && wParam == SC_KEYMENU)
1744 T* pT =
static_cast<T*
>(
this);
1745 if(::GetFocus() == m_hWnd)
1747 pT->GiveFocusBack();
1748 PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
1750 else if(m_uSysKey != VK_SPACE && !m_bSkipMsg)
1752 if(m_bUseKeyboardCues && !m_bShowKeyboardCues && m_bAllowKeyboardCues)
1753 ShowKeyboardCues(
true);
1758 else if(m_uSysKey != VK_SPACE)
1767 LRESULT OnParentAPIGetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1769 return OnAPIGetMenu(uMsg, wParam, lParam, bHandled);
1772 LRESULT OnParentMenuChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1774 return OnMenuChar(uMsg, wParam, lParam, bHandled);
1777 LRESULT OnParentAPITrackPopupMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1779 return OnAPITrackPopupMenu(uMsg, wParam, lParam, bHandled);
1782 LRESULT OnParentAPIGetCmdBar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1784 return OnAPIGetCmdBar(uMsg, wParam, lParam, bHandled);
1787 LRESULT OnParentSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1789 OnSettingChange(uMsg, wParam, lParam, bHandled);
1794 LRESULT OnParentDrawItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1796 return OnDrawItem(uMsg, wParam, lParam, bHandled);
1799 LRESULT OnParentMeasureItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1801 return OnMeasureItem(uMsg, wParam, lParam, bHandled);
1804 LRESULT OnParentActivate(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1806 m_bParentActive = (LOWORD(wParam) != WA_INACTIVE);
1807 if(!m_bParentActive && m_bUseKeyboardCues && m_bShowKeyboardCues)
1809 ShowKeyboardCues(
false);
1820 LRESULT OnParentCustomDraw(
int , LPNMHDR pnmh, BOOL& bHandled)
1822 LRESULT lRet = CDRF_DODEFAULT;
1824 if(pnmh->hwndFrom == m_hWnd)
1826 LPNMTBCUSTOMDRAW lpTBCustomDraw = (LPNMTBCUSTOMDRAW)pnmh;
1827 if(lpTBCustomDraw->nmcd.dwDrawStage == CDDS_PREPAINT)
1829 lRet = CDRF_NOTIFYITEMDRAW;
1832 else if(lpTBCustomDraw->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
1834 #if _WTL_CMDBAR_VISTA_MENUS && defined(_WTL_CMDBAR_VISTA_STD_MENUBAR) 1837 ::SetRectEmpty(&lpTBCustomDraw->rcText);
1838 lRet = CDRF_NOTIFYPOSTPAINT;
1842 #endif // _WTL_CMDBAR_VISTA_MENUS && defined(_WTL_CMDBAR_VISTA_STD_MENUBAR) 1846 #ifndef COLOR_MENUHILIGHT 1847 const int COLOR_MENUHILIGHT = 29;
1848 #endif // !COLOR_MENUHILIGHT 1849 bool bDisabled = ((lpTBCustomDraw->nmcd.uItemState & CDIS_DISABLED) == CDIS_DISABLED);
1850 if(!bDisabled && ((lpTBCustomDraw->nmcd.uItemState & CDIS_HOT) == CDIS_HOT ||
1851 (lpTBCustomDraw->nmcd.uItemState & CDIS_SELECTED) == CDIS_SELECTED))
1853 ::FillRect(lpTBCustomDraw->nmcd.hdc, &lpTBCustomDraw->nmcd.rc, ::GetSysColorBrush(COLOR_MENUHILIGHT));
1854 ::FrameRect(lpTBCustomDraw->nmcd.hdc, &lpTBCustomDraw->nmcd.rc, ::GetSysColorBrush(COLOR_HIGHLIGHT));
1855 lpTBCustomDraw->clrText = ::GetSysColor(m_bParentActive ? COLOR_HIGHLIGHTTEXT : COLOR_GRAYTEXT);
1857 else if(bDisabled || !m_bParentActive)
1859 lpTBCustomDraw->clrText = ::GetSysColor(COLOR_GRAYTEXT);
1862 _ParentCustomDrawHelper(lpTBCustomDraw);
1864 lRet = CDRF_SKIPDEFAULT;
1867 else if(!m_bParentActive)
1869 lpTBCustomDraw->clrText = ::GetSysColor(COLOR_GRAYTEXT);
1874 #if _WTL_CMDBAR_VISTA_MENUS && defined(_WTL_CMDBAR_VISTA_STD_MENUBAR) 1875 else if (lpTBCustomDraw->nmcd.dwDrawStage == CDDS_ITEMPOSTPAINT)
1877 bool bDisabled = ((lpTBCustomDraw->nmcd.uItemState & CDIS_DISABLED) == CDIS_DISABLED);
1878 if(bDisabled || !m_bParentActive)
1879 lpTBCustomDraw->clrText = ::GetSysColor(COLOR_GRAYTEXT);
1881 _ParentCustomDrawHelper(lpTBCustomDraw);
1883 lRet = CDRF_SKIPDEFAULT;
1886 #endif // _WTL_CMDBAR_VISTA_MENUS && defined(_WTL_CMDBAR_VISTA_STD_MENUBAR) 1891 void _ParentCustomDrawHelper(LPNMTBCUSTOMDRAW lpTBCustomDraw)
1893 CDCHandle dc = lpTBCustomDraw->nmcd.hdc;
1894 dc.SetTextColor(lpTBCustomDraw->clrText);
1895 dc.SetBkMode(lpTBCustomDraw->nStringBkMode);
1897 HFONT hFont = GetFont();
1898 HFONT hFontOld = NULL;
1900 hFontOld = dc.SelectFont(hFont);
1902 const int cchText = 200;
1903 TCHAR szText[cchText] = { 0 };
1904 TBBUTTONINFO tbbi = { 0 };
1905 tbbi.cbSize =
sizeof(TBBUTTONINFO);
1906 tbbi.dwMask = TBIF_TEXT;
1907 tbbi.pszText = szText;
1908 tbbi.cchText = cchText;
1909 GetButtonInfo((
int)lpTBCustomDraw->nmcd.dwItemSpec, &tbbi);
1911 dc.DrawText(szText, -1, &lpTBCustomDraw->nmcd.rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX));
1914 dc.SelectFont(hFontOld);
1918 LRESULT OnHookMouseMove(UINT , WPARAM , LPARAM , BOOL& bHandled)
1920 static POINT s_point = { -1, -1 };
1921 DWORD dwPoint = ::GetMessagePos();
1922 POINT point = { GET_X_LPARAM(dwPoint), GET_Y_LPARAM(dwPoint) };
1927 if(::WindowFromPoint(point) == m_hWnd)
1929 ScreenToClient(&point);
1930 int nHit = HitTest(&point);
1932 if((point.x != s_point.x || point.y != s_point.y) && nHit >= 0 && nHit < ::GetMenuItemCount(m_hMenu) && nHit != m_nPopBtn && m_nPopBtn != -1)
1934 TBBUTTON tbb = { 0 };
1935 GetButton(nHit, &tbb);
1936 if((tbb.fsState & TBSTATE_ENABLED) != 0)
1938 m_nNextPopBtn = nHit | 0xFFFF0000;
1939 HWND hWndMenu = m_stackMenuWnd.GetCurrent();
1940 ATLASSERT(hWndMenu != NULL);
1943 ::PostMessage(hWndMenu, WM_LBUTTONUP, 0, MAKELPARAM(point.x, point.y));
1945 ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L);
1954 ScreenToClient(&point);
1961 LRESULT OnHookSysKeyDown(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1964 #ifdef _CMDBAR_EXTRA_TRACE 1965 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Hook WM_SYSKEYDOWN (0x%2.2X)\n"), wParam);
1968 if(wParam == VK_MENU && m_bParentActive && m_bUseKeyboardCues && !m_bShowKeyboardCues && m_bAllowKeyboardCues)
1969 ShowKeyboardCues(
true);
1971 if(wParam != VK_SPACE && !m_bMenuActive && ::GetFocus() == m_hWnd)
1973 m_bAllowKeyboardCues =
false;
1974 PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
1975 T* pT =
static_cast<T*
>(
this);
1976 pT->GiveFocusBack();
1981 if(wParam == VK_SPACE && m_bUseKeyboardCues && m_bShowKeyboardCues)
1983 m_bAllowKeyboardCues =
true;
1984 ShowKeyboardCues(
false);
1986 m_uSysKey = (UINT)wParam;
1991 LRESULT OnHookSysKeyUp(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
1993 if(!m_bAllowKeyboardCues)
1994 m_bAllowKeyboardCues =
true;
1997 #ifdef _CMDBAR_EXTRA_TRACE 1998 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Hook WM_SYSKEYUP (0x%2.2X)\n"), wParam);
2003 LRESULT OnHookSysChar(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
2006 #ifdef _CMDBAR_EXTRA_TRACE 2007 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Hook WM_SYSCHAR (0x%2.2X)\n"), wParam);
2010 if(!m_bMenuActive && m_hWndHook != m_hWnd && wParam != VK_SPACE)
2015 LRESULT OnHookKeyDown(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
2017 #ifdef _CMDBAR_EXTRA_TRACE 2018 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Hook WM_KEYDOWN (0x%2.2X)\n"), wParam);
2021 T* pT =
static_cast<T*
>(
this);
2023 if(wParam == VK_ESCAPE && m_stackMenuWnd.GetSize() <= 1)
2025 if(m_bMenuActive && !m_bContextMenu)
2027 int nHot = GetHotItem();
2035 m_bEscapePressed =
true;
2036 m_bSkipPostDown =
false;
2038 else if(::GetFocus() == m_hWnd && m_wndParent.IsWindow())
2041 pT->GiveFocusBack();
2045 else if(wParam == VK_RETURN || wParam == VK_UP || wParam == VK_DOWN)
2047 if(!m_bMenuActive && ::GetFocus() == m_hWnd && m_wndParent.IsWindow())
2049 int nHot = GetHotItem();
2052 if(wParam != VK_RETURN)
2054 if(!m_bSkipPostDown)
2057 #if (_WIN32_IE < 0x0500) 2058 DWORD dwMajor = 0, dwMinor = 0;
2059 ATL::AtlGetCommCtrlVersion(&dwMajor, &dwMinor);
2060 if(dwMajor <= 4 || (dwMajor == 5 && dwMinor < 80))
2063 GetItemRect(nHot, &rect);
2064 PostMessage(WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(rect.left, rect.top));
2066 #endif // (_WIN32_IE < 0x0500) 2067 PostMessage(WM_KEYDOWN, VK_DOWN, 0L);
2068 m_bSkipPostDown =
true;
2072 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - skipping posting another VK_DOWN\n"));
2073 m_bSkipPostDown =
false;
2079 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Can't find hot button\n"));
2082 if(wParam == VK_RETURN && m_bMenuActive)
2084 PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L);
2086 pT->GiveFocusBack();
2089 else if(wParam == VK_LEFT || wParam == VK_RIGHT)
2091 WPARAM wpNext = m_bLayoutRTL ? VK_LEFT : VK_RIGHT;
2092 WPARAM wpPrev = m_bLayoutRTL ? VK_RIGHT : VK_LEFT;
2094 if(m_bMenuActive && !m_bContextMenu && !(wParam == wpNext && m_bPopupItem))
2096 bool bAction =
false;
2097 if(wParam == wpPrev && s_pCurrentBar->m_stackMenuWnd.GetSize() == 1)
2099 m_nNextPopBtn = pT->GetPreviousMenuItem(m_nPopBtn);
2100 if(m_nNextPopBtn != -1)
2103 else if(wParam == wpNext)
2105 m_nNextPopBtn = pT->GetNextMenuItem(m_nPopBtn);
2106 if(m_nNextPopBtn != -1)
2109 HWND hWndMenu = m_stackMenuWnd.GetCurrent();
2110 ATLASSERT(hWndMenu != NULL);
2115 ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L);
2116 if(wParam == wpNext)
2118 int cItem = m_stackMenuWnd.GetSize() - 1;
2121 hWndMenu = m_stackMenuWnd[cItem];
2122 if(hWndMenu != NULL)
2123 ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L);
2127 #if (_WIN32_IE >= 0x0500) 2128 if(m_nNextPopBtn == -2)
2131 pT->DisplayChevronMenu();
2133 #endif // (_WIN32_IE >= 0x0500) 2141 LRESULT OnHookNextMenu(UINT , WPARAM , LPARAM , BOOL& bHandled)
2143 #ifdef _CMDBAR_EXTRA_TRACE 2144 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Hook WM_NEXTMENU\n"));
2150 LRESULT OnHookChar(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
2152 #ifdef _CMDBAR_EXTRA_TRACE 2153 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Hook WM_CHAR (0x%2.2X)\n"), wParam);
2155 bHandled = (wParam == VK_ESCAPE);
2160 void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
2162 T* pT =
static_cast<T*
>(
this);
2164 pT->DrawItemFlat(lpDrawItemStruct);
2166 pT->DrawItem3D(lpDrawItemStruct);
2170 void DrawItem3D(LPDRAWITEMSTRUCT lpDrawItemStruct)
2174 const RECT& rcItem = lpDrawItemStruct->rcItem;
2175 T* pT = static_cast<T*>(
this);
2177 if(pmd->fType & MFT_SEPARATOR)
2181 rc.top += (rc.bottom - rc.top) / 2;
2182 dc.DrawEdge(&rc, EDGE_ETCHED, BF_TOP);
2186 BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED;
2187 BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED;
2188 BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED;
2189 BOOL bHasImage = FALSE;
2191 if(LOWORD(lpDrawItemStruct->itemID) == (WORD)-1)
2193 RECT rcButn = { rcItem.left, rcItem.top, rcItem.left + m_szButton.cx, rcItem.top + m_szButton.cy };
2194 ::OffsetRect(&rcButn, 0, ((rcItem.bottom - rcItem.top) - (rcButn.bottom - rcButn.top)) / 2);
2196 int iButton = pmd->iButton;
2202 SIZE sz = { rcButn.right - rcButn.left - m_szBitmap.cx, rcButn.bottom - rcButn.top - m_szBitmap.cy };
2205 POINT point = { rcButn.left + sz.cx, rcButn.top + sz.cy };
2208 if(!bChecked || (bSelected && !bDisabled))
2211 dc.FillRect(&rcButn, (bChecked && !bSelected) ? COLOR_3DLIGHT : COLOR_MENU);
2213 dc.FillRect(&rcButn, COLOR_MENU);
2217 COLORREF crTxt = dc.SetTextColor(::GetSysColor(COLOR_BTNFACE));
2218 COLORREF crBk = dc.SetBkColor(::GetSysColor(COLOR_BTNHILIGHT));
2219 CBrush hbr(CDCHandle::GetHalftoneBrush());
2220 dc.SetBrushOrg(rcButn.left, rcButn.top);
2221 dc.FillRect(&rcButn, hbr);
2222 dc.SetTextColor(crTxt);
2223 dc.SetBkColor(crBk);
2230 if(bSelected || bChecked)
2233 dc.DrawEdge(&rc2, bChecked ? BDR_SUNKENOUTER : BDR_RAISEDINNER, BF_RECT);
2236 ::ImageList_Draw(m_hImageList, iButton, dc, point.x, point.y, ILD_TRANSPARENT);
2240 HBRUSH hBrushBackground = bChecked ? NULL : ::GetSysColorBrush(COLOR_MENU);
2241 pT->DrawBitmapDisabled(dc, iButton, point, hBrushBackground);
2248 info.fMask = MIIM_CHECKMARKS | MIIM_TYPE;
2249 ::GetMenuItemInfo((HMENU)lpDrawItemStruct->hwndItem, lpDrawItemStruct->itemID, MF_BYCOMMAND, &info);
2250 if(bChecked || info.hbmpUnchecked != NULL)
2252 BOOL bRadio = ((info.fType & MFT_RADIOCHECK) != 0);
2253 bHasImage = pT->DrawCheckmark(dc, rcButn, bSelected, bDisabled, bRadio, bChecked ? info.hbmpChecked : info.hbmpUnchecked);
2258 int cxButn = m_szButton.cx;
2259 COLORREF colorBG = ::GetSysColor(bSelected ? COLOR_HIGHLIGHT : COLOR_MENU);
2260 if(bSelected || lpDrawItemStruct->itemAction == ODA_SELECT)
2264 rcBG.left += cxButn + s_kcxGap;
2265 dc.FillRect(&rcBG, bSelected ? COLOR_HIGHLIGHT : COLOR_MENU);
2269 RECT rcText = rcItem;
2270 rcText.left += cxButn + s_kcxGap + s_kcxTextMargin;
2271 rcText.right -= cxButn;
2272 dc.SetBkMode(TRANSPARENT);
2273 COLORREF colorText = ::GetSysColor(bDisabled ? (bSelected ? COLOR_GRAYTEXT : COLOR_3DSHADOW) : (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT));
2276 if(bDisabled && (!bSelected || colorText == colorBG))
2279 RECT rcDisabled = rcText;
2280 ::OffsetRect(&rcDisabled, 1, 1);
2281 pT->DrawMenuText(dc, rcDisabled, pmd->lpstrText, ::GetSysColor(COLOR_3DHILIGHT));
2283 pT->DrawMenuText(dc, rcText, pmd->lpstrText, colorText);
2287 void DrawItemFlat(LPDRAWITEMSTRUCT lpDrawItemStruct)
2291 const RECT& rcItem = lpDrawItemStruct->rcItem;
2292 T* pT = static_cast<T*>(
this);
2294 #ifndef COLOR_MENUHILIGHT 2295 const int COLOR_MENUHILIGHT = 29;
2296 #endif // !COLOR_MENUHILIGHT 2298 BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED;
2299 BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED;
2300 BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED;
2303 if(bSelected || lpDrawItemStruct->itemAction == ODA_SELECT)
2307 dc.FillRect(&rcItem, ::GetSysColorBrush(COLOR_MENUHILIGHT));
2308 dc.FrameRect(&rcItem, ::GetSysColorBrush(COLOR_HIGHLIGHT));
2312 dc.FillRect(&rcItem, ::GetSysColorBrush(COLOR_MENU));
2316 if(pmd->fType & MFT_SEPARATOR)
2320 rc.top += (rc.bottom - rc.top) / 2;
2321 dc.DrawEdge(&rc, EDGE_ETCHED, BF_TOP);
2325 if(LOWORD(lpDrawItemStruct->itemID) == (WORD)-1)
2327 RECT rcButn = { rcItem.left, rcItem.top, rcItem.left + m_szButton.cx, rcItem.top + m_szButton.cy };
2328 ::OffsetRect(&rcButn, 0, ((rcItem.bottom - rcItem.top) - (rcButn.bottom - rcButn.top)) / 2);
2333 RECT rcCheck = rcButn;
2334 ::InflateRect(&rcCheck, -1, -1);
2336 dc.FillRect(&rcCheck, ::GetSysColorBrush(COLOR_MENU));
2337 dc.FrameRect(&rcCheck, ::GetSysColorBrush(COLOR_HIGHLIGHT));
2340 int iButton = pmd->iButton;
2344 SIZE sz = { rcButn.right - rcButn.left - m_szBitmap.cx, rcButn.bottom - rcButn.top - m_szBitmap.cy };
2347 POINT point = { rcButn.left + sz.cx, rcButn.top + sz.cy };
2352 ::ImageList_Draw(m_hImageList, iButton, dc, point.x, point.y, ILD_TRANSPARENT);
2356 HBRUSH hBrushBackground = ::GetSysColorBrush((bSelected && !(bDisabled && bChecked)) ? COLOR_MENUHILIGHT : COLOR_MENU);
2357 HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW);
2358 pT->DrawBitmapDisabled(dc, iButton, point, hBrushBackground, hBrushBackground, hBrushDisabledImage);
2365 info.fMask = MIIM_CHECKMARKS | MIIM_TYPE;
2366 ::GetMenuItemInfo((HMENU)lpDrawItemStruct->hwndItem, lpDrawItemStruct->itemID, MF_BYCOMMAND, &info);
2367 if(bChecked || info.hbmpUnchecked != NULL)
2369 BOOL bRadio = ((info.fType & MFT_RADIOCHECK) != 0);
2370 pT->DrawCheckmark(dc, rcButn, bSelected, bDisabled, bRadio, bChecked ? info.hbmpChecked : info.hbmpUnchecked);
2375 int cxButn = m_szButton.cx;
2377 RECT rcText = rcItem;
2378 rcText.left += cxButn + s_kcxGap + s_kcxTextMargin;
2379 rcText.right -= cxButn;
2380 dc.SetBkMode(TRANSPARENT);
2381 COLORREF colorText = ::GetSysColor(bDisabled ? (bSelected ? COLOR_GRAYTEXT : COLOR_3DSHADOW) : (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT));
2383 pT->DrawMenuText(dc, rcText, pmd->lpstrText, colorText);
2387 void DrawMenuText(
CDCHandle& dc, RECT& rc, LPCTSTR lpstrText, COLORREF color)
2390 const int nLen = lstrlen(lpstrText);
2391 for(
int i = 0; i < nLen; i++)
2393 if(lpstrText[i] == _T(
'\t'))
2399 dc.SetTextColor(color);
2400 dc.DrawText(lpstrText, nTab, &rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX));
2402 dc.DrawText(&lpstrText[nTab + 1], -1, &rc, DT_SINGLELINE | DT_RIGHT | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX));
2405 void DrawBitmapDisabled(
CDCHandle& dc,
int nImage, POINT point,
2406 HBRUSH hBrushBackground = ::GetSysColorBrush(COLOR_3DFACE),
2407 HBRUSH hBrush3DEffect = ::GetSysColorBrush(COLOR_3DHILIGHT),
2408 HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW))
2410 #if (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) 2413 IMAGELISTDRAWPARAMS ildp = { 0 };
2414 ildp.cbSize =
sizeof(IMAGELISTDRAWPARAMS);
2415 ildp.himl = m_hImageList;
2424 ildp.fStyle = ILD_TRANSPARENT;
2425 ildp.fState = ILS_SATURATE;
2427 ::ImageList_DrawIndirect(&ildp);
2430 #endif // (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) 2434 dcMem.CreateCompatibleDC(dc);
2437 bmp.CreateCompatibleBitmap(dc, m_szBitmap.cx, m_szBitmap.cy);
2438 ATLASSERT(bmp.m_hBitmap != NULL);
2440 HBITMAP hBmpOld = dcMem.SelectBitmap(bmp);
2441 dcMem.PatBlt(0, 0, m_szBitmap.cx, m_szBitmap.cy, WHITENESS);
2444 UINT uDrawStyle = (::GetSysColor(COLOR_BTNTEXT) == RGB(255, 255, 255)) ? ILD_MASK : ILD_NORMAL;
2445 ::ImageList_Draw(m_hImageList, nImage, dcMem, 0, 0, uDrawStyle);
2446 dc.DitherBlt(point.x, point.y, m_szBitmap.cx, m_szBitmap.cy, dcMem, NULL, 0, 0, hBrushBackground, hBrush3DEffect, hBrushDisabledImage);
2447 dcMem.SelectBitmap(hBmpOld);
2452 BOOL Draw3DCheckmark(
CDCHandle& dc,
const RECT& rc, BOOL bSelected, BOOL bDisabled, BOOL bRadio, HBITMAP hBmpCheck)
2454 return DrawCheckmark(dc, rc, bSelected, bDisabled, bRadio, hBmpCheck);
2457 BOOL DrawCheckmark(
CDCHandle& dc,
const RECT& rc, BOOL bSelected, BOOL bDisabled, BOOL bRadio, HBITMAP hBmpCheck)
2460 SIZE size = { 0, 0 };
2462 if(hBmpCheck != NULL)
2468 size.cx = ::GetSystemMetrics(SM_CXMENUCHECK);
2469 size.cy = ::GetSystemMetrics(SM_CYMENUCHECK);
2470 bmp.CreateCompatibleBitmap(dc, size.cx, size.cy);
2471 ATLASSERT(bmp.m_hBitmap != NULL);
2475 if((rc.right - rc.left) > size.cx)
2477 rcDest.left = rc.left + (rc.right - rc.left - size.cx) / 2;
2478 rcDest.right = rcDest.left + size.cx;
2480 if((rc.bottom - rc.top) > size.cy)
2482 rcDest.top = rc.top + (rc.bottom - rc.top - size.cy) / 2;
2483 rcDest.bottom = rcDest.top + size.cy;
2488 if(bSelected && !bDisabled)
2490 dc.FillRect(&rcDest, COLOR_MENU);
2494 COLORREF clrTextOld = dc.SetTextColor(::GetSysColor(COLOR_BTNFACE));
2495 COLORREF clrBkOld = dc.SetBkColor(::GetSysColor(COLOR_BTNHILIGHT));
2496 CBrush hbr(CDCHandle::GetHalftoneBrush());
2497 dc.SetBrushOrg(rcDest.left, rcDest.top);
2498 dc.FillRect(&rcDest, hbr);
2499 dc.SetTextColor(clrTextOld);
2500 dc.SetBkColor(clrBkOld);
2506 dcSource.CreateCompatibleDC(dc);
2507 HBITMAP hBmpOld = dcSource.SelectBitmap(bmp);
2509 const COLORREF clrBlack = RGB(0, 0, 0);
2510 const COLORREF clrWhite = RGB(255, 255, 255);
2511 COLORREF clrTextOld = dc.SetTextColor(clrBlack);
2512 COLORREF clrBkOld = dc.SetBkColor(clrWhite);
2515 dcMask.CreateCompatibleDC(dc);
2517 bmpMask.CreateBitmap(size.cx, size.cy, 1, 1, NULL);
2518 HBITMAP hBmpOld1 = dcMask.SelectBitmap(bmpMask);
2521 int cx = rcDest.right - rcDest.left;
2522 int cy = rcDest.bottom - rcDest.top;
2523 if(hBmpCheck != NULL)
2526 dcSource.SetBkColor(m_clrMask);
2527 dcMask.SetBkColor(clrBlack);
2528 dcMask.SetTextColor(clrWhite);
2529 dcMask.BitBlt(0, 0, size.cx, size.cy, dcSource, 0, 0, SRCCOPY);
2531 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, SRCINVERT);
2532 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, SRCAND);
2533 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, SRCINVERT);
2537 const DWORD ROP_DSno = 0x00BB0226L;
2538 const DWORD ROP_DSa = 0x008800C6L;
2539 const DWORD ROP_DSo = 0x00EE0086L;
2540 const DWORD ROP_DSna = 0x00220326L;
2543 RECT rcSource = { 0, 0, __min(size.cx, rc.right - rc.left), __min(size.cy, rc.bottom - rc.top) };
2544 dcMask.DrawFrameControl(&rcSource, DFC_MENU, bRadio ? DFCS_MENUBULLET : DFCS_MENUCHECK);
2547 if(!m_bFlatMenus && bDisabled)
2550 int x = rcDest.left + 1;
2551 int y = rcDest.top + 1;
2553 const int nColor = COLOR_3DHILIGHT;
2554 dcSource.FillRect(&rcSource, nColor);
2556 COLORREF clrCheck = ::GetSysColor(nColor);
2557 if(clrCheck == clrWhite)
2559 dc.BitBlt(x, y, cx, cy, dcMask, 0, 0, ROP_DSno);
2560 dc.BitBlt(x, y, cx, cy, dcSource, 0, 0, ROP_DSa);
2564 if(clrCheck != clrBlack)
2566 ATLASSERT(dcSource.GetTextColor() == clrBlack);
2567 ATLASSERT(dcSource.GetBkColor() == clrWhite);
2568 dcSource.BitBlt(0, 0, size.cx, size.cy, dcMask, 0, 0, ROP_DSna);
2570 dc.BitBlt(x, y, cx, cy, dcMask, 0, 0, ROP_DSa);
2571 dc.BitBlt(x, y, cx, cy, dcSource, 0, 0, ROP_DSo);
2576 const int nColor = bDisabled ? COLOR_BTNSHADOW : COLOR_MENUTEXT;
2577 dcSource.FillRect(&rcSource, nColor);
2579 COLORREF clrCheck = ::GetSysColor(nColor);
2580 if(clrCheck == clrWhite)
2582 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, ROP_DSno);
2583 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, ROP_DSa);
2587 if(clrCheck != clrBlack)
2589 ATLASSERT(dcSource.GetTextColor() == clrBlack);
2590 ATLASSERT(dcSource.GetBkColor() == clrWhite);
2591 dcSource.BitBlt(0, 0, size.cx, size.cy, dcMask, 0, 0, ROP_DSna);
2593 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, ROP_DSa);
2594 dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, ROP_DSo);
2598 dc.SetTextColor(clrTextOld);
2599 dc.SetBkColor(clrBkOld);
2600 dcSource.SelectBitmap(hBmpOld);
2601 dcMask.SelectBitmap(hBmpOld1);
2602 if(hBmpCheck == NULL)
2605 if(!m_bFlatMenus && !bDisabled)
2607 if(rc.right - rc.left > size.cx)
2608 ::InflateRect(&rcDest, 1,1);
2609 dc.DrawEdge(&rcDest, BDR_SUNKENOUTER, BF_RECT);
2615 void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
2619 if(pmd->fType & MFT_SEPARATOR)
2621 lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU) / 2;
2622 lpMeasureItemStruct->itemWidth = 0;
2629 HFONT hOldFont = NULL;
2630 if(pmd->fState & MFS_DEFAULT)
2634 m_fontMenu.GetLogFont(lf);
2636 fontBold.CreateFontIndirect(&lf);
2637 ATLASSERT(fontBold.m_hFont != NULL);
2638 hOldFont = dc.SelectFont(fontBold);
2642 hOldFont = dc.SelectFont(m_fontMenu);
2645 RECT rcText = { 0 };
2646 dc.DrawText(pmd->lpstrText, -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT);
2647 int cx = rcText.right - rcText.left;
2648 dc.SelectFont(hOldFont);
2651 m_fontMenu.GetLogFont(lf);
2652 int cy = lf.lfHeight;
2655 const int cyMargin = 8;
2659 lpMeasureItemStruct->itemHeight = __max(cy, (
int)m_szButton.cy);
2662 cx += 2 * s_kcxTextMargin;
2664 cx += 2 * m_szButton.cx;
2665 cx += m_cxExtraSpacing;
2668 cx -= ::GetSystemMetrics(SM_CXMENUCHECK) - 1;
2669 lpMeasureItemStruct->itemWidth = cx;
2674 static LRESULT CALLBACK CreateHookProc(
int nCode, WPARAM wParam, LPARAM lParam)
2676 const int cchClassName = 7;
2677 TCHAR szClassName[cchClassName] = { 0 };
2679 if(nCode == HCBT_CREATEWND)
2681 HWND hWndMenu = (HWND)wParam;
2682 #ifdef _CMDBAR_EXTRA_TRACE 2683 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - HCBT_CREATEWND (HWND = %8.8X)\n"), hWndMenu);
2686 ::GetClassName(hWndMenu, szClassName, cchClassName);
2687 if(!lstrcmp(_T(
"#32768"), szClassName))
2688 s_pCurrentBar->m_stackMenuWnd.Push(hWndMenu);
2690 else if(nCode == HCBT_DESTROYWND)
2692 HWND hWndMenu = (HWND)wParam;
2693 #ifdef _CMDBAR_EXTRA_TRACE 2694 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - HCBT_DESTROYWND (HWND = %8.8X)\n"), hWndMenu);
2697 ::GetClassName(hWndMenu, szClassName, cchClassName);
2698 if(!lstrcmp(_T(
"#32768"), szClassName))
2700 ATLASSERT(hWndMenu == s_pCurrentBar->m_stackMenuWnd.GetCurrent());
2701 s_pCurrentBar->m_stackMenuWnd.Pop();
2705 return ::CallNextHookEx(s_hCreateHook, nCode, wParam, lParam);
2708 static LRESULT CALLBACK MessageHookProc(
int nCode, WPARAM wParam, LPARAM lParam)
2710 LPMSG pMsg = (LPMSG)lParam;
2712 if(nCode == HC_ACTION && wParam == PM_REMOVE && pMsg->message != GetGetBarMessage() && pMsg->message != WM_FORWARDMSG)
2715 HWND hWnd = pMsg->hwnd;
2717 while(pCmdBar == NULL && hWnd != NULL)
2719 pCmdBar = (
CCommandBarCtrlBase*)::SendMessage(hWnd, GetGetBarMessage(), (WPARAM)&dwPID, 0L);
2720 hWnd = ::GetParent(hWnd);
2723 if(pCmdBar != NULL && dwPID == GetCurrentProcessId())
2725 pCmdBar->m_hWndHook = pMsg->hwnd;
2726 ATLASSERT(pCmdBar->IsCommandBarBase());
2728 if(::IsWindow(pCmdBar->m_hWnd))
2729 pCmdBar->SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg);
2731 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - Hook skipping message, can't find command bar!\n"));
2736 ATLASSERT(s_pmapMsgHook != NULL);
2737 if(s_pmapMsgHook != NULL)
2739 DWORD dwThreadID = ::GetCurrentThreadId();
2740 _MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID);
2743 lRet = ::CallNextHookEx(pData->hMsgHook, nCode, wParam, lParam);
2750 void DoPopupMenu(
int nIndex,
bool bAnimate)
2752 #ifdef _CMDBAR_EXTRA_TRACE 2753 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - DoPopupMenu, bAnimate = %s\n"), bAnimate ?
"true" :
"false");
2757 #ifndef TPM_VERPOSANIMATION 2758 const UINT TPM_VERPOSANIMATION = 0x1000L;
2760 #ifndef TPM_NOANIMATION 2761 const UINT TPM_NOANIMATION = 0x4000L;
2763 T* pT =
static_cast<T*
>(
this);
2767 GetItemRect(nIndex, &rect);
2768 POINT pt = { rect.left, rect.bottom };
2769 MapWindowPoints(NULL, &pt, 1);
2770 MapWindowPoints(NULL, &rect);
2771 TPMPARAMS TPMParams = { 0 };
2772 TPMParams.cbSize =
sizeof(TPMPARAMS);
2773 TPMParams.rcExclude = rect;
2774 HMENU hMenuPopup = ::GetSubMenu(m_hMenu, nIndex);
2775 ATLASSERT(hMenuPopup != NULL);
2778 TBBUTTON tbb = { 0 };
2779 GetButton(nIndex, &tbb);
2780 int nCmdID = tbb.idCommand;
2785 PressButton(nCmdID, TRUE);
2787 pT->DoTrackPopupMenu(hMenuPopup, TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN |
2788 (s_bW2K ? (bAnimate ? TPM_VERPOSANIMATION : TPM_NOANIMATION) : 0), pt.x, pt.y, &TPMParams);
2789 PressButton(nCmdID, FALSE);
2790 if(::GetFocus() != m_hWnd)
2797 if(::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rect, msg.pt))
2798 ::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE);
2801 if(m_nNextPopBtn != -1)
2803 PostMessage(GetAutoPopupMessage(), m_nNextPopBtn & 0xFFFF);
2804 if(!(m_nNextPopBtn & 0xFFFF0000) && !m_bPopupItem)
2805 PostMessage(WM_KEYDOWN, VK_DOWN, 0);
2810 m_bContextMenu =
false;
2812 if(!m_bEscapePressed)
2814 if(m_bUseKeyboardCues && m_bShowKeyboardCues)
2815 m_bAllowKeyboardCues =
false;
2816 pT->GiveFocusBack();
2821 SetAnchorHighlight(TRUE);
2826 BOOL DoTrackPopupMenu(HMENU hMenu, UINT uFlags,
int x,
int y, LPTPMPARAMS lpParams = NULL)
2831 if(FAILED(lock.Lock()))
2833 ATLTRACE2(atlTraceUI, 0, _T(
"ERROR : Unable to lock critical section in CCommandBarCtrlImpl::DoTrackPopupMenu.\n"));
2838 ATLASSERT(s_hCreateHook == NULL);
2842 s_hCreateHook = ::SetWindowsHookEx(WH_CBT, CreateHookProc, ModuleHelper::GetModuleInstance(), GetCurrentThreadId());
2843 ATLASSERT(s_hCreateHook != NULL);
2845 m_bPopupItem =
false;
2846 m_bMenuActive =
true;
2848 BOOL bTrackRet = menuPopup.TrackPopupMenuEx(uFlags, x, y, m_hWnd, lpParams);
2849 m_bMenuActive =
false;
2851 ::UnhookWindowsHookEx(s_hCreateHook);
2853 s_hCreateHook = NULL;
2854 s_pCurrentBar = NULL;
2859 #ifdef _CMDBAR_EXTRA_TRACE 2860 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - TrackPopupMenu - cleanup\n"));
2863 ATLASSERT(m_stackMenuWnd.GetSize() == 0);
2866 ATL::CWindow wndTL = GetTopLevelParent();
2867 wndTL.UpdateWindow();
2870 if(m_bImagesVisible)
2872 HMENU hMenuSav = NULL;
2873 while((hMenuSav = m_stackMenuHandle.Pop()) != NULL)
2875 menuPopup = hMenuSav;
2878 for(
int i = 0; i < menuPopup.GetMenuItemCount(); i++)
2881 mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID;
2882 bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii);
2886 if(pMI != NULL && pMI->IsCmdBarMenuItem())
2888 mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE;
2889 mii.fType = pMI->fType;
2890 mii.fState = pMI->fState;
2891 mii.dwTypeData = pMI->lpstrText;
2892 mii.cch = lstrlen(pMI->lpstrText);
2893 mii.dwItemData = NULL;
2895 bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii);
2897 menuPopup.ModifyMenu(i, MF_BYPOSITION | mii.fType | mii.fState, mii.wID, pMI->lpstrText);
2900 delete [] pMI->lpstrText;
2909 int GetPreviousMenuItem(
int nBtn)
const 2913 #if (_WIN32_IE >= 0x0500) 2914 RECT rcClient = { 0 };
2915 GetClientRect(&rcClient);
2916 #endif // (_WIN32_IE >= 0x0500) 2918 for(nNextBtn = nBtn - 1; nNextBtn != nBtn; nNextBtn--)
2921 nNextBtn = ::GetMenuItemCount(m_hMenu) - 1;
2922 TBBUTTON tbb = { 0 };
2923 GetButton(nNextBtn, &tbb);
2924 #if (_WIN32_IE >= 0x0500) 2926 GetItemRect(nNextBtn, &rcBtn);
2927 if(rcBtn.right > rcClient.right)
2932 #endif // (_WIN32_IE >= 0x0500) 2933 if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0)
2936 return (nNextBtn != nBtn) ? nNextBtn : -1;
2939 int GetNextMenuItem(
int nBtn)
const 2943 #if (_WIN32_IE >= 0x0500) 2944 RECT rcClient = { 0 };
2945 GetClientRect(&rcClient);
2946 #endif // (_WIN32_IE >= 0x0500) 2948 int nCount = ::GetMenuItemCount(m_hMenu);
2949 for(nNextBtn = nBtn + 1; nNextBtn != nBtn; nNextBtn++)
2951 if(nNextBtn >= nCount)
2953 TBBUTTON tbb = { 0 };
2954 GetButton(nNextBtn, &tbb);
2955 #if (_WIN32_IE >= 0x0500) 2957 GetItemRect(nNextBtn, &rcBtn);
2958 if(rcBtn.right > rcClient.right)
2963 #endif // (_WIN32_IE >= 0x0500) 2964 if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0)
2967 return (nNextBtn != nBtn) ? nNextBtn : -1;
2970 #if (_WIN32_IE >= 0x0500) 2971 bool DisplayChevronMenu()
2974 HWND hWndReBar = GetParent();
2975 int nCount = (int)::SendMessage(hWndReBar, RB_GETBANDCOUNT, 0, 0L);
2977 for(
int i = 0; i < nCount; i++)
2979 REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_STYLE };
2980 BOOL bRetBandInfo = (BOOL)::SendMessage(hWndReBar, RB_GETBANDINFO, i, (LPARAM)&rbbi);
2981 if(bRetBandInfo && rbbi.hwndChild == m_hWnd)
2983 if((rbbi.fStyle & RBBS_USECHEVRON) != 0)
2985 ::PostMessage(hWndReBar, RB_PUSHCHEVRON, i, 0L);
2986 PostMessage(WM_KEYDOWN, VK_DOWN, 0L);
2994 #endif // (_WIN32_IE >= 0x0500) 2996 void GetSystemSettings()
2999 NONCLIENTMETRICS
info = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };
3000 BOOL bRet = ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
sizeof(info), &info, 0);
3004 LOGFONT logfont = { 0 };
3005 if(m_fontMenu.m_hFont != NULL)
3006 m_fontMenu.GetLogFont(logfont);
3007 if(logfont.lfHeight != info.lfMenuFont.lfHeight ||
3008 logfont.lfWidth != info.lfMenuFont.lfWidth ||
3009 logfont.lfEscapement != info.lfMenuFont.lfEscapement ||
3010 logfont.lfOrientation != info.lfMenuFont.lfOrientation ||
3011 logfont.lfWeight != info.lfMenuFont.lfWeight ||
3012 logfont.lfItalic != info.lfMenuFont.lfItalic ||
3013 logfont.lfUnderline != info.lfMenuFont.lfUnderline ||
3014 logfont.lfStrikeOut != info.lfMenuFont.lfStrikeOut ||
3015 logfont.lfCharSet != info.lfMenuFont.lfCharSet ||
3016 logfont.lfOutPrecision != info.lfMenuFont.lfOutPrecision ||
3017 logfont.lfClipPrecision != info.lfMenuFont.lfClipPrecision ||
3018 logfont.lfQuality != info.lfMenuFont.lfQuality ||
3019 logfont.lfPitchAndFamily != info.lfMenuFont.lfPitchAndFamily ||
3020 lstrcmp(logfont.lfFaceName, info.lfMenuFont.lfFaceName) != 0)
3022 HFONT hFontMenu = ::CreateFontIndirect(&info.lfMenuFont);
3023 ATLASSERT(hFontMenu != NULL);
3024 if(hFontMenu != NULL)
3026 if(m_fontMenu.m_hFont != NULL)
3027 m_fontMenu.DeleteObject();
3028 m_fontMenu.Attach(hFontMenu);
3029 SetFont(m_fontMenu);
3030 AddStrings(_T(
"NS\0"));
3038 HFONT hFontOld = dc.SelectFont(m_fontMenu);
3039 RECT rcText = { 0 };
3040 dc.DrawText(_T(
"\t"), -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT);
3041 if((rcText.right - rcText.left) < 4)
3043 ::SetRectEmpty(&rcText);
3044 dc.DrawText(_T(
"x"), -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT);
3045 m_cxExtraSpacing = rcText.right - rcText.left;
3049 m_cxExtraSpacing = 0;
3051 dc.SelectFont(hFontOld);
3054 #ifndef _versionhelpers_H_INCLUDED_ 3055 OSVERSIONINFO ovi = {
sizeof(OSVERSIONINFO) };
3056 ::GetVersionEx(&ovi);
3057 #endif // !_versionhelpers_H_INCLUDED_ 3060 #ifdef _versionhelpers_H_INCLUDED_ 3061 if(::IsWindowsVersionOrGreater(5, 0, 0))
3062 #else // !_versionhelpers_H_INCLUDED_ 3063 if (ovi.dwMajorVersion >= 5)
3064 #endif // _versionhelpers_H_INCLUDED_ 3066 #ifndef SPI_GETKEYBOARDCUES 3067 const UINT SPI_GETKEYBOARDCUES = 0x100A;
3068 #endif // !SPI_GETKEYBOARDCUES 3069 BOOL bRetVal = TRUE;
3070 bRet = ::SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, &bRetVal, 0);
3071 m_bUseKeyboardCues = (bRet && !bRetVal);
3072 m_bAllowKeyboardCues =
true;
3073 ShowKeyboardCues(!m_bUseKeyboardCues);
3077 #ifdef _versionhelpers_H_INCLUDED_ 3078 if(::IsWindowsXPOrGreater())
3079 #else // !_versionhelpers_H_INCLUDED_ 3080 if ((ovi.dwMajorVersion == 5 && ovi.dwMinorVersion >= 1) || (ovi.dwMajorVersion > 5))
3081 #endif // _versionhelpers_H_INCLUDED_ 3083 #ifndef SPI_GETFLATMENU 3084 const UINT SPI_GETFLATMENU = 0x1022;
3085 #endif // !SPI_GETFLATMENU 3086 BOOL bRetVal = FALSE;
3087 bRet = ::SystemParametersInfo(SPI_GETFLATMENU, 0, &bRetVal, 0);
3088 m_bFlatMenus = (bRet && bRetVal);
3091 #if _WTL_CMDBAR_VISTA_MENUS 3093 bool bVistaMenus = (((m_dwExtendedStyle & CBR_EX_NOVISTAMENUS) == 0) && RunTimeHelper::IsVista() && RunTimeHelper::IsThemeAvailable());
3094 if(!bVistaMenus && m_bVistaMenus && (m_hMenu != NULL) && (m_arrCommand.GetSize() > 0))
3096 T* pT =
static_cast<T*
>(
this);
3097 pT->_RemoveVistaBitmapsFromMenu();
3100 m_bVistaMenus = bVistaMenus;
3101 #endif // _WTL_CMDBAR_VISTA_MENUS 3103 #ifdef _CMDBAR_EXTRA_TRACE 3104 ATLTRACE2(atlTraceUI, 0, _T(
"CmdBar - GetSystemSettings:\n m_bFlatMenus = %s\n m_bUseKeyboardCues = %s m_bVistaMenus = %s\n"),
3105 m_bFlatMenus ?
"true" :
"false", m_bUseKeyboardCues ?
"true" :
"false", m_bVistaMenus ?
"true" :
"false");
3112 if((m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && m_hWndFocus == NULL)
3113 m_hWndFocus = ::GetFocus();
3117 void GiveFocusBack()
3121 if((m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && ::IsWindow(m_hWndFocus))
3122 ::SetFocus(m_hWndFocus);
3123 else if(!(m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && m_wndParent.IsWindow())
3124 m_wndParent.SetFocus();
3127 SetAnchorHighlight(FALSE);
3128 if(m_bUseKeyboardCues && m_bShowKeyboardCues)
3129 ShowKeyboardCues(
false);
3130 m_bSkipPostDown =
false;
3133 void ShowKeyboardCues(
bool bShow)
3135 m_bShowKeyboardCues = bShow;
3136 SetDrawTextFlags(DT_HIDEPREFIX, m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX);
3142 static UINT GetAutoPopupMessage()
3144 static UINT uAutoPopupMessage = 0;
3145 if(uAutoPopupMessage == 0)
3148 if(FAILED(lock.Lock()))
3150 ATLTRACE2(atlTraceUI, 0, _T(
"ERROR : Unable to lock critical section in CCommandBarCtrlImpl::GetAutoPopupMessage.\n"));
3155 if(uAutoPopupMessage == 0)
3156 uAutoPopupMessage = ::RegisterWindowMessage(_T(
"WTL_CmdBar_InternalAutoPopupMsg"));
3160 ATLASSERT(uAutoPopupMessage != 0);
3161 return uAutoPopupMessage;
3164 static UINT GetGetBarMessage()
3166 static UINT uGetBarMessage = 0;
3167 if(uGetBarMessage == 0)
3170 if(FAILED(lock.Lock()))
3172 ATLTRACE2(atlTraceUI, 0, _T(
"ERROR : Unable to lock critical section in CCommandBarCtrlImpl::GetGetBarMessage.\n"));
3177 if(uGetBarMessage == 0)
3178 uGetBarMessage = ::RegisterWindowMessage(_T(
"WTL_CmdBar_InternalGetBarMsg"));
3182 ATLASSERT(uGetBarMessage != 0);
3183 return uGetBarMessage;
3187 bool CreateInternalImageList(
int cImages)
3189 UINT uFlags = (m_bAlphaImages ? ILC_COLOR32 : ILC_COLOR24) | ILC_MASK;
3190 m_hImageList = ::ImageList_Create(m_szBitmap.cx, m_szBitmap.cy, uFlags, cImages, 1);
3191 ATLASSERT(m_hImageList != NULL);
3192 return (m_hImageList != NULL);
3196 #if _WTL_CMDBAR_VISTA_MENUS 3197 void _AddVistaBitmapsFromImageList(
int nStartIndex,
int nCount)
3202 dcMem.CreateCompatibleDC(dc);
3203 HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();
3205 T* pT =
static_cast<T*
>(
this);
3207 for(
int i = 0; i < nCount; i++)
3209 HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nStartIndex + i, dc, dcMem);
3210 dcMem.SelectBitmap(hBitmapSave);
3211 m_arrVistaBitmap.Add(hBitmap);
3215 void _AddVistaBitmapFromImageList(
int nIndex)
3220 dcMem.CreateCompatibleDC(dc);
3221 HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();
3224 T* pT =
static_cast<T*
>(
this);
3225 HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, dc, dcMem);
3228 dcMem.SelectBitmap(hBitmapSave);
3229 m_arrVistaBitmap.Add(hBitmap);
3232 void _ReplaceVistaBitmapFromImageList(
int nIndex)
3235 if(m_arrVistaBitmap[nIndex] != NULL)
3236 ::DeleteObject(m_arrVistaBitmap[nIndex]);
3241 dcMem.CreateCompatibleDC(dc);
3242 HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();
3245 T* pT =
static_cast<T*
>(
this);
3246 HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, dc, dcMem);
3249 dcMem.SelectBitmap(hBitmapSave);
3250 m_arrVistaBitmap.SetAtIndex(nIndex, hBitmap);
3253 HBITMAP _CreateVistaBitmapHelper(
int nIndex, HDC hDCSource, HDC hDCTarget)
3256 BITMAPINFO bi = { 0 };
3257 bi.bmiHeader.biSize =
sizeof(BITMAPINFOHEADER);
3258 bi.bmiHeader.biWidth = m_szBitmap.cx;
3259 bi.bmiHeader.biHeight = m_szBitmap.cy;
3260 bi.bmiHeader.biPlanes = 1;
3261 bi.bmiHeader.biBitCount = 32;
3262 bi.bmiHeader.biCompression = BI_RGB;
3263 bi.bmiHeader.biSizeImage = 0;
3264 bi.bmiHeader.biXPelsPerMeter = 0;
3265 bi.bmiHeader.biYPelsPerMeter = 0;
3266 bi.bmiHeader.biClrUsed = 0;
3267 bi.bmiHeader.biClrImportant = 0;
3268 HBITMAP hBitmap = ::CreateDIBSection(hDCSource, &bi, DIB_RGB_COLORS, NULL, NULL, 0);
3269 ATLASSERT(hBitmap != NULL);
3274 ::SelectObject(hDCTarget, hBitmap);
3276 IMAGELISTDRAWPARAMS ildp = { 0 };
3277 ildp.cbSize =
sizeof(IMAGELISTDRAWPARAMS);
3278 ildp.himl = m_hImageList;
3280 ildp.hdcDst = hDCTarget;
3287 ildp.fStyle = ILD_TRANSPARENT;
3288 ildp.fState = ILS_ALPHA;
3290 ::ImageList_DrawIndirect(&ildp);
3296 void _RemoveVistaBitmapsFromMenu()
3299 for(
int i = 0; i < m_arrCommand.GetSize(); i++)
3302 mii.fMask = MIIM_BITMAP;
3303 mii.hbmpItem = NULL;
3304 menu.SetMenuItemInfo(m_arrCommand[i], FALSE, &mii);
3307 #endif // _WTL_CMDBAR_VISTA_MENUS 3314 DECLARE_WND_SUPERCLASS(_T(
"WTL_CommandBar"), GetWndClassName())
3321 template <
class T,
class TBase = CCommandBarCtrlBase,
class TWinTraits = ATL::CControlWinTraits>
3326 ATL::CContainedWindow m_wndMDIClient;
3327 bool m_bChildMaximized;
3328 HWND m_hWndChildMaximized;
3329 HICON m_hIconChildMaximized;
3331 int m_nBtnWasPressed;
3342 #ifndef _WTL_NO_AUTO_THEME 3344 typedef HANDLE HTHEME;
3345 #endif // !_UXTHEME_H_ 3346 typedef HTHEME (STDAPICALLTYPE *PFN_OpenThemeData)(HWND hwnd, LPCWSTR pszClassList);
3347 typedef HRESULT (STDAPICALLTYPE *PFN_CloseThemeData)(HTHEME hTheme);
3348 typedef HRESULT (STDAPICALLTYPE *PFN_DrawThemeBackground)(HTHEME hTheme, HDC hdc,
int iPartId,
int iStateId,
const RECT *pRect, OPTIONAL
const RECT *pClipRect);
3349 typedef HRESULT (STDAPICALLTYPE *PFN_DrawThemeParentBackground)(HWND hwnd, HDC hdc, OPTIONAL RECT* prc);
3351 HMODULE m_hThemeDLL;
3353 PFN_DrawThemeBackground m_pfnDrawThemeBackground;
3354 PFN_DrawThemeParentBackground m_pfnDrawThemeParentBackground;
3355 #endif // !_WTL_NO_AUTO_THEME 3359 m_wndMDIClient(
this, 2), m_bChildMaximized(
false),
3360 m_hWndChildMaximized(NULL), m_hIconChildMaximized(NULL),
3361 m_nBtnPressed(-1), m_nBtnWasPressed(-1),
3362 #ifndef _WTL_NO_AUTO_THEME 3363 m_hThemeDLL(NULL), m_hTheme(NULL), m_pfnDrawThemeBackground(NULL), m_pfnDrawThemeParentBackground(NULL),
3364 #endif // !_WTL_NO_AUTO_THEME 3366 m_cxIconWidth(16), m_cyIconHeight(16),
3367 m_cxBtnWidth(16), m_cyBtnHeight(14),
3368 m_cxLeft(20), m_cxRight(55)
3373 if(m_wndMDIClient.IsWindow())
3374 m_wndMDIClient.UnsubclassWindow();
3378 BOOL SetMDIClient(HWND hWndMDIClient)
3380 ATLASSERT(::IsWindow(m_hWnd));
3381 ATLASSERT(::IsWindow(hWndMDIClient));
3382 if(!::IsWindow(hWndMDIClient))
3388 LPCTSTR lpszMDIClientClass = _T(
"MDICLIENT");
3389 const int nNameLen = 9 + 1;
3390 TCHAR szClassName[nNameLen] = { 0 };
3391 ::GetClassName(hWndMDIClient, szClassName, nNameLen);
3392 ATLASSERT(lstrcmpi(szClassName, lpszMDIClientClass) == 0);
3396 if(m_wndMDIClient.IsWindow())
3397 m_wndMDIClient.UnsubclassWindow();
3399 return m_wndMDIClient.SubclassWindow(hWndMDIClient);
3405 MESSAGE_HANDLER(WM_CREATE, OnCreate)
3406 MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
3407 #ifndef _WTL_NO_AUTO_THEME 3408 MESSAGE_HANDLER(_GetThemeChangedMsg(), OnThemeChanged)
3409 #endif // !_WTL_NO_AUTO_THEME 3410 MESSAGE_HANDLER(WM_SIZE, OnSize)
3411 MESSAGE_HANDLER(WM_NCCALCSIZE, OnNcCalcSize)
3412 MESSAGE_HANDLER(WM_NCPAINT, OnNcPaint)
3413 MESSAGE_HANDLER(WM_NCHITTEST, OnNcHitTest)
3414 MESSAGE_HANDLER(WM_NCLBUTTONDOWN, OnNcLButtonDown)
3415 MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
3416 MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
3417 MESSAGE_HANDLER(WM_NCLBUTTONDBLCLK, OnNcLButtonDblClk)
3418 MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged)
3419 CHAIN_MSG_MAP(_baseClass)
3421 MESSAGE_HANDLER(WM_ACTIVATE, OnParentActivate)
3422 CHAIN_MSG_MAP_ALT(_baseClass, 1)
3424 MESSAGE_HANDLER(WM_MDISETMENU, OnMDISetMenu)
3427 MESSAGE_RANGE_HANDLER(0, 0xFFFF, OnAllHookMessages)
3428 CHAIN_MSG_MAP_ALT(_baseClass, 3)
3432 LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
3434 LRESULT lRet = _baseClass::OnCreate(uMsg, wParam, lParam, bHandled);
3435 if(lRet == (LRESULT)-1)
3438 #ifndef _WTL_NO_AUTO_THEME 3440 m_hThemeDLL = ::LoadLibrary(_T(
"uxtheme.dll"));
3441 if(m_hThemeDLL != NULL)
3443 m_pfnDrawThemeBackground = (PFN_DrawThemeBackground)::GetProcAddress(m_hThemeDLL,
"DrawThemeBackground");
3444 ATLASSERT(m_pfnDrawThemeBackground != NULL);
3445 if(m_pfnDrawThemeBackground != NULL)
3447 T* pT =
static_cast<T*
>(
this);
3448 pT->_OpenThemeData();
3452 ::FreeLibrary(m_hThemeDLL);
3455 m_pfnDrawThemeParentBackground = (PFN_DrawThemeParentBackground)::GetProcAddress(m_hThemeDLL,
"DrawThemeParentBackground");
3456 ATLASSERT(m_pfnDrawThemeParentBackground != NULL);
3458 #endif // !_WTL_NO_AUTO_THEME 3463 LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
3465 LRESULT lRet = _baseClass::OnDestroy(uMsg, wParam, lParam, bHandled);
3467 #ifndef _WTL_NO_AUTO_THEME 3468 if(m_hThemeDLL != NULL)
3470 T* pT =
static_cast<T*
>(
this);
3471 pT->_CloseThemeData();
3472 ::FreeLibrary(m_hThemeDLL);
3475 #endif // !_WTL_NO_AUTO_THEME 3480 #ifndef _WTL_NO_AUTO_THEME 3481 LRESULT OnThemeChanged(UINT , WPARAM , LPARAM , BOOL& )
3483 if(m_hThemeDLL != NULL)
3485 T* pT =
static_cast<T*
>(
this);
3486 pT->_CloseThemeData();
3487 pT->_OpenThemeData();
3491 #endif // !_WTL_NO_AUTO_THEME 3493 LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
3495 LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
3496 T* pT =
static_cast<T*
>(
this);
3497 pT->_AdjustBtnSize(GET_Y_LPARAM(lParam));
3501 LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
3503 LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
3505 if(m_bChildMaximized && (BOOL)wParam)
3507 LPNCCALCSIZE_PARAMS lpParams = (LPNCCALCSIZE_PARAMS)lParam;
3510 lpParams->rgrc[0].left += m_cxRight;
3511 lpParams->rgrc[0].right -= m_cxLeft;
3515 lpParams->rgrc[0].left += m_cxLeft;
3516 lpParams->rgrc[0].right -= m_cxRight;
3523 LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
3525 LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
3527 if(!m_bChildMaximized)
3530 ATLASSERT(m_hWndChildMaximized != NULL && m_hIconChildMaximized != NULL);
3535 GetWindowRect(&rect);
3536 int cxWidth = rect.right - rect.left;
3537 int cyHeight = rect.bottom - rect.top;
3540 ::SetRect(&rect, 0, 0, m_cxLeft, cyHeight);
3541 #ifndef _WTL_NO_AUTO_THEME 3542 if(m_hTheme != NULL)
3544 if(m_pfnDrawThemeParentBackground != NULL)
3545 m_pfnDrawThemeParentBackground(m_hWnd, dc, &rect);
3547 dc.FillRect(&rect, COLOR_WINDOW);
3550 #endif // !_WTL_NO_AUTO_THEME 3552 if((m_dwExtendedStyle & CBR_EX_TRANSPARENT) != 0)
3553 dc.FillRect(&rect, COLOR_3DFACE);
3555 dc.FillRect(&rect, COLOR_MENU);
3558 RECT rcIcon = { 0 };
3559 T* pT =
static_cast<T*
>(
this);
3560 pT->_CalcIconRect(cxWidth, cyHeight, rcIcon);
3561 dc.DrawIconEx(rcIcon.left, rcIcon.top, m_hIconChildMaximized, m_cxIconWidth, m_cyIconHeight);
3564 ::SetRect(&rect, cxWidth - m_cxRight, 0, cxWidth, cyHeight);
3565 #ifndef _WTL_NO_AUTO_THEME 3566 if(m_hTheme != NULL)
3568 if(m_pfnDrawThemeParentBackground != NULL)
3571 POINT ptOrg = { 0, 0 };
3572 dc.GetViewportOrg(&ptOrg);
3573 dc.SetViewportOrg(ptOrg.x + m_cxLeft, ptOrg.y);
3574 ::OffsetRect(&rect, -m_cxLeft, 0);
3576 m_pfnDrawThemeParentBackground(m_hWnd, dc, &rect);
3579 dc.SetViewportOrg(ptOrg);
3580 ::OffsetRect(&rect, m_cxLeft, 0);
3584 dc.FillRect(&rect, COLOR_3DFACE);
3588 #endif // !_WTL_NO_AUTO_THEME 3590 if((m_dwExtendedStyle & CBR_EX_TRANSPARENT) != 0)
3591 dc.FillRect(&rect, COLOR_3DFACE);
3593 dc.FillRect(&rect, COLOR_MENU);
3597 RECT arrRect[3] = { 0 };
3598 pT->_CalcBtnRects(cxWidth, cyHeight, arrRect);
3599 pT->_DrawMDIButton(dc, arrRect, -1);
3604 LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
3606 LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
3607 if(m_bChildMaximized)
3610 GetWindowRect(&rect);
3611 POINT pt = { GET_X_LPARAM(lParam) - rect.left, GET_Y_LPARAM(lParam) - rect.top };
3614 if((pt.x < m_cxRight) || (pt.x > ((rect.right - rect.left) - m_cxLeft)))
3619 if((pt.x < m_cxLeft) || (pt.x > ((rect.right - rect.left) - m_cxRight)))
3626 LRESULT OnNcLButtonDown(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
3628 if(!m_bChildMaximized)
3634 ATLASSERT(_DebugCheckChild());
3636 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
3638 GetWindowRect(&rect);
3642 RECT rcIcon = { 0 };
3643 T* pT =
static_cast<T*
>(
this);
3644 pT->_CalcIconRect(rect.right - rect.left, rect.bottom - rect.top, rcIcon, m_bLayoutRTL);
3645 RECT arrRect[3] = { 0 };
3646 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL);
3648 if(::PtInRect(&rcIcon, pt))
3650 #ifdef _CMDBAR_EXTRA_TRACE 3651 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - LButtonDown: icon\n"));
3653 #ifndef TPM_VERPOSANIMATION 3654 const UINT TPM_VERPOSANIMATION = 0x1000L;
3656 CMenuHandle menu = ::GetSystemMenu(m_hWndChildMaximized, FALSE);
3657 UINT uRet = (UINT)menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD |
3658 (s_bW2K ? TPM_VERPOSANIMATION : 0), m_bLayoutRTL ? rect.right : rect.left, rect.bottom, m_hWndChildMaximized);
3661 ::OffsetRect(&rcIcon, rect.left, rect.top);
3663 if(::PeekMessage(&msg, m_hWnd, WM_NCLBUTTONDOWN, WM_NCLBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rcIcon, msg.pt))
3664 ::PeekMessage(&msg, m_hWnd, WM_NCLBUTTONDOWN, WM_NCLBUTTONDOWN, PM_REMOVE);
3667 ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, uRet, 0L);
3669 else if(::PtInRect(&arrRect[0], pt))
3671 #ifdef _CMDBAR_EXTRA_TRACE 3672 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - LButtonDown: close button\n"));
3674 m_nBtnWasPressed = m_nBtnPressed = 0;
3676 else if(::PtInRect(&arrRect[1], pt))
3678 #ifdef _CMDBAR_EXTRA_TRACE 3679 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - LButtonDown: restore button\n"));
3681 m_nBtnWasPressed = m_nBtnPressed = 1;
3683 else if(::PtInRect(&arrRect[2], pt))
3685 #ifdef _CMDBAR_EXTRA_TRACE 3686 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - LButtonDown: minimize button\n"));
3688 m_nBtnWasPressed = m_nBtnPressed = 2;
3696 if(m_nBtnPressed != -1)
3700 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect);
3701 pT->_DrawMDIButton(dc, arrRect, m_nBtnPressed);
3707 LRESULT OnMouseMove(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
3709 if(!m_bChildMaximized || ::GetCapture() != m_hWnd || m_nBtnWasPressed == -1)
3715 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
3716 ClientToScreen(&pt);
3718 GetWindowRect(&rect);
3721 RECT arrRect[3] = { 0 };
3722 T* pT =
static_cast<T*
>(
this);
3723 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL);
3724 int nOldBtnPressed = m_nBtnPressed;
3725 m_nBtnPressed = ::PtInRect(&arrRect[m_nBtnWasPressed], pt) ? m_nBtnWasPressed : -1;
3726 if(nOldBtnPressed != m_nBtnPressed)
3729 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect);
3730 pT->_DrawMDIButton(dc, arrRect, (m_nBtnPressed != -1) ? m_nBtnPressed : nOldBtnPressed);
3736 LRESULT OnLButtonUp(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
3738 if(!m_bChildMaximized || ::GetCapture() != m_hWnd || m_nBtnWasPressed == -1)
3744 ATLASSERT(_DebugCheckChild());
3746 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
3747 ClientToScreen(&pt);
3749 GetWindowRect(&rect);
3753 int nBtn = m_nBtnWasPressed;
3756 RECT arrRect[3] = { 0 };
3757 T* pT =
static_cast<T*
>(
this);
3758 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL);
3759 if(::PtInRect(&arrRect[nBtn], pt))
3764 #ifdef _CMDBAR_EXTRA_TRACE 3765 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - LButtonUp: close button\n"));
3767 ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_CLOSE, 0L);
3770 #ifdef _CMDBAR_EXTRA_TRACE 3771 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - LButtonUp: restore button\n"));
3773 ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_RESTORE, 0L);
3776 #ifdef _CMDBAR_EXTRA_TRACE 3777 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - LButtonUp: minimize button\n"));
3779 ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_MINIMIZE, 0L);
3789 LRESULT OnNcLButtonDblClk(UINT , WPARAM , LPARAM lParam, BOOL& bHandled)
3791 if(!m_bChildMaximized || m_nBtnWasPressed != -1)
3797 ATLASSERT(_DebugCheckChild());
3799 POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
3801 GetWindowRect(&rect);
3805 RECT rcIcon = { 0 };
3806 T* pT =
static_cast<T*
>(
this);
3807 pT->_CalcIconRect(rect.right - rect.left, rect.bottom - rect.top, rcIcon, m_bLayoutRTL);
3808 RECT arrRect[3] = { 0 };
3809 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL);
3811 if(::PtInRect(&rcIcon, pt))
3813 CMenuHandle menu = ::GetSystemMenu(m_hWndChildMaximized, FALSE);
3814 UINT uDefID = menu.GetMenuDefaultItem();
3815 if(uDefID == (UINT)-1)
3817 ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, uDefID, 0L);
3823 LRESULT OnCaptureChanged(UINT , WPARAM , LPARAM , BOOL& bHandled)
3825 if(m_bChildMaximized)
3827 if(m_nBtnPressed != -1)
3829 ATLASSERT(m_nBtnPressed == m_nBtnWasPressed);
3832 GetWindowRect(&rect);
3833 RECT arrRect[3] = { 0 };
3834 T* pT =
static_cast<T*
>(
this);
3835 pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect);
3837 pT->_DrawMDIButton(dc, arrRect, m_nBtnWasPressed);
3839 m_nBtnWasPressed = -1;
3849 LRESULT OnParentActivate(UINT , WPARAM wParam, LPARAM , BOOL& bHandled)
3851 m_bParentActive = (LOWORD(wParam) != WA_INACTIVE);
3852 RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW);
3858 LRESULT OnMDISetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& )
3860 m_wndMDIClient.DefWindowProc(uMsg, NULL, lParam);
3861 HMENU hOldMenu = GetMenu();
3862 BOOL bRet = AttachMenu((HMENU)wParam);
3866 #if (_WIN32_IE >= 0x0400) 3867 T* pT =
static_cast<T*
>(
this);
3868 pT->UpdateRebarBandIdealSize();
3869 #endif // (_WIN32_IE >= 0x0400) 3871 return (LRESULT)hOldMenu;
3875 LRESULT OnAllHookMessages(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
3877 T* pT =
static_cast<T*
>(
this);
3878 pT->_ProcessAllHookMessages(uMsg, wParam, lParam);
3886 void UpdateRebarBandIdealSize()
3890 int nCount = (int)::SendMessage(GetParent(), RB_GETBANDCOUNT, 0, 0L);
3891 for(
int i = 0; i < nCount; i++)
3893 REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE };
3894 ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi);
3895 if(rbi.hwndChild == m_hWnd)
3897 rbi.fMask = RBBIM_IDEALSIZE;
3898 rbi.cxIdeal = m_bChildMaximized ? m_cxLeft + m_cxRight : 0;
3899 int nBtnCount = GetButtonCount();
3903 GetItemRect(nBtnCount - 1, &rect);
3904 rbi.cxIdeal += rect.right;
3906 ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi);
3913 void _ProcessAllHookMessages(UINT uMsg, WPARAM , LPARAM )
3915 if(uMsg == WM_MDIGETACTIVE || uMsg == WM_MDISETMENU)
3918 BOOL bMaximized = FALSE;
3919 HWND hWndChild = (HWND)::SendMessage(m_wndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized);
3920 bool bMaxOld = m_bChildMaximized;
3921 m_bChildMaximized = (hWndChild != NULL && bMaximized);
3922 HICON hIconOld = m_hIconChildMaximized;
3924 if(m_bChildMaximized)
3926 if(m_hWndChildMaximized != hWndChild)
3928 ATL::CWindow wnd = m_hWndChildMaximized = hWndChild;
3929 m_hIconChildMaximized = wnd.GetIcon(FALSE);
3930 if(m_hIconChildMaximized == NULL)
3932 m_hIconChildMaximized = wnd.GetIcon(TRUE);
3933 if(m_hIconChildMaximized == NULL)
3938 m_hIconChildMaximized = (HICON)::GetClassLongPtr(wnd, GCLP_HICONSM);
3940 m_hIconChildMaximized = (HICON)LongToHandle(::GetClassLongPtr(wnd, GCLP_HICONSM));
3948 m_hWndChildMaximized = NULL;
3949 m_hIconChildMaximized = NULL;
3952 if(bMaxOld != m_bChildMaximized)
3954 #ifdef _CMDBAR_EXTRA_TRACE 3955 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - All messages hook change: m_bChildMaximized = %s\n"), m_bChildMaximized ?
"true" :
"false");
3959 int nCount = (int)::SendMessage(GetParent(), RB_GETBANDCOUNT, 0, 0L);
3960 int cxDiff = (m_bChildMaximized ? 1 : -1) * (m_cxLeft + m_cxRight);
3961 for(
int i = 0; i < nCount; i++)
3963 #if (_WIN32_IE >= 0x0500) 3964 REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_STYLE };
3965 ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi);
3966 if(rbi.hwndChild == m_hWnd)
3968 if((rbi.fStyle & RBBS_USECHEVRON) != 0)
3970 rbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE;
3971 rbi.cxMinChild += cxDiff;
3972 rbi.cxIdeal += cxDiff;
3973 ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi);
3977 #elif (_WIN32_IE >= 0x0400) 3978 REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE };
3979 ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi);
3980 if(rbi.hwndChild == m_hWnd)
3982 rbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE;
3983 rbi.cxMinChild += cxDiff;
3984 rbi.cxIdeal += cxDiff;
3985 ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi);
3988 #else // (_WIN32_IE < 0x0400) 3989 REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE };
3990 ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi);
3991 if(rbi.hwndChild == m_hWnd)
3993 rbi.fMask = RBBIM_CHILDSIZE;
3994 rbi.cxMinChild += cxDiff;
3995 ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi);
3998 #endif // (_WIN32_IE < 0x0400) 4002 if(bMaxOld != m_bChildMaximized || hIconOld != m_hIconChildMaximized)
4006 GetWindowRect(&rect);
4007 ::MapWindowPoints(NULL, GetParent(), (LPPOINT)&rect, 2);
4009 SetWindowPos(NULL, 0, 0, 1, 1, SWP_NOZORDER | SWP_NOMOVE);
4010 SetWindowPos(NULL, &rect, SWP_NOZORDER | SWP_NOMOVE);
4012 RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW);
4017 void GetSystemSettings()
4019 #ifdef _CMDBAR_EXTRA_TRACE 4020 ATLTRACE2(atlTraceUI, 0, _T(
"MDI CmdBar - GetSystemSettings\n"));
4022 _baseClass::GetSystemSettings();
4024 NONCLIENTMETRICS
info = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() };
4025 BOOL bRet = ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
sizeof(info), &info, 0);
4029 m_cxIconWidth = ::GetSystemMetrics(SM_CXSMICON);
4030 m_cyIconHeight = ::GetSystemMetrics(SM_CYSMICON);
4031 m_cxLeft = m_cxIconWidth;
4033 #ifndef _WTL_NO_AUTO_THEME 4034 if(m_hTheme != NULL)
4036 m_cxBtnWidth = info.iCaptionWidth - 2 * m_cxyOffset;
4037 m_cyBtnHeight = info.iCaptionHeight - 2 * m_cxyOffset;
4038 m_cxRight = 3 * m_cxBtnWidth;
4041 #endif // !_WTL_NO_AUTO_THEME 4043 m_cxBtnWidth = info.iCaptionWidth - m_cxyOffset;
4044 m_cyBtnHeight = info.iCaptionHeight - 2 * m_cxyOffset;
4045 m_cxRight = 3 * m_cxBtnWidth + m_cxyOffset;
4050 GetClientRect(&rect);
4051 T* pT =
static_cast<T*
>(
this);
4052 pT->_AdjustBtnSize(rect.bottom);
4055 void _AdjustBtnSize(
int cyHeight)
4057 if(cyHeight > 1 && m_cyBtnHeight > cyHeight)
4059 #ifndef _WTL_NO_AUTO_THEME 4060 if(m_hTheme != NULL)
4062 m_cyBtnHeight = cyHeight;
4063 m_cxBtnWidth = cyHeight;
4064 m_cxRight = 3 * m_cxBtnWidth;
4067 #endif // !_WTL_NO_AUTO_THEME 4069 m_cyBtnHeight = cyHeight;
4070 m_cxBtnWidth = cyHeight + m_cxyOffset;
4071 m_cxRight = 3 * m_cxBtnWidth + m_cxyOffset;
4076 void _CalcIconRect(
int cxWidth,
int cyHeight, RECT& rect,
bool bInvertX =
false)
const 4078 int xStart = (m_cxLeft - m_cxIconWidth) / 2;
4081 int yStart = (cyHeight - m_cyIconHeight) / 2;
4086 ::SetRect(&rect, cxWidth - (xStart + m_cxBtnWidth), yStart, cxWidth - xStart, yStart + m_cyBtnHeight);
4088 ::SetRect(&rect, xStart, yStart, xStart + m_cxBtnWidth, yStart + m_cyBtnHeight);
4091 void _CalcBtnRects(
int cxWidth,
int cyHeight, RECT arrRect[3],
bool bInvertX =
false)
const 4093 int yStart = (cyHeight - m_cyBtnHeight) / 2;
4097 RECT rcBtn = { cxWidth - m_cxBtnWidth, yStart, cxWidth, yStart + m_cyBtnHeight };
4098 int nDirection = -1;
4101 ::SetRect(&rcBtn, 0, yStart, m_cxBtnWidth, yStart + m_cyBtnHeight);
4106 #ifndef _WTL_NO_AUTO_THEME 4107 if(m_hTheme != NULL)
4108 ::OffsetRect(&rcBtn, nDirection * m_cxBtnWidth, 0);
4110 #endif // !_WTL_NO_AUTO_THEME 4111 ::OffsetRect(&rcBtn, nDirection * (m_cxBtnWidth + m_cxyOffset), 0);
4113 ::OffsetRect(&rcBtn, nDirection * m_cxBtnWidth, 0);
4117 void _DrawMDIButton(
CWindowDC& dc, LPRECT pRects,
int nBtn)
4119 #ifndef _WTL_NO_AUTO_THEME 4120 if(m_hTheme != NULL)
4122 #if !defined(TMSCHEMA_H) && !defined(__VSSYM32_H__) 4123 const int WP_MDICLOSEBUTTON = 20;
4124 const int CBS_NORMAL = 1;
4125 const int CBS_PUSHED = 3;
4126 const int CBS_DISABLED = 4;
4127 const int WP_MDIRESTOREBUTTON = 22;
4128 const int RBS_NORMAL = 1;
4129 const int RBS_PUSHED = 3;
4130 const int RBS_DISABLED = 4;
4131 const int WP_MDIMINBUTTON = 16;
4132 const int MINBS_NORMAL = 1;
4133 const int MINBS_PUSHED = 3;
4134 const int MINBS_DISABLED = 4;
4135 #endif // !defined(TMSCHEMA_H) && !defined(__VSSYM32_H__) 4136 if(nBtn == -1 || nBtn == 0)
4137 m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDICLOSEBUTTON, m_bParentActive ? ((m_nBtnPressed == 0) ? CBS_PUSHED : CBS_NORMAL) : CBS_DISABLED, &pRects[0], NULL);
4138 if(nBtn == -1 || nBtn == 1)
4139 m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDIRESTOREBUTTON, m_bParentActive ? ((m_nBtnPressed == 1) ? RBS_PUSHED : RBS_NORMAL) : RBS_DISABLED, &pRects[1], NULL);
4140 if(nBtn == -1 || nBtn == 2)
4141 m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDIMINBUTTON, m_bParentActive ? ((m_nBtnPressed == 2) ? MINBS_PUSHED : MINBS_NORMAL) : MINBS_DISABLED, &pRects[2], NULL);
4144 #endif // !_WTL_NO_AUTO_THEME 4146 if(nBtn == -1 || nBtn == 0)
4147 dc.DrawFrameControl(&pRects[0], DFC_CAPTION, DFCS_CAPTIONCLOSE | ((m_nBtnPressed == 0) ? DFCS_PUSHED : 0));
4148 if(nBtn == -1 || nBtn == 1)
4149 dc.DrawFrameControl(&pRects[1], DFC_CAPTION, DFCS_CAPTIONRESTORE | ((m_nBtnPressed == 1) ? DFCS_PUSHED : 0));
4150 if(nBtn == -1 || nBtn == 2)
4151 dc.DrawFrameControl(&pRects[2], DFC_CAPTION, DFCS_CAPTIONMIN | ((m_nBtnPressed == 2) ? DFCS_PUSHED : 0));
4155 #ifndef _WTL_NO_AUTO_THEME 4156 static UINT _GetThemeChangedMsg()
4158 #ifndef WM_THEMECHANGED 4159 static const UINT WM_THEMECHANGED = 0x031A;
4160 #endif // !WM_THEMECHANGED 4161 return WM_THEMECHANGED;
4164 void _OpenThemeData()
4166 ATLASSERT(m_hThemeDLL != NULL);
4168 PFN_OpenThemeData pfnOpenThemeData = (PFN_OpenThemeData)::GetProcAddress(m_hThemeDLL,
"OpenThemeData");
4169 ATLASSERT(pfnOpenThemeData != NULL);
4170 if(pfnOpenThemeData != NULL)
4171 m_hTheme = pfnOpenThemeData(m_hWnd, L
"Window");
4174 void _CloseThemeData()
4176 ATLASSERT(m_hThemeDLL != NULL);
4178 if(m_hTheme == NULL)
4181 PFN_CloseThemeData pfnCloseThemeData = (PFN_CloseThemeData)::GetProcAddress(m_hThemeDLL,
"CloseThemeData");
4182 ATLASSERT(pfnCloseThemeData != NULL);
4183 if(pfnCloseThemeData != NULL)
4185 pfnCloseThemeData(m_hTheme);
4189 #endif // !_WTL_NO_AUTO_THEME 4191 bool _DebugCheckChild()
4194 BOOL bMaximized = FALSE;
4195 HWND hWndChild = (HWND)::SendMessage(m_wndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized);
4196 return (bMaximized && hWndChild == m_hWndChildMaximized);
4206 DECLARE_WND_SUPERCLASS(_T(
"WTL_MDICommandBar"), GetWndClassName())
4211 #endif // __ATLCTRLW_H__
Definition: atlwinx.h:452
Definition: atlctrlw.h:3322
Definition: atlctrlw.h:3311
Definition: atlapp.h:1368
Definition: nestegg.c:186
Definition: atlgdi.h:3386
Definition: atlctrlw.h:94
Definition: atlapp.h:1399
Definition: atlctrlw.h:135
Definition: atlgdi.h:1209
Definition: atlgdi.h:3407
Definition: atlctrlw.h:132
Definition: atlctrlw.h:206
Definition: atlctrlw.h:4203
Definition: atlctrlw.h:200