ExtMenuControlBar.h
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:13k
源码类别:

界面编程

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2009 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // mailto:support@prof-uis.com
  7. //
  8. // This source code can be used, modified and redistributed
  9. // under the terms of the license agreement that is included
  10. // in the Professional User Interface Suite package.
  11. //
  12. // Warranties and Disclaimers:
  13. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  14. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  16. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  17. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  18. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  19. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  20. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  21. #if (!defined __EXT_MENUCONTROLBAR_H)
  22. #define __EXT_MENUCONTROLBAR_H
  23. #if (!defined __EXT_MFC_DEF_H)
  24. #include <ExtMfcDef.h>
  25. #endif // __EXT_MFC_DEF_H
  26. #if (!defined __EXT_TOOLCONTROLBAR_H)
  27. #include <ExtToolControlBar.h>
  28. #endif
  29. #if (!defined __EXT_HOOK_H)
  30. #include "../Src/ExtHook.h"
  31. #endif
  32. #if _MSC_VER >= 1000
  33. #pragma once
  34. #endif // _MSC_VER >= 1000
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CExtBarMdiDocButton
  37. class __PROF_UIS_API CExtBarMdiDocButton : public CExtBarButton
  38. {
  39. public:
  40. DECLARE_DYNCREATE(CExtBarMdiDocButton)
  41. protected:
  42. CExtCmdIcon m_iconCache;
  43. HWND m_hWndActiveMdiChild;
  44. HWND _ActiveMdiChildWndGet();
  45. static void _ExtractWndIcon(
  46. HWND hWnd,
  47. CExtCmdIcon & icon
  48. );
  49. public:
  50. HWND _ActiveMdiChildWndAttach(
  51. HWND hWndActiveMdiChildNew
  52. );
  53. HWND _ActiveMdiChildWndDetach();
  54. bool m_bHandleDblClickAsCloseCmd:1;
  55. CExtBarMdiDocButton(
  56. CExtToolControlBar * pBar = NULL,
  57. UINT nCmdID = ID_SEPARATOR,
  58. UINT nStyle = 0
  59. );
  60. virtual ~CExtBarMdiDocButton();
  61. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  62. virtual bool IsRibbonPaintingMode() const;
  63. virtual CSize RibbonILV_CalcSize(
  64. CDC & dc,
  65. INT nILV = -1 // -1 use current visual level
  66. ) const;
  67. #endif //  (!defined __EXT_MFC_NO_RIBBON_BAR)
  68. virtual CSize CalculateLayout(
  69. CDC & dc,
  70. CSize sizePreCalc,
  71. BOOL bHorz
  72. );
  73. virtual UINT GetStyle() const
  74. {
  75. return
  76. CExtBarButton::GetStyle()
  77. &
  78. (~TBBS_DISABLED)
  79. ;
  80. }
  81. virtual void SetStyle( UINT nStyle )
  82. {
  83. nStyle &= ~TBBS_DISABLED;
  84. CExtBarButton::SetStyle( nStyle );
  85. }
  86. virtual void ModifyStyle(
  87. UINT nAdd,
  88. UINT nRemove = 0
  89. )
  90. {
  91. nAdd &= ~TBBS_DISABLED;
  92. nRemove |= TBBS_DISABLED;
  93. CExtBarButton::ModifyStyle(
  94. nAdd,
  95. nRemove
  96. );
  97. }
  98. virtual CExtCmdIcon * GetIconPtr();
  99. virtual void OnUpdateCmdUI(
  100. CWnd * pTarget,
  101. BOOL bDisableIfNoHndler,
  102. int nIndex
  103. );
  104. virtual bool OnDblClick(
  105. CPoint point
  106. );
  107. virtual CWnd * GetCmdTargetWnd();
  108. virtual bool CanStartCommandDrag();
  109. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  110. virtual CExtCustomizeCmdTreeNode * GetCmdNode(
  111. bool bInitial = false
  112. );
  113. virtual void SetBasicCmdNode(
  114. CExtCustomizeCmdTreeNode * pNode
  115. );
  116. virtual void SetCustomizedCmdNode(
  117. CExtCustomizeCmdTreeNode * pNode
  118. );
  119. virtual CExtCustomizeCmdTreeNode * OnCustomizeNodeInit(
  120. CExtCustomizeSite * pSite,
  121. CExtCustomizeCmdTreeNode * pParentNode // toolbar node
  122. );
  123. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  124. virtual BOOL PutToPopupMenu(
  125. CExtPopupMenuWnd * pPopup
  126. );
  127. virtual UINT OnTrackPopup(
  128. CPoint point,
  129. bool bSelectAny,
  130. bool bForceNoAnimation
  131. );
  132. }; // class CExtBarMdiDocButton
  133. /////////////////////////////////////////////////////////////////////////////
  134. // CExtBarMdiRightButton
  135. #define __GAP_BETWEEN_WND_RIGHT_BUTTONS 2
  136. class CExtMenuControlBar;
  137. class __PROF_UIS_API CExtBarMdiRightButton : public CExtBarMdiDocButton
  138. {
  139. protected:
  140. struct __PROF_UIS_API MdiMenuBarRightButtonsInfo_t
  141. {
  142. CWnd * m_pWndMdiChildFrame;
  143. CExtMenuControlBar * m_pBar;
  144. int m_cxIcon,m_cyIcon;
  145. CSize m_calcSize;
  146. bool
  147. m_bInitialized:1,
  148. m_bBtnClose:1,
  149. m_bBtnMaximize:1,
  150. m_bBtnMinimize:1,
  151. m_bBtnHelp:1;
  152. CRect
  153. m_rcBtnClose,
  154. m_rcBtnMaximize,
  155. m_rcBtnRestore,
  156. m_rcBtnMinimize,
  157. m_rcBtnHelp;
  158. MdiMenuBarRightButtonsInfo_t();
  159. void EmptyLocations();
  160. void InitLocations(
  161. const CRect & rcBtn,
  162. BOOL bHorz
  163. );
  164. }; // struct MdiMenuBarRightButtonsInfo_t
  165. friend class CExtMenuControlBar;
  166. public:
  167. DECLARE_DYNCREATE(CExtBarMdiRightButton)
  168. public:
  169. CExtBarMdiRightButton(
  170. CExtToolControlBar * pBar = NULL,
  171. UINT nCmdID = ID_SEPARATOR,
  172. UINT nStyle = 0
  173. );
  174. virtual ~CExtBarMdiRightButton();
  175. virtual CExtCmdIcon * GetIconPtr();
  176. virtual CSize CalculateLayout(
  177. CDC & dc,
  178. CSize sizePreCalc,
  179. BOOL bHorz
  180. );
  181. virtual void PaintCompound(
  182. CDC & dc,
  183. bool bPaintParentChain,
  184. bool bPaintChildren,
  185. bool bPaintOneNearestChildrenLevelOnly
  186. );
  187. virtual BOOL PutToPopupMenu(
  188. CExtPopupMenuWnd * pPopup
  189. );
  190. virtual UINT OnTrackPopup(
  191. CPoint point,
  192. bool bSelectAny,
  193. bool bForceNoAnimation
  194. );
  195. virtual void OnClick(
  196. CPoint point,
  197. bool bDown
  198. );
  199. virtual __EXT_MFC_INT_PTR OnToolHitTest(
  200. CPoint point,
  201. TOOLINFO * pTI
  202. );
  203. virtual LRESULT OnHelpHitTest(
  204. CPoint point
  205. );
  206. virtual bool OnDblClick(
  207. CPoint point
  208. );
  209. virtual bool CanStartCommandDrag();
  210. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  211. virtual CExtCustomizeCmdTreeNode * GetCmdNode(
  212. bool bInitial = false
  213. );
  214. virtual void SetBasicCmdNode(
  215. CExtCustomizeCmdTreeNode * pNode
  216. );
  217. virtual void SetCustomizedCmdNode(
  218. CExtCustomizeCmdTreeNode * pNode
  219. );
  220. virtual CExtCustomizeCmdTreeNode * OnCustomizeNodeInit(
  221. CExtCustomizeSite * pSite,
  222. CExtCustomizeCmdTreeNode * pParentNode // toolbar node
  223. );
  224. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  225. virtual bool OnQueryFlatTrackingEnabled() const;
  226. }; // class CExtBarMdiRightButton
  227. /////////////////////////////////////////////////////////////////////////////
  228. // CExtMenuControlBar
  229. class __PROF_UIS_API CExtMenuControlBar
  230. : public CExtToolControlBar
  231. , public CExtHookSink
  232. {
  233. protected:
  234. friend class CExtBarMdiDocButton;
  235. friend class CExtBarMdiRightButton;
  236. friend struct CExtBarMdiRightButton::MdiMenuBarRightButtonsInfo_t;
  237. virtual void _GetMdiMenuBarRightButtonsInfo(
  238. CExtBarMdiRightButton::MdiMenuBarRightButtonsInfo_t & _info,
  239. CExtBarMdiRightButton * pTBB,
  240. BOOL bHorz
  241. );
  242. UINT m_nMdiDocButtonCmdID;
  243. HWND m_hWndHelper;
  244. CExtSafeString m_sMdiWindowPopupName;
  245. bool m_bFlatTracking:1, m_bSysMenuTracking:1;
  246. int m_nFlatTrackingIndex,m_nOldTrackingIndex;
  247. CMenu m_menuFrame, m_menuDoc;
  248. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  249. CExtCustomizeSite::CCmdMenuInfo * m_pMenuInfo;
  250. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  251. public:
  252. bool m_bAdaptiveCmdAllocMode:1;
  253. virtual int _FlatTrackingGet() const;
  254. virtual void _FlatTrackingSet( bool bFlatTracking );
  255. virtual int _FlatTrackingIndexGet() const;
  256. virtual void _FlatTrackingIndexSet( int nFlatTrackingIndex );
  257. virtual void _UpdateFlatTracking(
  258. BOOL bRepaint = TRUE
  259. );
  260. virtual void _CancelFlatTracking(
  261. BOOL bRepaint = TRUE
  262. );
  263. virtual void OnFlatTrackingStart(
  264. HDWP & hPassiveModeDWP
  265. );
  266. virtual void OnFlatTrackingStop();
  267. CRect _GetMainFrameSysIconRect();
  268. CRect _GetChildFrameSysIconRect();
  269. protected:
  270. virtual bool OnHookWndMsg(
  271. LRESULT & lResult,
  272. HWND hWndHooked,
  273. UINT nMessage,
  274. WPARAM & wParam,
  275. LPARAM & lParam
  276. );
  277. HWND _GetHwndPlacement();
  278. HWND _GetHwndMainFrame();
  279. HWND _GetHwndChildFrame();
  280. HWND _GetHwndMdiArea();
  281. bool m_bMdiApp:1;
  282. virtual bool _IsMdiApp() const;
  283. virtual BOOL _UpdateMenuBar(
  284. BOOL bDoRecalcLayout = TRUE
  285. );
  286. virtual CMenu * _GetMenu();
  287. virtual HWND _GetActiveMdiChildWnd(
  288. BOOL & bMaximized
  289. );
  290. virtual BOOL _InstallMdiDocButtons(
  291. BOOL bDoRecalcLayout = TRUE
  292. );
  293. virtual BOOL _SyncActiveMdiChild();
  294. virtual BOOL _TrackFrameSystemMenu(
  295. CWnd * pFrame,
  296. CPoint * pPoint = NULL, // NULL means calc menu track area automatically
  297. BOOL bSelectAny = FALSE,
  298. LPCRECT rcExcludeArea = NULL,
  299. UINT nTrackFlags = (UINT)(-1),
  300. BOOL bCombinedMode = FALSE
  301. );
  302. virtual bool _InitMdiChildHook( HWND hWndMdiClient );
  303. public:
  304.     DECLARE_DYNCREATE(CExtMenuControlBar);
  305. // Construction
  306. public:
  307.     CExtMenuControlBar();
  308. // Attributes
  309. public:
  310. // hide expand button on menu bar if possible ?
  311. static bool g_bHideMenuBarExpandContentButton;
  312. static const UINT g_nMsgPrepareSystemMenu;
  313. static bool g_bCancelNearestAltUp;
  314. static bool g_bKeyCodeTracking;
  315. static bool g_bTranslateContextHelpCmd;
  316. static ACCEL g_accelContextHelp;
  317. virtual const ACCEL * _GetTranslatedContextHelpAccel() const;
  318. // multiple rows in docked state
  319. bool m_bMultiRowLayout:1;
  320. protected:
  321. bool m_bMenuBarUsesDelayedButtonMenuTracking:1;
  322. bool m_bDelayedSyncActiveMdiChild:1;
  323. bool m_bDelayedUpdateMenuBar:1;
  324. virtual void _DelaySyncActiveMdiChild();
  325. virtual void _DelayUpdateMenuBar();
  326. public:
  327. bool m_bUseFastKeyboardMenuTracking:1,
  328. m_bAllowProfMainFrameSysmenu:1,
  329. m_bAllowProfChildFrameSysmenu:1,
  330. m_bHandleDblClickAsCloseCmd:1;
  331. // Operations
  332. public:
  333. CMenu * GetMenu(); // get current menu
  334. BOOL UpdateMenuBar( // update after menu changed
  335. BOOL bDoRecalcLayout = TRUE
  336. );
  337. virtual void SetMdiWindowPopupName(
  338. __EXT_MFC_SAFE_LPCTSTR sMdiWindowPopupName = NULL
  339. );
  340. // LoadMenuBar() required only for CFrameWnd
  341. // based windows principally without menu
  342. virtual BOOL LoadMenuBar(
  343. UINT nResourceID
  344. );
  345. protected:
  346. bool m_bHelperTrackingCharCode:1;
  347. public:
  348. virtual BOOL TranslateMainFrameMessage(MSG* pMsg);
  349. virtual BOOL TrackMainFrameSystemMenu(
  350. CPoint * pPoint = NULL, // NULL means calc menu track area automatically
  351. BOOL bSelectAny = FALSE
  352. );
  353. virtual BOOL TrackChildFrameSystemMenu(
  354. CPoint * pPoint = NULL, // NULL means calc any track area automatically
  355. BOOL bSelectAny = FALSE
  356. );
  357. // Overridables
  358. public:
  359. virtual void OnUpdateCmdUI(
  360. CFrameWnd * pTarget,
  361. BOOL bDisableIfNoHndler
  362. );
  363. virtual LRESULT DoHelpHitTest( CPoint ptHelpHitTest );
  364. virtual bool _GetFullRowMode() const;
  365. virtual bool OnQueryMultiRowLayout() const;
  366. virtual CExtBarContentExpandButton * OnCreateBarRightBtn();
  367. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  368. virtual CExtCustomizeSite::CCmdMenuInfo * MenuInfoGet();
  369. virtual CExtCustomizeSite::CCmdMenuInfo * MenuInfoDetach();
  370. virtual CExtCustomizeSite::CCmdMenuInfo * MenuInfoAttach(
  371. CExtCustomizeSite::CCmdMenuInfo * pMenuInfo
  372. );
  373. virtual void MenuInfoUpdate();
  374. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  375. protected:
  376. virtual void _Dragging_OnStart();
  377. virtual void _Dragging_OnStop(
  378. InternalDraggingState_t & _dsOld,
  379. InternalDraggingState_t & _dsNew,
  380. bool bCancel
  381. );
  382. virtual BOOL TrackButtonMenu(
  383. int nIndex,
  384. BOOL bSelectAny = FALSE,
  385. BOOL bDelayedTracking = FALSE,
  386. BOOL bNoAnimation = FALSE
  387. );
  388. public:
  389. virtual CSize _GetDefButtonSize() const;
  390. virtual bool OnQueryShiftRTL() const;
  391. virtual bool OnQueryRevertRTL() const;
  392. virtual void _RecalcPositionsImpl();
  393. virtual void _RecalcLayoutImpl();
  394. protected:
  395. virtual void _KillFrameMenu();
  396. // Overrides
  397. public:
  398.     // ClassWizard generated virtual function overrides
  399.     //{{AFX_VIRTUAL(CExtMenuControlBar)
  400. public:
  401. virtual BOOL PreTranslateMessage(MSG* pMsg);
  402. protected:
  403. virtual void PreSubclassWindow();
  404. //}}AFX_VIRTUAL
  405. // Implementation
  406. public:
  407.     virtual ~CExtMenuControlBar();
  408. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  409. virtual void OnCustomizeModeEnter();
  410. virtual void OnCustomizeModeLeave();
  411. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  412. BOOL IsMenuBarTracking()
  413. {
  414. if( m_bFlatTracking
  415. || m_bSysMenuTracking
  416. )
  417. return TRUE;
  418. return FALSE;
  419. }
  420. mutable bool m_bNonCommandButtonMode:1;
  421. virtual bool _IsNonCommandButtonMode() const;
  422. virtual bool IsDisplayMdiDocumentButtons() const;
  423. virtual bool _OnMouseMoveMsg(UINT nFlags, CPoint point);
  424. virtual bool _IsSimplifiedDropDownButtons() const;
  425. // Generated message map functions
  426. protected:
  427.     //{{AFX_MSG(CExtMenuControlBar)
  428. afx_msg void OnDestroy();
  429. afx_msg void OnTimer(__EXT_MFC_UINT_PTR nIDEvent);
  430. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  431. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  432. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  433. //}}AFX_MSG
  434. afx_msg LRESULT OnTrackButtonMenu(WPARAM wParam,LPARAM lParam);
  435.     DECLARE_MESSAGE_MAP()
  436. }; // class CExtMenuControlBar
  437. #endif // __EXT_MENUCONTROLBAR_H