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

界面编程

开发平台:

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_POPUP_MENU_WND_H)
  22. #define __EXT_POPUP_MENU_WND_H
  23. #if (!defined __EXT_MFC_DEF_H)
  24. #include <ExtMfcDef.h>
  25. #endif // __EXT_MFC_DEF_H
  26. #if (!defined __EXT_HOOK_H)
  27. #include <../Src/ExtHook.h>
  28. #endif // __EXT_HOOK_H
  29. #if (!defined __AFXTEMPL_H__)
  30. #include <AfxTempl.h>
  31. #endif
  32. #if (!defined __EXT_CMD_ICON_H)
  33. #include <ExtCmdIcon.h>
  34. #endif
  35. #if (!defined __ExtCmdManager_H)
  36. #include <ExtCmdManager.h>
  37. #endif
  38. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  39. #if (!defined __EXTCUSTOMIZE_H)
  40. #include <ExtCustomize.h>
  41. #endif
  42. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  43. #if _MSC_VER > 1000
  44. #pragma once
  45. #endif // _MSC_VER > 1000
  46. #define __BaseClassOfCExtPopupBaseWnd CWnd 
  47. #define __EXT_MENU_DEF_INPLACE_EDIT_WIDTH 100
  48. class CExtBarButton;
  49. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  50. class CExtPopupScreenTipWnd;
  51. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CExtShadowCtrl
  54. class __PROF_UIS_API CExtShadowCtrl
  55. : public CWnd
  56. //, public CExtHookSink
  57. {
  58. public:
  59. DECLARE_DYNCREATE( CExtShadowCtrl );
  60. mutable CExtBitmap m_bmpLayerSource;
  61. CBitmap m_bmpLayerData;
  62. mutable CRect m_rcOuterPadding, m_rcRenderingPaddingData;
  63. CExtShadowCtrl();
  64. virtual ~CExtShadowCtrl();
  65. virtual bool IsAvailable() const;
  66. virtual bool Create(
  67. HWND hWndParent,
  68. INT nShadowSize
  69. );
  70. bool UpdateWindowLayer(
  71. BYTE nConstantAlpha
  72. );
  73. virtual bool UpdateWindowLayer(
  74. CBitmap & _bmpLayer,
  75. BYTE nConstantAlpha
  76. );
  77. protected:
  78. HWND m_hWndParent;
  79. virtual LRESULT WindowProc(
  80. UINT message,
  81. WPARAM wParam,
  82. LPARAM lParam
  83. );
  84. // virtual bool OnHookWndMsg(
  85. // LRESULT & lResult,
  86. // HWND hWndHooked,
  87. // UINT nMessage,
  88. // WPARAM & wParam,
  89. // LPARAM & lParam
  90. // );
  91. }; // class CExtShadowCtrl
  92. /////////////////////////////////////////////////////////////////////////////
  93. // CExtSoundPlayer
  94. class __PROF_UIS_API CExtSoundPlayer : public CObject
  95. {
  96. struct __PROF_UIS_API InternalSoundEventInitDone_t : public CEvent
  97. {
  98. InternalSoundEventInitDone_t();
  99. void SetInitDone();
  100. void WaitInitDone();
  101. }; // struct InternalSoundEventInitDone_t
  102. struct __PROF_UIS_API InternalSoundThredadParms_t
  103. {
  104. InternalSoundEventInitDone_t * m_pEventInitDone;
  105. TCHAR m_sSoundSpecBuffer[1024];
  106. HANDLE m_hModule;
  107. DWORD m_dwPlayerFlags;
  108. HANDLE m_hThread;
  109. DWORD m_dwThreadID;
  110. static CEvent g_EventPlaySnd;
  111. static CCriticalSection g_CsPlaySnd;
  112. InternalSoundThredadParms_t(
  113. __EXT_MFC_SAFE_LPCTSTR sSoundSpecBuffer,
  114. HANDLE hModule,
  115. DWORD dwPlayerFlags
  116. );
  117. static DWORD WINAPI stat_ParallelPlayerProc(
  118. InternalSoundThredadParms_t * pParms
  119. );
  120. operator LPTHREAD_START_ROUTINE() const
  121. {
  122. return (LPTHREAD_START_ROUTINE)stat_ParallelPlayerProc;
  123. }
  124. void PlaySound();
  125. void PlaySoundParallel();
  126. }; // struct InternalSoundThredadParms_t
  127. public:
  128. DECLARE_DYNCREATE( CExtSoundPlayer );
  129. class __PROF_UIS_API CExtSoundPlayerAutoPtr
  130. {
  131. CExtSoundPlayer * m_pPlayer;
  132. public:
  133. CExtSoundPlayerAutoPtr();
  134. virtual ~CExtSoundPlayerAutoPtr();
  135. void InstallSoundPlayer(
  136. CExtSoundPlayer * pPlayer
  137. );
  138. CExtSoundPlayer * operator -> ()
  139. {
  140. ASSERT( m_pPlayer != NULL );
  141. ASSERT_VALID( m_pPlayer );
  142. return m_pPlayer;
  143. }
  144. }; // class CExtSoundPlayerAutoPtr
  145. CExtSoundPlayer();
  146. virtual ~CExtSoundPlayer();
  147. enum e_ui_sounds_t
  148. {
  149. __NO_SOUND = 0,
  150. __ON_MENU_EXPAND_CLICKED = 1,
  151. __ON_MENU_POPUP_DISPLAYED = 2,
  152. __ON_MENU_CMD_CLICKED = 3,
  153. }; // enum e_ui_sounds_t
  154. virtual void PlaySound(
  155. CExtSoundPlayer::e_ui_sounds_t eSoundID
  156. );
  157. }; // class CExtSoundPlayer
  158. extern __PROF_UIS_API CExtSoundPlayer::CExtSoundPlayerAutoPtr g_SoundPlayer;
  159. /////////////////////////////////////////////////////////////////////////////
  160. // CExtWndShadow
  161. class __PROF_UIS_API CExtWndShadow
  162. {
  163. CBitmap m_bmp0mak, m_bmp1mak; // photo of right & bottom shadow parts to save/restore
  164. CBitmap m_bmp0org, m_bmp1org; // original shadow source
  165. COLORREF * m_pHelperDibSurface;
  166. CRect m_rcWndArea; // window are not including shadow
  167. CRect m_rc1stArea; // basic area
  168. CRect m_rc2ndArea; // combined area
  169. UINT m_nShadowSize; // shadow size (in pixels)
  170. UINT m_nBr0, m_nBr1; // min/max brightness percents [0..100]
  171. bool m_bEnablePhotos:1; // use photo bitmaps
  172. bool m_bEnablePaintManagerColor:1; // use paint manager's shadow color
  173. CRgn m_rgnSafe;
  174. void _FreeWinObjects();
  175. void _DoPixelOvershadow(
  176. int nMakeSpec,
  177. int nPosX,
  178. int nPosY,
  179. COLORREF clrShadowAdjust
  180. );
  181. bool _MakePhotos( CDC & dc, CDC & dcmm );
  182. bool _MakeOriginals( CDC & dc );
  183. bool _PaintLo(
  184. CExtPaintManager * pPM,
  185. CDC & dc,
  186. HWND hWndStatic,
  187. HWND hWndFloat,
  188. LPCRECT pRectCustomFloatPos = NULL
  189. );
  190. bool _PaintHi(
  191. CExtPaintManager * pPM,
  192. CDC & dc,
  193. HWND hWndStatic,
  194. HWND hWndFloat,
  195. LPCRECT pRectCustomFloatPos = NULL
  196. );
  197. void _Assign( const CExtWndShadow & other );
  198. bool _RestoreOriginals( CDC & dc );
  199. bool _HaveOriginals() const;
  200. public:
  201. enum eShadowOptions
  202. {
  203. DEF_BRIGHTNESS_MIN =  75UL, // default min brightness percent
  204. DEF_BRIGHTNESS_MAX = 100UL, // default max brightness percent
  205. DEF_SHADOW_SIZE    =   3UL, // default shadow size (in pixels)
  206. };
  207. CExtWndShadow();
  208. CExtWndShadow( const CExtWndShadow & other );
  209. virtual ~CExtWndShadow();
  210. CExtWndShadow & operator = ( const CExtWndShadow & other );
  211. void ApplyFloatingImage(
  212. HWND hWndStatic,
  213. HWND hWndFloat,
  214. LPCRECT pRectCustomFloatPos = NULL
  215. );
  216. bool Restore( CDC & dc );
  217. bool Paint(
  218. CExtPaintManager * pPM,
  219. CDC & dc,
  220. bool m_bMakePhotosOnly = false,
  221. HWND hWndStatic = NULL,
  222. HWND hWndFloat = NULL,
  223. LPCRECT pRectCustomFloatPos = NULL
  224. );
  225. bool Paint(
  226. CExtPaintManager * pPM,
  227. CDC & dc,
  228. const CRect & rcWndArea,
  229. const CRect & rc1stArea = CRect(0,0,0,0),
  230. const CRect & rc2ndArea = CRect(0,0,0,0),
  231. UINT nShadowSize = DEF_SHADOW_SIZE,
  232. UINT nBr0 = DEF_BRIGHTNESS_MIN,
  233. UINT nBr1 = DEF_BRIGHTNESS_MAX,
  234. bool bEnablePhotos = true,
  235. bool bEnablePaintManagerColor = true,
  236. bool m_bMakePhotosOnly = false,
  237. HWND hWndStatic = NULL,
  238. HWND hWndFloat = NULL,
  239. LPCRECT pRectCustomFloatPos = NULL
  240. );
  241. bool HavePhotos() const;
  242. void Destroy();
  243. void PostReShadow();
  244. }; // class CExtWndShadow
  245. /////////////////////////////////////////////////////////////////////////////
  246. // CExtPopupBaseWnd
  247. class __PROF_UIS_API CExtPopupBaseWnd
  248. : public __BaseClassOfCExtPopupBaseWnd
  249. , public CExtPmBridge
  250. {
  251. public:
  252. DECLARE_DYNCREATE( CExtPopupBaseWnd );
  253. DECLARE_CExtPmBridge_MEMBERS( CExtPopupBaseWnd );
  254. CExtPopupBaseWnd();
  255. virtual bool _IsFadeOutAnimation() const;
  256. virtual BOOL DestroyWindow();
  257. virtual bool OnQueryLayoutRTL() const;
  258. // Overrides
  259. // ClassWizard generated virtual function overrides
  260. //{{AFX_VIRTUAL(CExtPopupBaseWnd)
  261. protected:
  262. virtual void PostNcDestroy();
  263. //}}AFX_VIRTUAL
  264. // Implementation
  265. public:
  266. virtual ~CExtPopupBaseWnd();
  267. static CObject * g_pCombinedHelper;
  268. static const UINT g_nMsgPrepareMenu; // prepare popup-menu window message (entire tree)
  269. static const UINT g_nMsgPrepareOneMenuLevel; // prepare popup-menu window message (one tree level)
  270. static const UINT g_nMsgPrepareDesktopBk;
  271. static const UINT g_nMsgPopupNext;
  272. static const UINT g_nMsgPopupPrev;
  273. static const UINT g_nMsgNotifyMenuExpanded;
  274. static const UINT g_nMsgNotifyMenuClosed;
  275. static const UINT g_nMsgPopupDrawItem;
  276. static const UINT g_nMsgPopupDrawLeftArea;
  277. static const UINT g_nMsgPopupDrawBackground;
  278. static const UINT g_nMsgCreateInplaceEdit;
  279. static const UINT g_nMsgTranslateKeyboardEvent;
  280. static const UINT g_nMsgTranslateMouseClickEvent;
  281. static const UINT g_nMsgTranslateMouseMoveEvent;
  282. static const UINT g_nMsgTranslateMouseWheelEvent;
  283. struct __PROF_UIS_API TranslateKeyboardEventData_t
  284. {
  285. CExtPopupBaseWnd * m_pEventSourcePopup;
  286. bool m_bMessageHandled:1, m_bNoEat:1;
  287. UINT m_nChar, m_nRepCnt, m_nFlags;
  288. TranslateKeyboardEventData_t(
  289. CExtPopupBaseWnd * pEventSourcePopup,
  290. UINT nChar,
  291. UINT nRepCnt,
  292. UINT nFlags,
  293. bool bNoEat
  294. );
  295. operator WPARAM ();
  296. static TranslateKeyboardEventData_t & FromWPARAM( WPARAM wParam );
  297. bool Notify( HWND hWnd );
  298. bool Notify();
  299. };
  300. struct __PROF_UIS_API TranslateMouseClickEventData_t
  301. {
  302. CExtPopupBaseWnd * m_pEventSourcePopup;
  303. bool m_bMessageHandled:1, m_bNoEat:1;
  304. UINT m_nFlags;
  305. CPoint m_point;
  306. TranslateMouseClickEventData_t(
  307. CExtPopupBaseWnd * pEventSourcePopup,
  308. UINT nFlags,
  309. CPoint point,
  310. bool bNoEat
  311. );
  312. operator WPARAM ();
  313. static TranslateMouseClickEventData_t & FromWPARAM( WPARAM wParam );
  314. bool Notify( HWND hWnd );
  315. bool Notify();
  316. };
  317. struct __PROF_UIS_API TranslateMouseMoveEventData_t
  318. {
  319. CExtPopupBaseWnd * m_pEventSourcePopup;
  320. bool m_bMessageHandled:1, m_bNoEat:1;
  321. UINT m_nFlags;
  322. CPoint m_point;
  323. TranslateMouseMoveEventData_t(
  324. CExtPopupBaseWnd * pEventSourcePopup,
  325. UINT nFlags,
  326. CPoint point,
  327. bool bNoEat
  328. );
  329. operator WPARAM ();
  330. static TranslateMouseMoveEventData_t & FromWPARAM( WPARAM wParam );
  331. bool Notify( HWND hWnd );
  332. bool Notify();
  333. };
  334. struct __PROF_UIS_API TranslateMouseWheelEventData_t
  335. {
  336. CExtPopupBaseWnd * m_pEventSourcePopup;
  337. bool m_bMessageHandled:1, m_bNoEat:1;
  338. WPARAM m_wParam;
  339. LPARAM m_lParam;
  340. TranslateMouseWheelEventData_t(
  341. CExtPopupBaseWnd * pEventSourcePopup,
  342. WPARAM wParam,
  343. LPARAM lParam,
  344. bool bNoEat
  345. );
  346. operator WPARAM ();
  347. static TranslateMouseWheelEventData_t & FromWPARAM( WPARAM wParam );
  348. bool Notify( HWND hWnd );
  349. bool Notify();
  350. };
  351. enum e_combine_align_t // relatively to menu window rect
  352. {
  353. __CMBA_NONE = 0,
  354. __CMBA_TOP = 1,
  355. __CMBA_BOTTOM = 2,
  356. __CMBA_RIGHT = 3,
  357. __CMBA_LEFT = 4,
  358. };
  359. typedef
  360. void (*pCbPaintCombinedContent)(
  361. LPVOID pCookie,
  362. CDC & dc,
  363. const CWnd & refWndMenu,
  364. const CRect & rcExcludeArea, // in screen coords
  365. int eCombineAlign // CExtPopupMenuWnd::e_combine_align_t values
  366. );
  367. enum e_animation_type_t
  368. {
  369. __AT_NONE = 0,
  370. __AT_RANDOM = 1,
  371. __AT_ROLL = 2,
  372. __AT_SLIDE = 3,
  373. __AT_FADE = 4,
  374. __AT_ROLL_AND_STRETCH = 5,
  375. __AT_SLIDE_AND_STRETCH = 6,
  376. __AT_NOISE = 7,
  377. __AT_BOXES = 8,
  378. __AT_CIRCLES = 9,
  379. __AT_HOLES = 10,
  380. __AT_MAX_VALID_VALUE = 10, // used for random effect selection
  381. __AT_CONTENT_DISPLAY = -1, // internal helper - delayed display
  382. __AT_CONTENT_EXPAND = -2 // internal helper - funny expand/stretch rarely used items (office XP like)
  383. };
  384. static e_animation_type_t g_DefAnimationType;
  385. static CExtSafeString GetAnimaptionName( e_animation_type_t eAT );
  386. static bool g_bUseDesktopWorkArea; // align to desktop work area (false - to screen area)
  387. static bool g_bEnableOnIdleCalls; // enable idle time processing
  388. protected:
  389. CRect m_rcExcludeArea;
  390. CPoint m_ptTrack, m_ptTrackOriginal, m_ptTrackInvoked, m_ptTrackWatched;
  391. bool m_bExcludeAreaSpec:1,m_bCombineWithEA:1;
  392. LPVOID m_pCbPaintCombinedCookie;
  393. pCbPaintCombinedContent m_pCbPaintCombinedContent;
  394. bool m_bCookieIsObject;
  395. public:
  396. bool _IsExcludeAreaSpecified() const
  397. {
  398. ASSERT_VALID( this );
  399. return m_bExcludeAreaSpec;
  400. }
  401. bool _IsCombineWithEA() const
  402. {
  403. ASSERT_VALID( this );
  404. return m_bCombineWithEA;
  405. }
  406. CRect GetExcludeArea() const
  407. {
  408. // ASSERT_VALID( this );
  409. return m_rcExcludeArea;
  410. }
  411. virtual CObject * GetCookieAsObject();
  412. virtual bool IsToolBtnCombinedArea() const;
  413. pCbPaintCombinedContent GetCbPaintCombinedContent() const
  414. {
  415. return (pCbPaintCombinedContent) m_pCbPaintCombinedContent;
  416. }
  417. LPVOID GetCbPaintCombinedCookie() const
  418. {
  419. return (LPVOID)m_pCbPaintCombinedCookie;
  420. }
  421. protected:
  422. e_animation_type_t m_AnimationType;
  423. CExtSoundPlayer::e_ui_sounds_t m_ePlaySoundOnAnimationFinished;
  424. COLORREF * m_clrFadeBitsSrc;
  425. COLORREF * m_clrFadeBitsDst;
  426. COLORREF * m_clrFadeBitsTmp;
  427. int m_nAnimPercent,m_nAnimPercentOld;
  428. bool m_bAnimFinished:1;
  429. CSize m_sizeFullItems;
  430. public:
  431. e_combine_align_t m_eCombineAlign;
  432. CExtWndShadow m_ShadowMain, m_ShadowCMBA;
  433. CExtShadowCtrl m_ctrlShadow;
  434. protected:
  435. CBitmap
  436. m_bmpScreenSrc, m_bmpScreenSrcAlt,
  437. m_bmpScreenDst, m_bmpScreenTmp;
  438. //m_bmpSaveBits;
  439. public:
  440. virtual bool _FindCustomizeMode() const;
  441. protected:
  442. virtual void _InitAnimation();
  443. virtual void _StartAnimation();
  444. virtual void _AdjustAnimation( e_animation_type_t & eAT );
  445. void _SurfacesDelete()
  446. {
  447. ASSERT_VALID( this );
  448. if( m_bmpScreenDst.GetSafeHandle() != NULL )
  449. {
  450. VERIFY(
  451. m_bmpScreenDst.DeleteObject()
  452. );
  453. }
  454. if( m_bmpScreenSrc.GetSafeHandle() != NULL )
  455. {
  456. VERIFY(
  457. m_bmpScreenSrc.DeleteObject()
  458. );
  459. }
  460. if( m_bmpScreenSrcAlt.GetSafeHandle() != NULL )
  461. {
  462. VERIFY(
  463. m_bmpScreenSrcAlt.DeleteObject()
  464. );
  465. }
  466. if( m_bmpScreenTmp.GetSafeHandle() != NULL )
  467. {
  468. VERIFY(
  469. m_bmpScreenTmp.DeleteObject()
  470. );
  471. }
  472. m_clrFadeBitsSrc
  473. = m_clrFadeBitsDst
  474. = m_clrFadeBitsTmp
  475. = NULL;
  476. }
  477. virtual void _EndAnimation();
  478. virtual bool _IsPopupWithShadows() const;
  479. virtual bool _IsPopupWithShadowsDynamic() const;
  480. virtual void _DrawAnimatedState( CDC & dc );
  481. public:
  482. virtual int OnQueryMenuShadowSize() const;
  483. virtual void _DoPaint( CDC & dcPaint, bool bUseBackBuffer = true );
  484. virtual void _DelayPaint();
  485. virtual void _GetClientRect(RECT * pRectClient)
  486. {
  487. ASSERT_VALID( this );
  488. ASSERT( GetSafeHwnd() != NULL );
  489. ASSERT( pRectClient != NULL );
  490. GetClientRect(pRectClient);
  491. }
  492. virtual bool _FindHelpMode() const;
  493. protected:
  494. HFONT m_hFont;
  495. protected:
  496. // Generated message map functions
  497. //{{AFX_MSG(CExtPopupBaseWnd)
  498. afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message);
  499. afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  500. afx_msg void OnPaint();
  501. afx_msg void OnNcPaint();
  502. afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp);
  503. afx_msg void OnSize(UINT nType, int cx, int cy);
  504. afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
  505. afx_msg void OnTimer(__EXT_MFC_UINT_PTR nIDEvent);
  506. afx_msg LRESULT OnSetFont( WPARAM wParam, LPARAM lParam );
  507. afx_msg LRESULT OnGetFont( WPARAM, LPARAM );
  508. //}}AFX_MSG
  509. DECLARE_MESSAGE_MAP()
  510. bool m_bPrintState:1;
  511. virtual LRESULT WindowProc(
  512. UINT message,
  513. WPARAM wParam,
  514. LPARAM lParam
  515. );
  516. }; // class CExtPopupBaseWnd
  517. /////////////////////////////////////////////////////////////////////////////
  518. // CExtPopupMenuTipWnd
  519. class __PROF_UIS_API CExtPopupMenuTipWnd
  520. : public CExtPopupBaseWnd
  521. {
  522. public:
  523. static bool g_bEnableAdvTips;
  524. enum e_tip_style_t
  525. {
  526. __ETS_NONE = 0,
  527. __ETS_BALLOON = 1,
  528. __ETS_BALLOON_NO_ICON = 2,
  529. __ETS_RECTANGLE = 3,
  530. __ETS_RECTANGLE_NO_ICON = 4,
  531. __ETS_INV_RECTANGLE = 5,
  532. __ETS_INV_RECTANGLE_NO_ICON = 6,
  533. };
  534. CRect m_rcAlignment;
  535. UINT m_nPeriodDelayShowQuick, m_nPeriodDelayShowNormal;
  536. bool m_bNoHideDetection:1;
  537. CFont m_fontAdvTip;
  538. protected:
  539. CExtCmdIcon m_icon;
  540. CSize m_sizeRenderingIcon, m_sizeClassicMargins,
  541. m_sizeRounders, m_sizeLeader;
  542. int m_nIconMarginDX, m_nBalloonDistance, m_nClassicDistance, m_nSizeShadow;
  543. CExtSafeString m_sText;
  544. bool m_bFlipHorz:1, m_bFlipVert:1;
  545. e_tip_style_t m_eTS;
  546. CExtWndShadow m_shadow;
  547. long m_ttLA;
  548. bool m_bPassiveMode:1, m_bDelayedLayeredBehavior:1;
  549. CPoint m_ptGuideLines;
  550. BYTE m_nTransparencyKey;
  551. mutable HWND m_hWndLastParent;
  552. public:
  553. DECLARE_DYNCREATE( CExtPopupMenuTipWnd );
  554. CExtPopupMenuTipWnd();
  555. // ClassWizard generated virtual function overrides
  556. //{{AFX_VIRTUAL(CExtPopupMenuTipWnd)
  557. //}}AFX_VIRTUAL
  558. public:
  559. virtual ~CExtPopupMenuTipWnd();
  560. void SetIcon(
  561. HICON hIcon,
  562. bool bCloneIcon = false
  563. );
  564. void SetIcon(
  565. CExtCmdIcon & _icon
  566. );
  567. virtual __EXT_MFC_SAFE_LPCTSTR GetText() const;
  568. virtual void SetText(
  569. __EXT_MFC_SAFE_LPCTSTR lpszText
  570. );
  571. virtual e_tip_style_t GetTipStyle() const;
  572. virtual void SetTipStyle( e_tip_style_t eTS );
  573. virtual int GetShadowSize() const;
  574. virtual void SetShadowSize( int nSizeShadow );
  575. static CTypedPtrList < CPtrList, CExtPopupMenuTipWnd * > g_listAllTips;
  576. static void UpdateDelayedLayeredBehaviorAll(
  577. CRuntimeClass * pRTC = NULL
  578. );
  579. void UpdateDelayedLayeredBehavior();
  580. HWND GetLastParentHWND() const
  581. {
  582. return m_hWndLastParent;
  583. }
  584. virtual bool Show(
  585. CWnd * pWndParent,
  586. const RECT & rcExcludeArea,
  587. bool bNoDelay,
  588. HDWP & hPassiveModeDWP
  589. );
  590. bool Show(
  591. CWnd * pWndParent,
  592. const RECT & rcExcludeArea,
  593. bool bNoDelay = false
  594. )
  595. {
  596. HDWP hPassiveModeDWP = NULL;
  597. return Show( pWndParent, rcExcludeArea, bNoDelay, hPassiveModeDWP );
  598. }
  599. virtual void Hide();
  600. protected:
  601. virtual int CalcShadowSize() const;
  602. virtual HRGN CalcRegion(
  603. CDC & dc,
  604. CSize * pSize = NULL
  605. );
  606. public:
  607. virtual void _DoPaint(
  608. CDC & dcPaint,
  609. bool bUseBackBuffer = true
  610. );
  611. protected:
  612. virtual void _EndAnimation();
  613. // Generated message map functions
  614. //{{AFX_MSG(CExtPopupMenuTipWnd)
  615. afx_msg void OnTimer(__EXT_MFC_UINT_PTR nIDEvent);
  616. //}}AFX_MSG
  617. #if _MFC_VER < 0x700
  618. afx_msg void OnActivateApp(BOOL bActive, HTASK hTask);
  619. #else
  620. afx_msg void OnActivateApp(BOOL bActive, DWORD hTask);
  621. #endif
  622. DECLARE_MESSAGE_MAP()
  623. }; // class CExtPopupMenuTipWnd
  624. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  625. /////////////////////////////////////////////////////////////////////////////
  626. // CExtPopupKeyTipWnd
  627. class __PROF_UIS_API CExtPopupKeyTipWnd : public CExtPopupMenuTipWnd
  628. {
  629. // Construction
  630. public:
  631. DECLARE_DYNCREATE( CExtPopupKeyTipWnd );
  632. CExtPopupKeyTipWnd();
  633. virtual ~CExtPopupKeyTipWnd();
  634. // Attributes
  635. public:
  636. // Operations
  637. public:
  638. virtual bool Create(
  639. CWnd * pWndKeyTipParent,
  640. CPoint ptGuideLines,
  641. __EXT_MFC_SAFE_LPCTSTR strKeyTipText,
  642. bool bEnabled,
  643. HDWP & hPassiveModeDWP
  644. );
  645. // Overrides
  646. // ClassWizard generated virtual function overrides
  647.     //{{AFX_VIRTUAL(CExtPopupKeyTipWnd)
  648. //}}AFX_VIRTUAL
  649. // Implementation
  650. public:
  651. protected:
  652.     //{{AFX_MSG(CExtPopupKeyTipWnd)
  653. //}}AFX_MSG
  654. DECLARE_MESSAGE_MAP()
  655. }; // class CExtPopupKeyTipWnd
  656. /////////////////////////////////////////////////////////////////////////////
  657. // CExtPopupScreenTipWnd
  658. class __PROF_UIS_API CExtPopupScreenTipWnd : public CExtPopupMenuTipWnd
  659. {
  660. // Construction
  661. public:
  662. DECLARE_DYNCREATE( CExtPopupScreenTipWnd );
  663. CExtPopupScreenTipWnd();
  664. virtual ~CExtPopupScreenTipWnd();
  665. // Attributes
  666. public:
  667. CExtCustomizeCmdScreenTip m_cmdScreenTip;
  668. // Operations
  669. public:
  670. // Overrides
  671. // ClassWizard generated virtual function overrides
  672.     //{{AFX_VIRTUAL(CExtPopupScreenTipWnd)
  673. //}}AFX_VIRTUAL
  674. // Implementation
  675. protected:
  676. HRGN CalcRegion(
  677. CDC & dc,
  678. CSize * pSize = NULL
  679. );
  680. public:
  681. virtual void _DoPaint(
  682. CDC & dcPaint,
  683. bool bUseBackBuffer = true
  684. );
  685. protected:
  686.     //{{AFX_MSG(CExtPopupScreenTipWnd)
  687. //}}AFX_MSG
  688. DECLARE_MESSAGE_MAP()
  689. }; // class CExtPopupScreenTipWnd
  690. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  691. /////////////////////////////////////////////////////////////////////////////
  692. // CExtPopupMenuSite
  693. class CExtPopupMenuWnd;
  694. class CExtPopupColorMenuWnd;
  695. class CExtPopupInplaceListBox;
  696. class CExtDatePickerWnd;
  697. class __PROF_UIS_API CExtPopupMenuSite
  698. {
  699. bool m_bShutdownMode:1;
  700. CExtPopupMenuTipWnd * m_pWndToolTip;
  701. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  702. CExtPopupScreenTipWnd * m_pWndScreenTip;
  703. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  704. CExtPopupMenuWnd
  705. * m_pTopMenu,
  706. * m_pWndCapture,
  707. * m_pWndAnimation;
  708. HHOOK m_hMouseHook;
  709. HHOOK m_hKeyboardHook;
  710. UINT * m_lpnResultCmdID;
  711. void _Done();
  712. // hooks
  713. static LRESULT CALLBACK _HookMouseProc(
  714. int nCode,      // hook code
  715. WPARAM wParam,  // message identifier
  716. LPARAM lParam   // mouse coordinates
  717. );
  718. static LRESULT CALLBACK _HookKeyboardProc(
  719. int nCode,      // hook code
  720. WPARAM wParam,  // virtual-key code
  721. LPARAM lParam   // keystroke-message information
  722. );
  723. void _Hook( bool bHook = true );
  724. CMap < CExtPopupMenuWnd *, CExtPopupMenuWnd *, bool, bool > m_mapFadeOutInsances;
  725. public:
  726. CExtPopupMenuSite();
  727. virtual ~CExtPopupMenuSite();
  728. bool IsEmpty() const;
  729. bool IsShutdownMode() const;
  730. CExtPopupMenuTipWnd & GetTip();
  731. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  732. CExtPopupScreenTipWnd & GetScreenTip();
  733. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  734. void SetTargetCmdIdPtr( UINT * lpnResultCmdID = NULL );
  735. UINT * GetTargetCmdIdPtr();
  736. CExtPopupMenuWnd * GetCapture();
  737. void SetCapture( CExtPopupMenuWnd * pNewPopup = NULL );
  738. CExtPopupMenuWnd * GetAnimated();
  739. void SetAnimated( CExtPopupMenuWnd * pNewPopup = NULL );
  740. void SetInstance( CExtPopupMenuWnd * pTopMenu = NULL );
  741. CExtPopupMenuWnd * GetInstance();
  742. void DoneInstance();
  743. void FadeOutInstanceAdd( CExtPopupMenuWnd * pPopup );
  744. void FadeOutInstanceRemove( CExtPopupMenuWnd * pPopup );
  745. void operator = ( CExtPopupMenuWnd * pTopMenu );
  746. CExtPopupMenuWnd * operator -> ();
  747. bool IsTopPopup(
  748. CExtPopupMenuWnd * pTopMenu
  749. ) const;
  750. static CExtPopupMenuSite g_DefPopupMenuSite;
  751. friend class CExtPopupBaseWnd;
  752. friend class CExtPopupMenuWnd;
  753. }; // class CExtPopupMenuSite
  754. /////////////////////////////////////////////////////////////////////////////
  755. // CExtPopupMenuWnd
  756. // track flags (menu area align)
  757. #define TPMX_LEFTALIGN 0x00000001L
  758. #define TPMX_CENTERALIGN 0x00000002L
  759. #define TPMX_RIGHTALIGN 0x00000003L
  760. #define TPMX_TOPALIGN 0x00000004L
  761. #define TPMX_VCENTERALIGN 0x00000005L
  762. #define TPMX_BOTTOMALIGN 0x00000006L
  763. #define TPMX_ALIGN_MASK 0x0000000FL
  764. // track flags (menu area combine type)
  765. #define TPMX_COMBINE_NONE 0x00000000L // do not combine menu area with lpRect
  766. #define TPMX_COMBINE_ANY_SUITABLE 0x00000010L // try combine menu area with lpRect
  767. #define TPMX_COMBINE_DEFAULT 0x00000020L // do like PaintManager said
  768. #define TPMX_COMBINE_MASK 0x00000030L
  769. // select first enabled menu item
  770. #define TPMX_SELECT_ANY 0x00000040L
  771. // perform message loop
  772. #define TPMX_DO_MESSAGE_LOOP 0x00000080L
  773. // initially expand rarely used items
  774. #define TPMX_NO_HIDE_RARELY 0x00000100L
  775. // do not post WM_COMMAND message
  776. // (result could be stored in lpnResultCmdID)
  777. #define TPMX_NO_WM_COMMAND 0x00000200L
  778. // do not update cmdui
  779. #define TPMX_NO_CMD_UI 0x00000400L
  780. // ownerdraw items
  781. // (variable sizes are not supported)
  782. #define TPMX_OWNERDRAW_FIXED 0x00000800L
  783. // force no shadows
  784. #define TPMX_NO_SHADOWS 0x00001000L
  785. // help context mode
  786. #define TPMX_HELP_CTX_MODE 0x00002000L
  787. // customize mode / no menu site control
  788. #define TPMX_CUSTOMIZE_MODE 0x00004000L
  789. // force no animation (for quick displaying)
  790. #define TPMX_FORCE_NO_ANIMATION 0x00008000L
  791. // toolbar/palette mode
  792. #define TPMX_PALETTE 0x00010000L
  793. // palette with floating toolbar background
  794. #define TPMX_PALETTE_TB_BKGND 0x00020000L
  795. // tear-off caption
  796. #define TPMX_TEAROFF 0x00040000L
  797. // do not connect to global menu site
  798. #define TPMX_NO_SITE 0x00080000L
  799. // ribbon mode, if supported by paint manager
  800. #define TPMX_RIBBON_MODE 0x00100000L
  801. // ribbon mode, file menu
  802. #define TPMX_RIBBON_FILE_MENU 0x00200000L
  803. // ribbon mode, file menu
  804. #define TPMX_RIBBON_OPTIONS_BUTTON 0x00400000L
  805. // ribbon mode, file menu
  806. #define TPMX_RIBBON_EXIT_BUTTON 0x00800000L
  807. // disable fade-out animation
  808. #define TPMX_NO_FADE_OUT_ANIMATION 0x01000000L
  809. // disable dynamic shadows
  810. #define TPMX_NO_DYNAMIC_SHADOWS 0x02000000L
  811. // ribbon-like resizing
  812. #define TPMX_RIBBON_RESIZING 0x04000000L
  813. // ribbon-like resizing vertical only
  814. #define TPMX_RIBBON_RESIZING_VERTICAL_ONLY 0x08000000L
  815. // ribbon key tips
  816. #define TPMX_RIBBON_KEYTIPS 0x10000000L
  817. // hide keyboard accelerators
  818. #define TPMX_HIDE_KEYBOARD_ACCELERATORS 0x20000000L
  819. // system menu
  820. #define TPMX_SYSMENU 0x40000000L
  821. class __PROF_UIS_API CExtPopupMenuWnd
  822. : public CExtPopupBaseWnd
  823. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  824. , public CExtCustomizeSite::ICustomizeDropTarget
  825. , public CExtCustomizeSite::ICustomizeDropSource
  826. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  827. {
  828. friend class CExtControlBar;
  829. friend class CExtToolControlBar;
  830. friend class CExtMenuControlBar;
  831. class __PROF_UIS_API InternalFriendlyWinApp : CWinApp
  832. {
  833. public:
  834. inline static InternalFriendlyWinApp * _GetFriendlyApp()
  835. {
  836. CWinApp * pApp = ::AfxGetApp();
  837. ASSERT( pApp != NULL );
  838. return (InternalFriendlyWinApp *)pApp;
  839. }
  840. CRecentFileList * _GetRecentFileList()
  841. {
  842. //ASSERT( m_pRecentFileList != NULL );
  843. return m_pRecentFileList;
  844. }
  845. }; // class InternalFriendlyWinApp
  846. public:
  847. virtual void _ForceCancelCallbacs();
  848. static bool g_bShowStatusTipsOverDisabledItems;
  849. static bool g_bShowCoolTipsOverDisabledItems;
  850. static CExtSafeString g_strSpecSymbols;
  851. static bool g_bUseAcceleratedMenuScrolling;
  852. static INT g_nAcceleratedIncreaseStep;
  853. static INT g_nAcceleratedIncreasePercent;
  854. static INT g_nAcceleratedPixelsPerStepMax;
  855. protected:
  856. INT m_nAcceleratedPixelsPerStepCurrent;
  857. INT m_nAcceleratedMilliSecondsPassed;
  858. public:
  859. static bool g_bTranslateContextHelpCmd;
  860. static ACCEL g_accelContextHelp;
  861. virtual const ACCEL * _GetTranslatedContextHelpAccel() const;
  862. // is allowed menu item positioning without
  863. // using only & - marked text
  864. static bool g_bAllowNonAccelPositioning;
  865. friend class CExtPopupMenuSite;
  866. public:
  867. DECLARE_DYNCREATE( CExtPopupMenuWnd );
  868. CExtPopupMenuWnd();
  869. // Attributes
  870. public:
  871. virtual int _GetCurIndex() const;
  872. void _DoShowChain( int nCmdShow = SW_SHOWNA );
  873. void _DoResetChainPositions();
  874. virtual bool OnQueryLayoutRTL() const;
  875. protected:
  876. void _DoResetChainPositionsImpl(
  877. CExtPopupMenuWnd * pPrev
  878. );
  879. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  880. public:
  881. int m_nHelperDropIndexBefore;
  882. virtual void _SetDropIndexBefore(
  883. int nIndex = -1 // reset
  884. );
  885. protected:
  886. bool m_bHelperNoHideChild:1, m_bHelperNoRemoveSrc:1, m_bHelperDragOverPassed:1;
  887. CPoint m_ptHelperDragStart;
  888. int m_nDragSrcIdx;
  889. CExtCustomizeCmdTreeNode * m_pNode, * m_pDragSrcNode;
  890. CExtCustomizeSite * m_pCustomizeSite;
  891. public:
  892. CExtCustomizeCmdTreeNode * _CmdNodeGet()
  893. {
  894. ASSERT_VALID( this );
  895. #ifdef _DEBUG
  896. if( m_pNode != NULL )
  897. {
  898. ASSERT_VALID( m_pNode );
  899. }
  900. #endif // _DEBUG
  901. return m_pNode;
  902. }
  903. const CExtCustomizeCmdTreeNode * _CmdNodeGet() const
  904. {
  905. ASSERT_VALID( this );
  906. #ifdef _DEBUG
  907. if( m_pNode != NULL )
  908. {
  909. ASSERT_VALID( m_pNode );
  910. }
  911. #endif // _DEBUG
  912. return m_pNode;
  913. }
  914. void _CmdNodeSet( CExtCustomizeCmdTreeNode * pNode )
  915. {
  916. ASSERT_VALID( this );
  917. #ifdef _DEBUG
  918. if( pNode != NULL )
  919. {
  920. ASSERT_VALID( pNode );
  921. }
  922. #endif // _DEBUG
  923. m_pNode = pNode;
  924. }
  925. virtual CExtCustomizeSite * _FindCustomizeSite() const;
  926. protected:
  927. // CExtCustomizeSite::ICustomizeDropTarget
  928. virtual DROPEFFECT OnCustomizeTargetOver(
  929. CExtCustomizeSite::CCmdDragInfo & _dragInfo,
  930. CPoint point,
  931. DWORD dwKeyState
  932. );
  933. virtual void OnCustomizeTargetLeave();
  934. virtual bool OnCustomizeTargetDrop(
  935. CExtCustomizeSite::CCmdDragInfo & _dragInfo,
  936. CPoint point,
  937. DROPEFFECT de
  938. );
  939. // CExtCustomizeSite::ICustomizeDropSource
  940. virtual void OnCustomizeSourceDragComplete(
  941. DROPEFFECT de,
  942. bool bCanceled,
  943. bool * p_bNoResetActiveItem
  944. );
  945. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  946. public:
  947. virtual INT _FindChildPopup( const CExtPopupMenuWnd * pPopup ) const;
  948. virtual bool _FindCustomizeMode() const;
  949. protected:
  950. int m_nCurIndex, m_nDelayedFocusItemIndex,
  951. m_nLastMousePick;
  952. bool
  953. m_bTopLevel:1,
  954. m_bScrollingAvailable:1,
  955. m_bExpandAvailable:1,
  956. m_bExpandWasPressed:1,
  957. m_bSuspendTips:1,
  958. m_bDelayedHiding:1;
  959. UINT m_nWaitingExpandTickCount;
  960. DWORD m_dwTrackFlags;
  961. HWND m_hWndCmdReceiver;
  962. int m_nDyScrollOffset;
  963. CExtPopupMenuWnd * m_pWndParentMenu;
  964. CRect m_rcScrollTop, m_rcScrollBottom,
  965. m_rcExpandBtn, m_rcTearOffBtn,
  966. m_rcRibbonBtnOptions, m_rcRibbonBtnExit;
  967. int m_nScrollingDirection;
  968. UINT m_nLeftAreaWidth;
  969. bool m_bHelperMouseBtnDownOnStart:1;
  970. CPoint m_ptStartMousePos;
  971. public:
  972. HWND m_hWndNotifyMenuClosed;
  973. bool _IsTopLevelPopup() const
  974. {
  975. ASSERT_VALID( this );
  976. return m_bTopLevel;
  977. }
  978. bool _IsScrollingAvailable() const
  979. {
  980. ASSERT_VALID( this );
  981. return m_bScrollingAvailable;
  982. }
  983. CExtPopupMenuWnd * GetParentMenuWnd()
  984. {
  985. ASSERT_VALID( this );
  986. return m_pWndParentMenu;
  987. }
  988. const CExtPopupMenuWnd * GetParentMenuWnd() const
  989. {
  990. ASSERT_VALID( this );
  991. return ( const_cast < CExtPopupMenuWnd * > ( this ) ) -> GetParentMenuWnd();
  992. }
  993. CExtPopupMenuWnd * GetTopLevelMenuWnd()
  994. {
  995. ASSERT_VALID( this );
  996. CExtPopupMenuWnd * pPopup = this;
  997. for( ; pPopup != NULL; )
  998. {
  999. ASSERT_VALID( pPopup );
  1000. if( pPopup->_IsTopLevelPopup() )
  1001. break;
  1002. pPopup = pPopup->GetParentMenuWnd();
  1003. }
  1004. return pPopup;
  1005. }
  1006. const CExtPopupMenuWnd * GetTopLevelMenuWnd() const
  1007. {
  1008. ASSERT_VALID( this );
  1009. return ( const_cast < CExtPopupMenuWnd * > ( this ) ) -> GetTopLevelMenuWnd();
  1010. }
  1011. virtual HWND GetCmdReceiverHWND();
  1012. HWND GetCmdReceiverHWND() const;
  1013. virtual bool IsNoHighlightIconArea();
  1014. virtual bool IsSyncFullRowItems();
  1015. virtual DWORD TrackFlagsGet() const;
  1016. virtual void TrackFlagsSet(
  1017. DWORD dwTrackFlags = 0
  1018. );
  1019. enum spec_buttons_index_t
  1020. {
  1021. IDX_NOTHING = -1,
  1022. IDX_SCROLL_TOP = -2,
  1023. IDX_SCROLL_BOTTOM = -3,
  1024. IDX_EXPAND = -4,
  1025. IDX_TEAROFF = -5,
  1026. IDX_RIBBON_FILE_MENU_OPTIONS_BUTTON = -6,
  1027. IDX_RIBBON_FILE_MENU_EXIT_BUTTON = -7,
  1028. };
  1029. // Operations
  1030. public:
  1031. virtual BOOL LoadMenu( 
  1032. HWND hWndCmdRecv,
  1033. UINT nIDResource,
  1034. bool bPopupMenu = true,
  1035. bool bNoRefToCmdMngr = false
  1036. );
  1037. virtual HMENU ExportToMenu(
  1038. BOOL bDeep = TRUE
  1039. ) const;
  1040. virtual BOOL UpdateFromMenu( 
  1041. HWND hWndCmdRecv,
  1042. CMenu *pBuildMenu,
  1043. bool bPopupMenu = true,
  1044. bool bTopLevel = true,
  1045. bool bNoRefToCmdMngr = false
  1046. );
  1047. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1048. bool UpdateFromCmdTree(
  1049. HWND hWndCmdRecv,
  1050. CExtCustomizeCmdTreeNode * pNode,
  1051. bool bTopLevel = true
  1052. );
  1053. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1054. static bool g_bMdiWindowsMenuUsesCheckInsteadOfRadio;
  1055. virtual BOOL UpdateMdiWindowsMenu(
  1056. CWnd * pWndStartSearchMdiFrameWnd = NULL
  1057. );
  1058. virtual void SetCmdTargetToAllItems(
  1059. HWND hWndSpecCmdReceiver = NULL,
  1060. bool bOnlyThisLevel = false
  1061. );
  1062. enum menu_item_type_t
  1063. {
  1064. TYPE_POPUP = 0xFFFFFFFF,
  1065. TYPE_SEPARATOR = 0x00000000 // same as ID_SEPARATOR
  1066. };
  1067. virtual INT ItemGetCount() const;
  1068. virtual UINT ItemGetCmdID( // menu_item_type_t values can be returned
  1069. INT nPos
  1070. ) const;
  1071. virtual CExtCmdIcon & ItemGetIcon( INT nPos );
  1072. const CExtCmdIcon & ItemGetIcon( INT nPos ) const;
  1073. virtual CExtSafeString ItemGetText( INT nPos ) const;
  1074. virtual CExtSafeString ItemGetAccelText( INT nPos ) const;
  1075. virtual INT ItemFindPosForCmdID(
  1076. UINT nCmdID,
  1077. INT nPosStart = -1
  1078. ) const;
  1079. bool ItemSetPopupIcon(
  1080. INT nPos,
  1081. HICON hIcon = NULL // no icon by default
  1082. );
  1083. virtual bool ItemSetPopupIcon(
  1084. INT nPos,
  1085. const CExtCmdIcon & _icon
  1086. );
  1087. virtual bool ItemSetPopupText(
  1088. INT nPos,
  1089. __EXT_MFC_SAFE_LPCTSTR sText // NULL if empty
  1090. );
  1091. virtual bool ItemSetPopupAccelText(
  1092. INT nPos,
  1093. __EXT_MFC_SAFE_LPCTSTR sText // NULL if empty
  1094. );
  1095. virtual CExtPopupMenuWnd * ItemGetPopup(
  1096. INT nPos
  1097. );
  1098. virtual const CExtPopupMenuWnd * ItemGetPopup(
  1099. INT nPos
  1100. ) const;
  1101. virtual bool ItemIsDisplayed(
  1102. INT nPos
  1103. ) const;
  1104. virtual void ItemSetDisplayed(
  1105. INT nPos,
  1106. bool bForceDisplayed = true
  1107. );
  1108. virtual BOOL ItemRemove(
  1109. INT nPos = -1 // remove all
  1110. );
  1111. virtual INT ItemRemoveAllSeparators();
  1112. virtual bool ItemPaletteRowWrapGet(
  1113. INT nPos
  1114. ) const;
  1115. virtual void ItemPaletteRowWrapSet(
  1116. INT nPos,
  1117. bool bWrap = true
  1118. );
  1119. virtual bool ItemToolLayoutGet(
  1120. INT nPos
  1121. ) const;
  1122. virtual void ItemToolLayoutSet(
  1123. INT nPos,
  1124. bool bToolButton = true
  1125. );
  1126. virtual bool ItemEnabledGet(
  1127. INT nPos
  1128. ) const;
  1129. virtual void ItemEnabledSet(
  1130. INT nPos,
  1131. bool bEnabled = true
  1132. );
  1133. virtual bool ItemBoldGet(
  1134. INT nPos
  1135. ) const;
  1136. virtual void ItemBoldSet(
  1137. INT nPos,
  1138. bool bBold = true
  1139. );
  1140. virtual bool ItemDefaultGet(
  1141. INT nPos
  1142. ) const;
  1143. virtual void ItemDefaultSet(
  1144. INT nPos,
  1145. bool bDefault = true
  1146. );
  1147. INT ItemDefaultFind() const;
  1148. void ItemDefaultUnset();
  1149. virtual bool ItemEnabledAppearanceGet(
  1150. INT nPos
  1151. ) const;
  1152. virtual void ItemEnabledAppearanceSet(
  1153. INT nPos,
  1154. bool bEnabledAppearance = true
  1155. );
  1156. BOOL ItemInsert(
  1157. UINT nCmdID = TYPE_SEPARATOR,
  1158. INT nPos = -1, // append
  1159. __EXT_MFC_SAFE_LPCTSTR sText = NULL, // for TYPE_POPUP only
  1160. HICON hIcon = NULL, // for TYPE_POPUP only
  1161. HWND hWndSpecCmdReceiver = NULL // specific command receiver
  1162. );
  1163. virtual BOOL ItemInsert(
  1164. UINT nCmdID,
  1165. INT nPos, // -1 - append
  1166. __EXT_MFC_SAFE_LPCTSTR sText, // for TYPE_POPUP only
  1167. const CExtCmdIcon & icon, // for TYPE_POPUP only
  1168. HWND hWndSpecCmdReceiver = NULL // specific command receiver
  1169. );
  1170. virtual BOOL ItemInsertCommand( // no references to command manager
  1171. UINT nCmdID,
  1172. INT nPos, // -1 append
  1173. __EXT_MFC_SAFE_LPCTSTR sItemText, // may be NULL
  1174. __EXT_MFC_SAFE_LPCTSTR sAccelText, // may be NULL
  1175. const CExtCmdIcon & icon,
  1176. int nCheck = 0, // 0 - no check, 1 - checked, 2 - indeterminate, 3 - radio
  1177. HWND hWndSpecCmdReceiver = NULL
  1178. );
  1179. BOOL ItemInsertCommand( // no references to command manager
  1180. UINT nCmdID = TYPE_SEPARATOR,
  1181. INT nPos = -1, // append
  1182. __EXT_MFC_SAFE_LPCTSTR sItemText = NULL,
  1183. __EXT_MFC_SAFE_LPCTSTR sAccelText = NULL,
  1184. HICON hIcon = NULL,
  1185. bool bCopyIcon = true,
  1186. int nCheck = 0, // 0 - no check, 1 - checked, 2 - indeterminate, 3 - radio
  1187. HWND hWndSpecCmdReceiver = NULL
  1188. );
  1189. BOOL ItemInsertSpecPopup( // insert specific popup implementation
  1190. CExtPopupMenuWnd * pSpecPopup,
  1191. INT nPos = -1, // append
  1192. __EXT_MFC_SAFE_LPCTSTR sText = NULL,
  1193. HICON hIcon = NULL
  1194. );
  1195. virtual BOOL ItemInsertSpecPopup( // insert specific popup implementation
  1196. CExtPopupMenuWnd * pSpecPopup,
  1197. INT nPos, // -1 - append
  1198. __EXT_MFC_SAFE_LPCTSTR sText,
  1199. const CExtCmdIcon & icon
  1200. );
  1201. virtual INT ItemFindByAccessChar(
  1202. __EXT_MFC_SAFE_TCHAR chrAccess,
  1203. INT nStartIdx = -1,
  1204. BOOL bRestartAt0 = TRUE,
  1205. BOOL bSearchDisplayedOnly = TRUE
  1206. ) const;
  1207. virtual INT ItemFindByText(
  1208. __EXT_MFC_SAFE_LPCTSTR sText,
  1209. INT nStartIdx = -1,
  1210. BOOL bRestartAt0 = TRUE
  1211. ) const;
  1212. virtual bool IsAllItemsRarelyUsed() const;
  1213. virtual BOOL CreatePopupMenu( HWND hWndCmdRecv ); // alternative to LoadMenu()
  1214. void SetLeftAreaWidth( UINT nWidth = 0 );
  1215. UINT GetLeftAreaWidth() const;
  1216. static CExtPopupMenuWnd * GetTrackingMenu();
  1217. static void CancelMenuTracking();
  1218. inline static BOOL IsKeyPressed(
  1219. int nVirtKey,
  1220. bool bAsync = false
  1221. )
  1222. {
  1223. SHORT nKeyState = bAsync ? ( ::GetAsyncKeyState( nVirtKey ) ) : ( ::GetKeyState( nVirtKey ) );
  1224. if( (nKeyState & (1 << (sizeof(SHORT)*8-1))) != 0 )
  1225. return TRUE;
  1226. return FALSE;
  1227. }
  1228. static BOOL IsCmdKeyActivation(
  1229. LPARAM lParam = 0
  1230. );
  1231. static BOOL IsMenuTracking();
  1232. virtual BOOL TrackPopupMenu(
  1233. DWORD dwTrackFlags,
  1234. int x,
  1235. int y,
  1236. LPCRECT lpRect = NULL,
  1237. LPVOID pCbPaintCombinedCookie = NULL,
  1238. pCbPaintCombinedContent pCbPCC = NULL,
  1239. UINT * lpnResultCmdID = NULL,
  1240. bool bCookieIsObject = false
  1241. );
  1242. struct __PROF_UIS_API MsgPrepareMenuData_t
  1243. {
  1244. bool m_bMenuChanged:1;
  1245. bool m_bMenuCanceled:1;
  1246. bool m_bOneLevelCall:1;
  1247. CExtPopupMenuWnd * m_pPopup;
  1248. MsgPrepareMenuData_t(
  1249. CExtPopupMenuWnd * pPopup
  1250. )
  1251. : m_bMenuChanged( false )
  1252. , m_bMenuCanceled( false )
  1253. , m_bOneLevelCall( false )
  1254. , m_pPopup( pPopup )
  1255. {
  1256. ASSERT( m_pPopup != NULL );
  1257. }
  1258. ~MsgPrepareMenuData_t()
  1259. {
  1260. }
  1261. operator WPARAM() const
  1262. {
  1263. return WPARAM( this );
  1264. }
  1265. LRESULT SendMessage(
  1266. HWND hWnd,
  1267. bool bOneLevelCall
  1268. )
  1269. {
  1270. ASSERT( m_pPopup != NULL );
  1271. m_bOneLevelCall = bOneLevelCall;
  1272. ASSERT( hWnd != NULL );
  1273. ASSERT( ::IsWindow(hWnd) );
  1274. LRESULT lResult =
  1275. ::SendMessage(
  1276. hWnd,
  1277. m_bOneLevelCall
  1278. ? CExtPopupMenuWnd::g_nMsgPrepareOneMenuLevel
  1279. : CExtPopupMenuWnd::g_nMsgPrepareMenu
  1280. ,
  1281. WPARAM( *this ),
  1282. LPARAM( m_pPopup )
  1283. );
  1284. return lResult;
  1285. }
  1286. LRESULT SendMessage(
  1287. CWnd * pWnd,
  1288. bool bOneLevelCall
  1289. )
  1290. {
  1291. return
  1292. SendMessage(
  1293. pWnd->GetSafeHwnd(),
  1294. bOneLevelCall
  1295. );
  1296. }
  1297. }; // struct MsgPrepareMenuData_t
  1298. static bool g_bFullScreenMode;
  1299. static bool g_bMenuWithShadows; // allow shadows
  1300. static bool g_bMenuExpanding; // allow hide rarely used
  1301. static bool g_bMenuDelayExpanding; // show full menu after short delay
  1302. static bool g_bMenuHighlightRarely; // display rarely used in different style
  1303. static bool g_bMenuShowCoolTips; // allow display cool tooltips
  1304. static bool g_bMenuExpandAnimation; // allow animation when show rarely used
  1305. static bool g_bUseStretchOnExpandAnimation; // use StretchBlt() instead of BitBlt() for painting menu expand amimation
  1306. static bool g_bMenuLargeIcons; // use large icons
  1307. static bool g_bEatNcAreaClicks;
  1308. static bool g_bMRU_UseFullPathsInMenu;
  1309. static bool g_bMRU_UseFullPathsInTipTool;
  1310. static CExtPopupMenuTipWnd::e_tip_style_t g_eTtsClassicMenu;
  1311. static CExtPopupMenuTipWnd::e_tip_style_t g_eTtsPaletteMenu;
  1312. static CExtPopupMenuTipWnd::e_tip_style_t g_eTtsColorMenu;
  1313. static CExtPopupMenuTipWnd::e_tip_style_t g_eTtsTearOffCaption;
  1314. public:
  1315. static void stat_paint_combined_menu_toolbtn(
  1316. LPVOID pCookie,
  1317. CDC & dc,
  1318. const CWnd & refWndMenu,
  1319. const CRect & rcExcludeArea, // in screen coords
  1320. int eCombineAlign // CExtPopupMenuWnd::e_combine_align_t values
  1321. );
  1322. protected:
  1323. CExtPopupMenuTipWnd m_wndToolTip;
  1324. virtual CExtPopupMenuTipWnd & GetTip();
  1325. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1326. CExtPopupScreenTipWnd m_wndScreenTip;
  1327. virtual CExtPopupScreenTipWnd & GetScreenTip();
  1328. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1329. protected:
  1330. virtual bool _CreateHelper(
  1331. CWnd * pWndCmdReceiver
  1332. );
  1333. virtual bool _BuildItems(
  1334. CMenu * pBuildMenu,
  1335. bool bTopLevel,
  1336. bool bNoRefToCmdMngr = false
  1337. );
  1338. virtual void _UpdateCmdUI();
  1339. virtual void _Init();
  1340. virtual void _RecalcLayoutImpl();
  1341. static int _GetSpecBtnHeight();
  1342. public:
  1343. virtual void _RecalcTrackParms(
  1344. bool bMoveWindow = true
  1345. );
  1346. void _CachedRectsEmpty();
  1347. virtual CRect OnQueryMenuBorderMetrics() const;
  1348. virtual int _HitTest(
  1349. const CPoint & point,
  1350. bool * p_bInplaceControlArea = NULL,
  1351. bool * p_bInplaceDropDownArea = NULL
  1352. );
  1353. virtual int _GetTearOffCaptionHeight() const;
  1354. virtual bool _IsTearOff() const;
  1355. virtual bool _IsPalette() const;
  1356. public:
  1357. virtual void _DoPaint( CDC & dcPaint, bool bUseBackBuffer = true );
  1358. virtual void _DoPaintMenuItems( CDC & dc );
  1359. virtual void _DoPaintMenuItemsPalette( CDC & dc );
  1360. virtual void _GetClientRect(RECT * pRectClient);
  1361. static void PassMsgLoop(
  1362. bool bEnableOnIdleCalls
  1363. );
  1364. struct __PROF_UIS_API ExpandEffectRects_t
  1365. {
  1366. CRect m_rcSrc,m_rcDst;
  1367. ExpandEffectRects_t()
  1368. {
  1369. m_rcSrc.SetRectEmpty();
  1370. m_rcDst.SetRectEmpty();
  1371. }
  1372. ExpandEffectRects_t(
  1373. const RECT & rcSrc,
  1374. const RECT & rcDst
  1375. )
  1376. {
  1377. m_rcSrc = rcSrc;
  1378. m_rcDst = rcDst;
  1379. }
  1380. ExpandEffectRects_t(
  1381. const ExpandEffectRects_t & other
  1382. )
  1383. {
  1384. m_rcSrc = other.m_rcSrc;
  1385. m_rcDst = other.m_rcDst;
  1386. }
  1387. ExpandEffectRects_t &
  1388. operator = (
  1389. const ExpandEffectRects_t & other
  1390. )
  1391. {
  1392. m_rcSrc = other.m_rcSrc;
  1393. m_rcDst = other.m_rcDst;
  1394. return * this;
  1395. }
  1396. }; // struct ExpandEffectRects_t
  1397. typedef
  1398. CArray < ExpandEffectRects_t, ExpandEffectRects_t & >
  1399. expand_effect_rects_container_t;
  1400. struct __PROF_UIS_API VisibleItemDefinition_t
  1401. {
  1402. INT m_nIndex;
  1403. bool m_bRarelyUsed:1;
  1404. bool m_bRarelyUsedPrev:1;
  1405. bool m_bRarelyUsedNext:1;
  1406. bool m_bHelperIsSeparator:1;
  1407. bool m_bHelperIsPopup:1;
  1408. UINT m_nHelperCmdID;
  1409. CRect m_rcItem;
  1410. CRect m_rcItemWithIndents;
  1411. VisibleItemDefinition_t()
  1412. {
  1413. m_nIndex = -1;
  1414. m_bRarelyUsed
  1415. = m_bRarelyUsedPrev
  1416. = m_bRarelyUsedNext
  1417. = m_bHelperIsSeparator
  1418. = m_bHelperIsPopup
  1419. = false;
  1420. m_nHelperCmdID = ID_SEPARATOR;
  1421. m_rcItem.SetRectEmpty();
  1422. m_rcItemWithIndents.SetRectEmpty();
  1423. }
  1424. VisibleItemDefinition_t(
  1425. const VisibleItemDefinition_t & other
  1426. )
  1427. {
  1428. AssignFromOther(other);
  1429. }
  1430. ~VisibleItemDefinition_t()
  1431. {
  1432. }
  1433. VisibleItemDefinition_t & operator = (
  1434. const VisibleItemDefinition_t & other
  1435. )
  1436. {
  1437. AssignFromOther(other);
  1438. return * this;
  1439. }
  1440. void AssignFromOther(
  1441. const VisibleItemDefinition_t & other
  1442. )
  1443. {
  1444. m_nIndex = other.m_nIndex;
  1445. m_bRarelyUsed = other.m_bRarelyUsed;
  1446. m_bRarelyUsedPrev = other.m_bRarelyUsedPrev;
  1447. m_bRarelyUsedNext = other.m_bRarelyUsedNext;
  1448. m_bHelperIsSeparator = other.m_bHelperIsSeparator;
  1449. m_bHelperIsPopup = other.m_bHelperIsPopup;
  1450. m_nHelperCmdID = other.m_nHelperCmdID;
  1451. m_rcItem = other.m_rcItem;
  1452. m_rcItemWithIndents = other.m_rcItemWithIndents;
  1453. }
  1454. operator int() const
  1455. {
  1456. return m_nIndex;
  1457. }
  1458. }; // struct VisibleItemDefinition_t
  1459. typedef
  1460. CArray < VisibleItemDefinition_t, VisibleItemDefinition_t & >
  1461. visible_items_t;
  1462. virtual void _GetVisibleItems(
  1463. HDC hDcTest, // may be NULL
  1464. visible_items_t & v
  1465. );
  1466. virtual void _GetVisibleItemsPalette(
  1467. HDC hDcTest, // may be NULL
  1468. visible_items_t & v
  1469. );
  1470. virtual bool _IsPaletteItemWrap(
  1471. int nIndex
  1472. ) const;
  1473. static INT g_nTimeDelayedDisplaying;
  1474. static INT g_nTimeDelayedHiding;
  1475. protected:
  1476. virtual BOOL _TrackPopupMenu(
  1477. DWORD dwTrackFlags,
  1478. int x,
  1479. int y,
  1480. LPCRECT lpRect,
  1481. LPVOID pCbPaintCombinedCookie = NULL,
  1482. pCbPaintCombinedContent pCbPCC = NULL,
  1483. bool bCookieIsObject = false
  1484. );
  1485. public:
  1486. static const UINT g_nMsgRibbonFileMenuButtonInvocation;
  1487. struct __PROF_UIS_API RIBBONFILEMENUBUTTONINVOCATION
  1488. {
  1489. DWORD m_dwButtonType; // TPMX_RIBBON_EXIT_BUTTON or TPMX_RIBBON_OPTIONS_BUTTON
  1490. HWND m_hWndTarget1, m_hWndTarget2;
  1491. bool m_bQueryHandled:1;
  1492. RIBBONFILEMENUBUTTONINVOCATION(
  1493. DWORD dwButtonType,
  1494. CExtPopupMenuWnd * pPopup
  1495. );
  1496. bool Notify();
  1497. operator WPARAM() const;
  1498. static RIBBONFILEMENUBUTTONINVOCATION * FromWPARAM( WPARAM wParam );
  1499. };
  1500. static const UINT g_nMsgRibbonFileMenuButtonQuery;
  1501. struct __PROF_UIS_API RIBBONFILEMENUBUTTONQUERY
  1502. {
  1503. CExtPopupMenuWnd * m_pPopup;
  1504. DWORD m_dwButtonType; // TPMX_RIBBON_EXIT_BUTTON or TPMX_RIBBON_OPTIONS_BUTTON
  1505. CDC * m_pDC; // painting query if not NULL
  1506. INT m_nMeasuredWidth;
  1507. CRect m_rcButton;
  1508. bool m_bHover:1, m_bPressed:1, m_bQueryHandled:1;
  1509. CExtCmdIcon m_icon;
  1510. CExtSafeString m_sText;
  1511. RIBBONFILEMENUBUTTONQUERY(
  1512. CExtPopupMenuWnd * pPopup,
  1513. DWORD dwButtonType,
  1514. CDC * pDC = NULL
  1515. );
  1516. bool Notify();
  1517. operator WPARAM() const;
  1518. static RIBBONFILEMENUBUTTONQUERY * FromWPARAM( WPARAM wParam );
  1519. }; // struct RIBBONFILEMENUBUTTONQUERY
  1520. static const UINT g_nMsgItemCoveringNotification;
  1521. struct __PROF_UIS_API ITEMCOVERINGNOTIFICATON
  1522. {
  1523. // only one of the following is not NULL
  1524. CExtPopupMenuWnd * m_pPopup;
  1525. CExtBarButton * m_pTBB;
  1526. // item index of pPopup or -1 for toolbar
  1527. INT m_nPopupItemIndex;
  1528. // event type
  1529. enum eICN_t
  1530. {
  1531. __EICN_CANCEL = 0, // unhover in toolbar, unfocus in menu
  1532. __EICN_SET = 1, // hover in toolbar, focus in menu
  1533. __EICN_DELAY = 2, // delay focus (in menu only)
  1534. };
  1535. eICN_t m_eICN;
  1536. // pop-up menu specific for po-pup sub item only
  1537. bool m_bEnableDropChild:1, m_bSelectAnyInChild:1;
  1538. // flag that allows to cancel any conflicting tool tip windows
  1539. bool m_bSuspendTips:1;
  1540. // constructor, methods, operators
  1541. ITEMCOVERINGNOTIFICATON(
  1542. CExtPopupMenuWnd * pPopup,
  1543. CExtBarButton * pTBB,
  1544. eICN_t eICN,
  1545. INT nPopupItemIndex = -1,
  1546. bool bEnableDropChild = false,
  1547. bool bSelectAnyInChild = false
  1548. );
  1549. bool Notify();
  1550. operator WPARAM() const;
  1551. static ITEMCOVERINGNOTIFICATON * FromWPARAM( WPARAM wParam );
  1552. }; // struct ITEMCOVERINGNOTIFICATON
  1553. protected:
  1554. bool m_bCanceling:1;
  1555. public:
  1556. virtual void _CancelingSet();
  1557. virtual bool _CancelingGet() const;
  1558. struct __PROF_UIS_API ItemFocusTracker_t
  1559. {
  1560. protected:
  1561. static CMap < CExtPopupMenuWnd *, CExtPopupMenuWnd *, INT, INT > g_map;
  1562. const CExtPopupMenuWnd & m_Popup;
  1563. public:
  1564. ItemFocusTracker_t( const CExtPopupMenuWnd & _Popup );
  1565. ItemFocusTracker_t( const CExtPopupMenuWnd * pPopup );
  1566. virtual ~ItemFocusTracker_t();
  1567. virtual void FocusChangingRegister();
  1568. virtual void FocusChangingUnRegister();
  1569. virtual bool FocusChangingIsRegistered();
  1570. static bool FocusChangingIsInProgress( const CExtPopupMenuWnd * pPopup );
  1571. }; // struct ItemFocusTracker_t
  1572. virtual bool _ItemFocusChangingIsInProgress() const;
  1573. virtual void _ItemFocusCancel(
  1574. BOOL bRepaint,
  1575. BOOL bCancelTip = TRUE,
  1576. BOOL bDelayHiding = FALSE
  1577. );
  1578. virtual void _ItemFocusDelay(
  1579. int nItemIndex = IDX_NOTHING,
  1580. bool * p_bFocusAreadySet = NULL
  1581. );
  1582. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1583. protected:
  1584. CExtCustomizeCmdKeyTip m_keyTipChain;
  1585. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  1586. protected:
  1587. CExtPopupKeyTipWnd m_wndKeyTipOptionsButton, m_wndKeyTipExitButton;
  1588. public:
  1589. CExtCustomizeCmdKeyTip m_keyTipOptionsButton, m_keyTipExitButton;
  1590. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  1591. public:
  1592. bool _KeyTipsEnabledGet() const;
  1593. void _KeyTipsShow( bool bShow );
  1594. bool _KeyTipsTranslate(
  1595. DWORD dwKeyCode,
  1596. INT * p_nIndex = NULL
  1597. );
  1598. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1599. public:
  1600. virtual void _ItemFocusSet(
  1601. int nCurIndex,
  1602. BOOL bEnableDropChild,
  1603. BOOL bRepaint,
  1604. BOOL bSelectAnyInChild = TRUE,
  1605. BOOL bDelayHiding = FALSE // delay hiding previous
  1606. );
  1607. virtual void _GetItemRect(
  1608. int nIndex,
  1609. RECT & rectItem,
  1610. bool bIncludeIndents = true
  1611. );
  1612. virtual void _GetItemRectPalette(
  1613. int nIndex,
  1614. RECT & rectItem,
  1615. bool bIncludeIndents = true
  1616. );
  1617. public:
  1618. virtual bool _OnMouseWheel(
  1619. WPARAM wParam,
  1620. LPARAM lParam,
  1621. bool & bNoEat
  1622. );
  1623. virtual bool _OnMouseMove(
  1624. UINT nFlags,
  1625. CPoint point,
  1626. bool & bNoEat
  1627. );
  1628. virtual bool _OnMouseClick(
  1629. UINT nFlags,
  1630. CPoint point,
  1631. bool & bNoEat
  1632. );
  1633. virtual bool _OnKeyDown(
  1634. UINT nChar,
  1635. UINT nRepCnt,
  1636. UINT nFlags,
  1637. bool & bNoEat
  1638. );
  1639. virtual bool _CanStartLevelTracking();
  1640. protected:
  1641. virtual void _FreeWinObjects();
  1642. virtual void _OnCancelMode(
  1643. bool bNcDestroy = false
  1644. );
  1645. virtual bool _PtInWndArea( CPoint ptClient );
  1646. public:
  1647. virtual void _SetCapture();
  1648. virtual CExtPopupMenuWnd * _GetCapture();
  1649. virtual void _ReleaseCapture();
  1650. protected:
  1651. virtual int _GetMaxScrollPos();
  1652. virtual bool _StartScrolling(int nButtonIndex);
  1653. public:
  1654. virtual void _SyncItems();
  1655. virtual void _SyncItemsPalette();
  1656. virtual void ResetPaletteWrapping(
  1657. bool bCreateToolBarWrapping = false,
  1658. int nIndexFirst = 0,
  1659. int nIndexLast = -1
  1660. );
  1661. static const UINT g_nMsgTearOff;
  1662. static const UINT g_nMsgCustomFloatPos;
  1663. enum TEAROFFNOTIFICATONTYPE
  1664. {
  1665. __ETONT_BEGIN  = 0,
  1666. __ETONT_UPDATE = 1,
  1667. __ETONT_FINISH = 2,
  1668. };
  1669. class __PROF_UIS_API TEAROFFNOTIFICATON : public CExtHookSink
  1670. {
  1671. public:
  1672. HWND m_hWndTearOff, m_hWndHelperPopup, m_hWndHelperFloat;
  1673. CExtPopupMenuWnd * m_pPopup;
  1674. CExtControlBar * m_pHelperTearOffBar;
  1675. CPoint m_ptScreenStartPos;
  1676. CSize m_sizeTearOffArea;
  1677. CRect m_rcHelperScreenStartArea, m_rcCustomFloatPos;
  1678. bool m_bHelperMenuAreasUpdated:1,
  1679. m_bHelperForceFloatInvisible:1,
  1680. m_bCanceled:1, m_bFinished:1;
  1681. static TEAROFFNOTIFICATON * g_pCurrentTEAROFFNOTIFICATON;
  1682. TEAROFFNOTIFICATONTYPE m_eTONT;
  1683. TEAROFFNOTIFICATON(
  1684. CExtPopupMenuWnd * pPopup,
  1685. const POINT & ptScreenStartPos
  1686. );
  1687. ~TEAROFFNOTIFICATON();
  1688. virtual bool Notify();
  1689. virtual bool DoDefaultTearOff();
  1690. virtual void DoStep(
  1691. bool bFinalStep = false
  1692. );
  1693. virtual bool PtInTearOffArea( const POINT & ptScreen ) const;
  1694. operator WPARAM() const;
  1695. static TEAROFFNOTIFICATON * FromWPARAM( WPARAM wParam );
  1696. virtual bool _OnMouseWheel(
  1697. WPARAM wParam,
  1698. LPARAM lParam
  1699. );
  1700. virtual bool _OnMouseMove(
  1701. UINT nFlags,
  1702. CPoint point
  1703. );
  1704. virtual bool _OnMouseClick(
  1705. UINT nFlags,
  1706. CPoint point
  1707. );
  1708. virtual bool _OnKeyDown(
  1709. UINT nChar,
  1710. UINT nRepCnt,
  1711. UINT nFlags
  1712. );
  1713. virtual bool OnHookWndMsg(
  1714. LRESULT & lResult,
  1715. HWND hWndHooked,
  1716. UINT nMessage,
  1717. WPARAM & wParam,
  1718. LPARAM & lParam
  1719. );
  1720. };
  1721. virtual void _DoReCreateShadows();
  1722. virtual bool _IsFloatingAreaInstersectsWithMenu(
  1723. const RECT & rcFloatingArea,
  1724. bool bAnalyzeParents = true
  1725. ) const;
  1726. protected:
  1727. virtual void _DoTearOff();
  1728. virtual void _DoExpand();
  1729. virtual bool _CoolTipIsVisible();
  1730. virtual void _CoolTipHide(
  1731. bool bAdvOperation = true
  1732. );
  1733. virtual CExtPopupMenuTipWnd::e_tip_style_t _CoolTipGetStyle() const;
  1734. CRgn m_rgnWnd;
  1735. CRect m_rcClient;
  1736. public:
  1737. virtual CRect _CalcTrackRect();
  1738. virtual CSize _CalcTrackSize();
  1739. virtual bool _IsPopupWithShadows() const;
  1740. virtual bool _IsPopupWithShadowsDynamic() const;
  1741. virtual bool _IsRibbonMode() const;
  1742. virtual void _AdjustAnimation( e_animation_type_t & eAT );
  1743. virtual bool _IsFadeOutAnimation() const;
  1744. enum next_item_t
  1745. {
  1746. __NI_NOTHING = -100,
  1747. __NI_ANY = -101,
  1748. __NI_NEXT = -102,
  1749. __NI_PREV = -103,
  1750. __NI_ROW_NEXT = -104,
  1751. __NI_ROW_PREV = -105,
  1752. __NI_PAGE_UP = -106,
  1753. __NI_PAGE_DOWN = -107,
  1754. };
  1755. virtual int _GetNextItem(
  1756. next_item_t nit
  1757. );
  1758. public:
  1759. /////////////////////////////////////////////////////////////////////////////
  1760. // CExtPopupMenuWnd::CInPlaceEditWnd
  1761. class CInPlaceEditWnd;
  1762. typedef
  1763. bool (*pCbInplaceEditWndProc)(
  1764. LRESULT & lResult,
  1765. UINT message,
  1766. WPARAM wParam,
  1767. LPARAM lParam,
  1768. CInPlaceEditWnd & wndEdit,
  1769. LPVOID pCookie
  1770. );
  1771. typedef
  1772. bool (*pCbVerifyTextInput)(
  1773. CInPlaceEditWnd & wndEdit,
  1774. LPVOID pCookie,
  1775. __EXT_MFC_SAFE_LPCTSTR sTextOld,
  1776. __EXT_MFC_SAFE_LPCTSTR sTextNew
  1777. );
  1778. typedef
  1779. void (*pCbPutTextInputResult)(
  1780. CInPlaceEditWnd & wndEdit,
  1781. LPVOID pCookie,
  1782. __EXT_MFC_SAFE_LPCTSTR sTextNew
  1783. );
  1784. class __PROF_UIS_API CInPlaceEditWnd : public CEdit
  1785. {
  1786. pCbVerifyTextInput m_pCbVerifyTextInput;
  1787. pCbPutTextInputResult m_pCbPutTextInputResult;
  1788. pCbInplaceEditWndProc m_pCbWndProc;
  1789. LPVOID m_pCbCookie;
  1790. CExtSafeString * m_pStr;
  1791. CExtSafeString m_sTextSaved;
  1792. bool m_bNoCancelAtKillFocus:1;
  1793. public:
  1794. static const UINT g_nMsgDeleteSelection;
  1795. static const UINT g_nMsgSelectAll;
  1796. CInPlaceEditWnd(
  1797. CExtSafeString * pStr,
  1798. pCbVerifyTextInput pCbVerify = NULL,
  1799. pCbPutTextInputResult pCbResult = NULL,
  1800. pCbInplaceEditWndProc pCbWndProc = NULL,
  1801. LPVOID pCbCookie = NULL
  1802. );
  1803. ~CInPlaceEditWnd();
  1804. #ifdef _DEBUG
  1805. virtual void AssertValid() const;
  1806. #endif // _DEBUG
  1807. virtual bool Create(
  1808. CExtPopupMenuWnd * pPopup,
  1809. CRect rc,
  1810. UINT nDlgCtrlID
  1811. );
  1812. virtual LRESULT WindowProc(
  1813. UINT message,
  1814. WPARAM wParam,
  1815. LPARAM lParam
  1816. );
  1817. protected:
  1818. virtual void PostNcDestroy();
  1819. CExtPopupMenuWnd * GetPopupMenu();
  1820. }; // class CInPlaceEditWnd
  1821. /////////////////////////////////////////////////////////////////////////////
  1822. // CExtPopupMenuWnd::MENUITEMDATA
  1823. class MENUITEMDATA;
  1824. friend class MENUITEMDATA;
  1825. class CExtPopupMenuCmdUI;
  1826. struct __PROF_UIS_API INPLACEEDITCREATEINFO
  1827. {
  1828. CWnd ** m_ppInplaceEdit;
  1829. CExtPopupMenuWnd * m_pPopup;
  1830. MENUITEMDATA * m_pMenuItemData;
  1831. CExtSafeString * m_pInplaceEditStr;
  1832. pCbVerifyTextInput m_pCbVerifyTextInput;
  1833. pCbPutTextInputResult m_pCbPutTextInputResult;
  1834. pCbInplaceEditWndProc m_pInplaceEditCbWndProc;
  1835. LPVOID m_pInplaceEditCbCookie;
  1836. CRect m_rc;
  1837. INPLACEEDITCREATEINFO(
  1838. CWnd ** ppInplaceEdit,
  1839. CExtPopupMenuWnd * pPopup,
  1840. MENUITEMDATA * pMenuItemData,
  1841. CExtSafeString * pInplaceEditStr,
  1842. pCbVerifyTextInput pCbVerify,
  1843. pCbPutTextInputResult pCbResult,
  1844. pCbInplaceEditWndProc pInplaceEditCbWndProc,
  1845. LPVOID pInplaceEditCbCookie,
  1846. const RECT & rc
  1847. )
  1848. : m_ppInplaceEdit( ppInplaceEdit )
  1849. , m_pPopup( pPopup )
  1850. , m_pMenuItemData( pMenuItemData )
  1851. , m_pInplaceEditStr( pInplaceEditStr )
  1852. , m_pCbVerifyTextInput( pCbVerify )
  1853. , m_pCbPutTextInputResult( pCbResult )
  1854. , m_pInplaceEditCbWndProc( pInplaceEditCbWndProc )
  1855. , m_pInplaceEditCbCookie( pInplaceEditCbCookie )
  1856. , m_rc( rc )
  1857. {
  1858. }
  1859. }; // struct INPLACEEDITCREATEINFO
  1860. class __PROF_UIS_API MENUITEMDATA
  1861. {
  1862. public:
  1863. typedef bool (*pCbItemClick)(
  1864. CExtPopupMenuWnd * pPopup,
  1865. MENUITEMDATA * pItemData
  1866. );
  1867. protected:
  1868. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1869. CExtCustomizeCmdTreeNode * m_pCmdNode;
  1870. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1871. CExtPopupMenuWnd * m_pWndChild;
  1872. int m_nItemIndex;
  1873. UINT m_nCmdID; // can be ID_SEPARATOR
  1874. CExtSafeString m_sItemText, m_sAccelText,
  1875. m_sCustomTipText, m_sExtendedText;
  1876. CExtCmdIcon m_iconPopup;
  1877. CSize m_sizeItem;
  1878. CRect m_rcCacheBasic, m_rcCacheIndents;
  1879. INT m_nIconAreaWidth;
  1880. INT m_nMarginLeft, m_nMarginTop, m_nMarginRight, m_nMarginBottom;
  1881. bool m_bSelected:1, m_bDisplayed:1, m_bForceDisplayed:1,
  1882. m_bChildCombine:1, m_bToolButton:1, m_bToolWrap:1, m_bBold:1,
  1883. m_bForcePopupDisabled:1, m_bForceEnabled:1, m_bForceNoLeftGradient:1,
  1884. m_bEnabledAppearance:1, m_bBigAccent:1,
  1885. m_bCheck:1, m_bRadio:1, m_bEnabled: 1,m_bIndeterminate:1,
  1886. m_bXtraChecked:1, m_bNoCmdUI:1, m_bIconMode:1, m_bDefault:1;
  1887. pCbItemClick m_pCbCmdDeliver;
  1888. pCbItemClick m_pCbXtraMarkState;
  1889. /*__EXT_MFC_SAFE_TCHAR*/ INT m_cAccelChar;
  1890. HWND m_hWndSpecCmdReceiver;
  1891. CWnd * m_pHelperInplaceEditWnd;
  1892. CExtSafeString * m_pInplaceEditStr;
  1893. pCbVerifyTextInput m_pCbVerifyTextInput;
  1894. pCbPutTextInputResult m_pCbPutTextInputResult;
  1895. pCbInplaceEditWndProc m_pInplaceEditCbWndProc;
  1896. LPVOID m_pInplaceEditCbCookie;
  1897. int m_nInplaceEditWidth;
  1898. bool m_bAllowInplaceEditActivation:1;
  1899. bool m_bTempSelTextValid:1;
  1900. CExtSafeString m_sTempSelText;
  1901. LPARAM m_nLParam;
  1902. CExtPopupMenuWnd * m_pOwner;
  1903. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1904. CExtPopupKeyTipWnd * m_pWndKeyTipBasic, * m_pWndKeyTipDD;
  1905. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1906. public:
  1907. MENUITEMDATA(
  1908. CExtPopupMenuWnd * pOwner = NULL
  1909. );
  1910. MENUITEMDATA( const MENUITEMDATA & other );
  1911. ~MENUITEMDATA();
  1912. MENUITEMDATA & operator = ( const MENUITEMDATA & other );
  1913. private:
  1914. void AssignFromOther( const MENUITEMDATA & other );
  1915. public:
  1916. CExtPopupMenuWnd * GetOwner();
  1917. const CExtPopupMenuWnd * GetOwner() const;
  1918. void SetOwner( CExtPopupMenuWnd * pOwner );
  1919. bool UpdateFromMenu(
  1920. HWND hWndCmdRecv,
  1921. CMenu * pTrackMenu,
  1922. int nItemIndex,
  1923. bool bNoRefToCmdMngr = false
  1924. );
  1925. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1926. bool UpdateFromCmdTree(
  1927. HWND hWndCmdRecv,
  1928. CExtCustomizeCmdTreeNode * pNode,
  1929. int nItemIndex,
  1930. CExtPopupMenuWnd * pPopupParent = NULL
  1931. );
  1932. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1933. public:
  1934. void AccelCharInit();
  1935. __EXT_MFC_SAFE_TCHAR AccelCharGet() const;
  1936. bool AccelCharIsSet() const;
  1937. protected:
  1938. bool UpdateCmdManagerCommand(
  1939. CExtCmdItem * pCmdItem,
  1940. int nItemIndex
  1941. );
  1942. public:
  1943. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1944. CExtCustomizeCmdKeyTip * KeyTipGetInfo(
  1945. bool bBasic
  1946. );
  1947. CExtSafeString KeyTipGetText(
  1948. INT nIndent,
  1949. bool bBasic
  1950. );
  1951. CWnd * KeyTipGetParentWnd();
  1952. CPoint KeyTipGetGuideLines(
  1953. bool bBasic
  1954. );
  1955.   CExtPopupKeyTipWnd * KeyTipGetWnd(
  1956. bool bBasic
  1957. );
  1958. void KeyTipTrackingQuery(
  1959. bool bShow,
  1960. CExtCustomizeCmdKeyTip * pKeyTipChain,
  1961. HDWP & hPassiveModeDWP
  1962. );
  1963. bool KeyTipTranslate(
  1964. DWORD dwKeyCode,
  1965. CExtCustomizeCmdKeyTip * pKeyTipChain
  1966. );
  1967. void KeyTipDisplay(
  1968. CExtCustomizeCmdKeyTip & keyTipChain
  1969. );
  1970. bool KeyTipInvokeAction(
  1971. bool bBasic
  1972. );
  1973. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1974. void MeasureItem(
  1975. CExtPaintManager * pPM
  1976. );
  1977. CExtCmdItem * GetCmd() const;
  1978. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1979. CExtCustomizeCmdTreeNode * GetCmdNode();
  1980. const CExtCustomizeCmdTreeNode * GetCmdNode() const
  1981. {
  1982. return
  1983. ( const_cast < MENUITEMDATA * > ( this ) )
  1984. -> GetCmdNode();
  1985. }
  1986. void SetCmdNode( CExtCustomizeCmdTreeNode * pNode );
  1987. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1988. HWND GetCmdReceiver() const
  1989. {
  1990. ASSERT( m_hWndSpecCmdReceiver != NULL );
  1991. ASSERT( ::IsWindow(m_hWndSpecCmdReceiver) );
  1992. return m_hWndSpecCmdReceiver;
  1993. }
  1994. void SetCmdReceiver( HWND hWndSpecCmdReceiver )
  1995. {
  1996. ASSERT( hWndSpecCmdReceiver != NULL );
  1997. ASSERT( ::IsWindow(hWndSpecCmdReceiver) );
  1998. m_hWndSpecCmdReceiver = hWndSpecCmdReceiver;
  1999. }
  2000. void SetDisplayed( bool bDisplayed )
  2001. {
  2002. m_bDisplayed = bDisplayed;
  2003. }
  2004. void SetForceDisplayed( bool bForceDisplayed )
  2005. {
  2006. m_bForceDisplayed = bForceDisplayed;
  2007. }
  2008. public:
  2009. void SetOuterMargins(
  2010. INT nMarginLeft = -1,
  2011. INT nMarginTop = -1,
  2012. INT nMarginRight = -1,
  2013. INT nMarginBottom = -1
  2014. );
  2015. void SetOuterMargins(
  2016. const RECT & rcMargins
  2017. );
  2018. void GetOuterMargins(
  2019. INT * p_nMarginLeft = NULL,
  2020. INT * p_nMarginTop = NULL,
  2021. INT * p_nMarginRight = NULL,
  2022. INT * p_nMarginBottom = NULL
  2023. ) const;
  2024. void GetOuterMargins(
  2025. RECT & rcMargins
  2026. ) const;
  2027. CRect GetOuterMargins() const;
  2028. bool IsDisplayed() const
  2029. {
  2030. return m_bDisplayed || m_bForceDisplayed;
  2031. }
  2032. bool IsForceDisplayed()
  2033. {
  2034. return m_bForceDisplayed;
  2035. }
  2036. bool IsAllItemsRarelyUsed() const
  2037. {
  2038. ASSERT( IsPopup() );
  2039. ASSERT( m_pWndChild != NULL );
  2040. if( IsNoCmdUI() )
  2041. return false;
  2042. return m_pWndChild->IsAllItemsRarelyUsed();
  2043. }
  2044. bool IsForcePopupDisabled() const
  2045. {
  2046. return m_bForcePopupDisabled;
  2047. }
  2048. void SetForcePopupDisabled( bool bForcePopupDisabled = true )
  2049. {
  2050. if( (m_bForcePopupDisabled && bForcePopupDisabled)
  2051. || ((!m_bForcePopupDisabled) && (!bForcePopupDisabled))
  2052. )
  2053. return;
  2054. m_bForcePopupDisabled = bForcePopupDisabled;
  2055. }
  2056. bool IsEnabled() const
  2057. {
  2058. //if( IsPopup() && GetCmd() == NULL )
  2059. // return true;
  2060. if( IsPopup() )
  2061. {
  2062. if( IsForcePopupDisabled() )
  2063. return false;
  2064. if( GetCmd() == NULL )
  2065. return true;
  2066. }
  2067. if( IsSeparator() )
  2068. return false;
  2069. if( IsForceEnabled() )
  2070. return true;
  2071. return m_bEnabled;
  2072. }
  2073. bool Enable( bool bOn )
  2074. {
  2075. // if( IsPopup() )
  2076. // return true;
  2077. if( IsSeparator() )
  2078. return false;
  2079. bool bRetVal = m_bEnabled;
  2080. m_bEnabled = bOn;
  2081. return bRetVal;
  2082. }
  2083. bool IsIndeterminated() const
  2084. {
  2085. if( IsPopup() || IsSeparator() )
  2086. return false;
  2087. return m_bIndeterminate;
  2088. }
  2089. bool Indeterminate( bool bOn )
  2090. {
  2091. bool bRetVal = m_bIndeterminate;
  2092. m_bIndeterminate = bOn;
  2093. return bRetVal;
  2094. }
  2095. bool IsSelected() const
  2096. {
  2097. if( /*IsPopup() ||*/ IsSeparator() )
  2098. return false;
  2099. return m_bSelected;
  2100. }
  2101. void SetSelected( bool bOn = true )
  2102. {
  2103. m_bSelected = bOn;
  2104. }
  2105. public:
  2106. bool GetRadio() const
  2107. {
  2108. if( /*IsPopup() ||*/ IsSeparator() )
  2109. return false;
  2110. return m_bRadio;
  2111. }
  2112. bool Radio( bool bOn )
  2113. {
  2114. bool bRetVal = m_bRadio;
  2115. m_bRadio = bOn;
  2116. return bRetVal;
  2117. }
  2118. bool GetCheck() const
  2119. {
  2120. if( /*IsPopup() ||*/ IsSeparator() )
  2121. return false;
  2122. return m_bCheck;
  2123. }
  2124. bool Check( bool bOn )
  2125. {
  2126. bool bRetVal = m_bCheck;
  2127. m_bCheck = bOn;
  2128. return bRetVal;
  2129. }
  2130. pCbItemClick GetCmdDeliverCb() const
  2131. {
  2132. if( IsSeparator() )
  2133. return NULL;
  2134. return (pCbItemClick)m_pCbCmdDeliver;
  2135. }
  2136. void SetCmdDeliverCb( pCbItemClick pCb )
  2137. {
  2138. if( IsSeparator() )
  2139. return;
  2140. m_pCbCmdDeliver = pCb;
  2141. }
  2142. bool IsExtraMark() const
  2143. {
  2144. if( IsSeparator() )
  2145. return false;
  2146. return (m_pCbXtraMarkState != NULL) ? true : false;
  2147. }
  2148. pCbItemClick GetExtraMarkCallback() const
  2149. {
  2150. return (pCbItemClick)m_pCbXtraMarkState;
  2151. }
  2152. void SetExtraMark( pCbItemClick pCb )
  2153. {
  2154. if( IsSeparator() )
  2155. return;
  2156. m_pCbXtraMarkState = pCb;
  2157. }
  2158. bool IsExtraChecked() const
  2159. {
  2160. if( !IsExtraMark() )
  2161. return false;
  2162. return m_bXtraChecked;
  2163. }
  2164. void SetExtraChecked( bool bOn )
  2165. {
  2166. if( !IsExtraMark() )
  2167. return;
  2168. m_bXtraChecked = bOn;
  2169. }
  2170. bool IsNoCmdUI() const
  2171. {
  2172. return m_bNoCmdUI;
  2173. }
  2174. void SetNoCmdUI( bool bOn )
  2175. {
  2176. m_bNoCmdUI = bOn;
  2177. }
  2178. bool IsIconMode() const
  2179. {
  2180. return m_bIconMode;
  2181. }
  2182. void SetIconMode( bool bOn )
  2183. {
  2184. m_bIconMode = bOn;
  2185. }
  2186. LPARAM LParamGet() const
  2187. {
  2188. return m_nLParam;
  2189. }
  2190. void LParamSet( LPARAM nLParam )
  2191. {
  2192. m_nLParam = nLParam;
  2193. }
  2194. __EXT_MFC_SAFE_LPCTSTR GetText() const;
  2195. void SetText( __EXT_MFC_SAFE_LPCTSTR strText );
  2196. __EXT_MFC_SAFE_LPCTSTR GetAccelText() const;
  2197. void SetAccelText( __EXT_MFC_SAFE_LPCTSTR strText );
  2198. CExtCmdIcon * GetIconPtr();
  2199. const CExtCmdIcon * GetIconPtr() const;
  2200. CExtCmdIcon & GetIcon();
  2201. const CExtCmdIcon & GetIcon() const;
  2202. void SetCustomTip( __EXT_MFC_SAFE_LPCTSTR sTip );
  2203. __EXT_MFC_SAFE_LPCTSTR GetCustomTip() const;
  2204. void GetTip( CExtSafeString & sTip ) const;
  2205. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2206. bool InitSceenTip( CExtPopupScreenTipWnd & _wndScreenTip );
  2207. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2208. void SetExtendedText( __EXT_MFC_SAFE_LPCTSTR sExtendedText );
  2209. __EXT_MFC_SAFE_LPCTSTR GetExtendedText() const;
  2210. bool IsSeparator() const
  2211. {
  2212. bool bSeparator =
  2213. (m_nCmdID==TYPE_SEPARATOR) ? true : false;
  2214. return bSeparator;
  2215. }
  2216. bool IsChildCombine() const
  2217. {
  2218. return m_bChildCombine;
  2219. }
  2220. void SetChildCombine( bool bChildCombine = true )
  2221. {
  2222. m_bChildCombine = bChildCombine;
  2223. }
  2224. bool IsToolButton() const
  2225. {
  2226. return m_bToolButton;
  2227. }
  2228. void SetToolButton( bool bToolButton = true )
  2229. {
  2230. if( (m_bToolButton && bToolButton)
  2231. || ((!m_bToolButton) && (!bToolButton))
  2232. )
  2233. return;
  2234. m_bToolButton = bToolButton;
  2235. MeasureItem( NULL );
  2236. }
  2237. bool IsToolWrap() const
  2238. {
  2239. return m_bToolWrap;
  2240. }
  2241. void SetToolWrap( bool bToolWrap = true )
  2242. {
  2243. m_bToolWrap = bToolWrap;
  2244. }
  2245. bool IsBold() const
  2246. {
  2247. return m_bBold;
  2248. }
  2249. void SetBold( bool bBold = true )
  2250. {
  2251. if( m_bBold == bBold )
  2252. return;
  2253. m_bBold = bBold;
  2254. MeasureItem( NULL );
  2255. }
  2256. bool IsDefault() const
  2257. {
  2258. return m_bDefault;
  2259. }
  2260. void SetDefault( bool bDefault = true )
  2261. {
  2262. m_bDefault = bDefault;
  2263. }
  2264. bool IsEnabledAppearance() const
  2265. {
  2266. return m_bEnabledAppearance;
  2267. }
  2268. void SetEnabledAppearance( bool bEnabledAppearance = true )
  2269. {
  2270. m_bEnabledAppearance = bEnabledAppearance;
  2271. }
  2272. bool IsBigAccent() const
  2273. {
  2274. return m_bBigAccent;
  2275. }
  2276. void SetBigAccent( bool bBigAccent = true )
  2277. {
  2278. m_bBigAccent = bBigAccent;
  2279. }
  2280. bool IsForceEnabled() const
  2281. {
  2282. return m_bForceEnabled;
  2283. }
  2284. void SetForceEnabled( bool bForceEnabled = true )
  2285. {
  2286. if( (m_bForceEnabled && bForceEnabled)
  2287. || ((!m_bForceEnabled) && (!bForceEnabled))
  2288. )
  2289. return;
  2290. m_bForceEnabled = bForceEnabled;
  2291. }
  2292. bool IsForceNoLeftGradient() const
  2293. {
  2294. return m_bForceNoLeftGradient;
  2295. }
  2296. void SetForceNoLeftGradient( bool bForceNoLeftGradient = true )
  2297. {
  2298. if( (m_bForceNoLeftGradient && bForceNoLeftGradient)
  2299. || ((!m_bForceNoLeftGradient) && (!bForceNoLeftGradient))
  2300. )
  2301. return;
  2302. m_bForceNoLeftGradient = bForceNoLeftGradient;
  2303. MeasureItem( NULL );
  2304. }
  2305. bool IsInplaceEdit() const
  2306. {
  2307. return (m_pInplaceEditStr != NULL) ? true : false;
  2308. }
  2309. void SetInplaceEdit(
  2310. CExtSafeString * pInplaceEditStr,
  2311. pCbVerifyTextInput pCbVerify = NULL,
  2312. pCbPutTextInputResult pCbResult = NULL,
  2313. pCbInplaceEditWndProc pInplaceEditCbWndProc = NULL,
  2314. LPVOID pInplaceEditCbCookie = NULL,
  2315. int nInplaceEditWidth = __EXT_MENU_DEF_INPLACE_EDIT_WIDTH
  2316. )
  2317. {
  2318. ASSERT( pInplaceEditStr != NULL );
  2319. ASSERT( nInplaceEditWidth > 0 );
  2320. m_pInplaceEditStr = pInplaceEditStr;
  2321. m_pCbVerifyTextInput = pCbVerify;
  2322. m_pCbPutTextInputResult = pCbResult;
  2323. m_pInplaceEditCbWndProc = pInplaceEditCbWndProc;
  2324. m_pInplaceEditCbCookie = pInplaceEditCbCookie;
  2325. m_nInplaceEditWidth = nInplaceEditWidth;
  2326. MeasureItem( NULL );
  2327. }
  2328. void ResetActiveInplaceEditPtr()
  2329. {
  2330. m_pHelperInplaceEditWnd = NULL;
  2331. }
  2332. CWnd * GetInplaceEditPtr()
  2333. {
  2334. if( !IsInplaceEdit() )
  2335. return NULL;
  2336. return m_pHelperInplaceEditWnd;
  2337. }
  2338. int GetInplaceEditWidth() const
  2339. {
  2340. if( !IsInplaceEdit() )
  2341. return 0;
  2342. ASSERT( m_nInplaceEditWidth > 0 );
  2343. return m_nInplaceEditWidth;
  2344. }
  2345. bool IsAllowInplaceEditActivation() const
  2346. {
  2347. if( !IsInplaceEdit() )
  2348. return false;
  2349. return m_bAllowInplaceEditActivation;
  2350. }
  2351. void AllowInplaceEditActivation(
  2352. bool bAllowInplaceEditActivation
  2353. )
  2354. {
  2355. m_bAllowInplaceEditActivation = bAllowInplaceEditActivation;
  2356. }
  2357. CExtSafeString GetInplaceEditText() const
  2358. {
  2359. CExtSafeString s( _T("") );
  2360. if( IsInplaceEdit()
  2361. && m_pInplaceEditStr != NULL
  2362. )
  2363. {
  2364. if( m_bTempSelTextValid )
  2365. s = m_sTempSelText;
  2366. else
  2367. s = *m_pInplaceEditStr;
  2368. }
  2369. return s;
  2370. }
  2371. void SetTempSelectedInplaceEditText(
  2372. __EXT_MFC_SAFE_LPCTSTR sTempSelText = NULL // NULL - reset
  2373. )
  2374. {
  2375. m_bTempSelTextValid = false;
  2376. m_sTempSelText.Empty();
  2377. if( (!IsInplaceEdit())
  2378. || sTempSelText == NULL
  2379. )
  2380. return;
  2381. m_bTempSelTextValid = true;
  2382. m_sTempSelText = sTempSelText;
  2383. }
  2384. bool CreateInplaceEdit(
  2385. CExtPopupMenuWnd * pPopup,
  2386. CRect rc
  2387. )
  2388. {
  2389. if( m_pInplaceEditStr == NULL )
  2390. {
  2391. ASSERT( FALSE );
  2392. return false;
  2393. }
  2394. m_pHelperInplaceEditWnd = NULL;
  2395. HWND hWndCmdReceiver = GetCmdReceiver();
  2396. if( hWndCmdReceiver != NULL
  2397. && ::IsWindow( hWndCmdReceiver )
  2398. )
  2399. {
  2400. CExtPopupMenuWnd::INPLACEEDITCREATEINFO _ieci(
  2401. &m_pHelperInplaceEditWnd,
  2402. pPopup,
  2403. this,
  2404. m_pInplaceEditStr,
  2405. m_pCbVerifyTextInput,
  2406. m_pCbPutTextInputResult,
  2407. m_pInplaceEditCbWndProc,
  2408. m_pInplaceEditCbCookie,
  2409. rc
  2410. );
  2411. ::SendMessage(
  2412. hWndCmdReceiver,
  2413. CExtPopupBaseWnd::g_nMsgCreateInplaceEdit,
  2414. (WPARAM)(&_ieci),
  2415. (LPARAM)0L
  2416. );
  2417. }
  2418. if( m_pHelperInplaceEditWnd == NULL )
  2419. {
  2420. m_pHelperInplaceEditWnd =
  2421. new CInPlaceEditWnd(
  2422. m_pInplaceEditStr,
  2423. m_pCbVerifyTextInput,
  2424. m_pCbPutTextInputResult,
  2425. m_pInplaceEditCbWndProc,
  2426. m_pInplaceEditCbCookie
  2427. );
  2428. if( !((CInPlaceEditWnd*)m_pHelperInplaceEditWnd)->
  2429. Create( pPopup, rc, GetCmdID() ) )
  2430. {
  2431. ASSERT( FALSE );
  2432. delete m_pHelperInplaceEditWnd;
  2433. m_pHelperInplaceEditWnd = NULL;
  2434. return false;
  2435. }
  2436. } // if( m_pHelperInplaceEditWnd == NULL )
  2437. #ifdef _DEBUG
  2438. else
  2439. {
  2440. ASSERT(
  2441. m_pHelperInplaceEditWnd->GetSafeHwnd() != NULL
  2442. && ::IsWindow( m_pHelperInplaceEditWnd->GetSafeHwnd() )
  2443. );
  2444. } // else from if( m_pHelperInplaceEditWnd == NULL )
  2445. #endif // _DEBUG
  2446. return true;
  2447. }
  2448. CRect AdjustInplaceEditRect(
  2449. const RECT & rcItem,
  2450. bool bRTL
  2451. ) const;
  2452. protected:
  2453. void SetSeparator(
  2454. int nItemIndex
  2455. )
  2456. {
  2457. if( !IsSeparator() )
  2458. {
  2459. if( m_pWndChild != NULL )
  2460. DestroyPopup();
  2461. ASSERT( m_pWndChild == NULL );
  2462. m_sItemText.Empty();
  2463. m_nCmdID = TYPE_SEPARATOR;
  2464. m_nItemIndex = nItemIndex;
  2465. }
  2466. MeasureItem( NULL );
  2467. }
  2468. void SetPopup(
  2469. int nItemIndex,
  2470. __EXT_MFC_SAFE_LPCTSTR sText = NULL,
  2471. HICON hIcon = NULL,
  2472. CExtPopupMenuWnd * pSpecPopup = NULL
  2473. )
  2474. {
  2475. CExtCmdIcon icon;
  2476. if( hIcon != NULL )
  2477. icon.AssignFromHICON( hIcon, false );
  2478. SetPopup(
  2479. nItemIndex,
  2480. sText,
  2481. icon,
  2482. pSpecPopup
  2483. );
  2484. }
  2485. void SetPopup(
  2486. int nItemIndex,
  2487. __EXT_MFC_SAFE_LPCTSTR sText,
  2488. const CExtCmdIcon & icon,
  2489. CExtPopupMenuWnd * pSpecPopup = NULL
  2490. )
  2491. {
  2492. ASSERT( m_hWndSpecCmdReceiver != NULL );
  2493. ASSERT( ::IsWindow(m_hWndSpecCmdReceiver) );
  2494. if( m_pWndChild == NULL )
  2495. {
  2496. if( pSpecPopup == NULL )
  2497. {
  2498. ConstructPopup();
  2499. } // if( pSpecPopup == NULL )
  2500. else
  2501. {
  2502. m_pWndChild = pSpecPopup;
  2503. ASSERT( m_pWndChild != NULL );
  2504. m_pWndChild->m_hWndCmdReceiver = m_hWndSpecCmdReceiver;
  2505. } // else from if( pSpecPopup == NULL )
  2506. }
  2507. m_nCmdID = (UINT)TYPE_POPUP;
  2508. m_sItemText = _T("");
  2509. m_sAccelText = _T("");
  2510. m_nItemIndex = nItemIndex;
  2511. ASSERT( m_iconPopup.IsEmpty() );
  2512. VERIFY( SetPopupIcon( icon ) );
  2513. VERIFY( SetPopupText(sText) );
  2514. MeasureItem( NULL );
  2515. }
  2516. public:
  2517. void SetSpecPopup(
  2518. CExtPopupMenuWnd * pSpecPopup
  2519. )
  2520. {
  2521. ASSERT_VALID( pSpecPopup );
  2522. m_nCmdID = (UINT)TYPE_POPUP;
  2523. m_pWndChild = pSpecPopup;
  2524. m_pWndChild->m_hWndCmdReceiver = m_hWndSpecCmdReceiver;
  2525. }
  2526. bool SetPopupIcon( HICON hIcon, bool bCopyIcon = true )
  2527. {
  2528. if( ! ( IsPopup() || IsNoCmdUI() ) )
  2529. {
  2530. ASSERT( FALSE );
  2531. return false;
  2532. }
  2533. if( hIcon == NULL )
  2534. {
  2535. m_iconPopup.Empty();
  2536. return true;
  2537. }
  2538. m_iconPopup.AssignFromHICON( hIcon, bCopyIcon );
  2539. return true;
  2540. }
  2541. bool SetPopupIcon( const CExtCmdIcon & icon )
  2542. {
  2543. if( ! ( IsPopup() || IsNoCmdUI() ) )
  2544. {
  2545. ASSERT( FALSE );
  2546. return false;
  2547. }
  2548. if( icon.IsEmpty() )
  2549. {
  2550. m_iconPopup.Empty();
  2551. return true;
  2552. }
  2553. m_iconPopup = icon;
  2554. return true;
  2555. }
  2556. CExtCmdIcon & GetPopupIcon()
  2557. {
  2558. return m_iconPopup;
  2559. }
  2560. const CExtCmdIcon & GetPopupIcon() const
  2561. {
  2562. return m_iconPopup;
  2563. }
  2564. bool SetPopupText( __EXT_MFC_SAFE_LPCTSTR strText );
  2565. bool SetPopupAccelText( __EXT_MFC_SAFE_LPCTSTR strText ); // NULL if empty
  2566. protected:
  2567. bool ConstructPopup();
  2568. void DestroyPopup();
  2569. public:
  2570. CExtPopupMenuWnd * GetPopup()
  2571. {
  2572. ASSERT( this != NULL );
  2573. return m_pWndChild;
  2574. }
  2575. const CExtPopupMenuWnd * GetPopup() const
  2576. {
  2577. ASSERT( this != NULL );
  2578. return m_pWndChild;
  2579. }
  2580. bool IsPopup() const
  2581. {
  2582. return ( m_nCmdID == TYPE_POPUP ) ? true : false;
  2583. }
  2584. UINT GetCmdID() const;
  2585. UINT SetCmdID( UINT nCmdID );
  2586. bool IsExecutableCmdID() const;
  2587. int GetMeasuredHeight();
  2588. int GetMeasuredWidth();
  2589. int GetIconAreaWidth() const
  2590. {
  2591. return m_nIconAreaWidth;
  2592. }
  2593. void UpdateIconAreaWidth(
  2594. INT nIconAreaWidthLager
  2595. )
  2596. {
  2597. if( IsToolButton() )
  2598. return;
  2599. if( nIconAreaWidthLager <= m_nIconAreaWidth )
  2600. return;
  2601. if( !IsSeparator() )
  2602. m_sizeItem.cx +=
  2603. nIconAreaWidthLager - m_nIconAreaWidth;
  2604. m_nIconAreaWidth = nIconAreaWidthLager;
  2605. }
  2606. CRect GetBaseRect() const
  2607. {
  2608. CRect rcItem(
  2609. CPoint(0,0),
  2610. m_sizeItem
  2611. );
  2612. return rcItem;
  2613. }
  2614. CRect GetCachedRect(
  2615. bool bIncludeIndents
  2616. ) const
  2617. {
  2618. return bIncludeIndents ? m_rcCacheBasic : m_rcCacheIndents;
  2619. }
  2620. void CacheRect(
  2621. const RECT & rcCache,
  2622. bool bIncludeIndents
  2623. )
  2624. {
  2625. if( bIncludeIndents )
  2626. m_rcCacheBasic = rcCache;
  2627. else
  2628. m_rcCacheIndents = rcCache;
  2629. }
  2630. void CacheRectsEmpty()
  2631. {
  2632. m_rcCacheBasic.SetRect( 0, 0, 0, 0 );
  2633. m_rcCacheIndents.SetRect( 0, 0, 0, 0 );
  2634. }
  2635. int GetIndex() const
  2636. {
  2637. return m_nItemIndex;
  2638. }
  2639. void SetIndex( int nItemIndex )
  2640. {
  2641. m_nItemIndex = nItemIndex;
  2642. }
  2643. protected:
  2644. friend class CExtPopupMenuWnd;
  2645. friend class CExtPopupMenuCmdUI;
  2646. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2647. #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  2648. static bool stat_CbVerifyTextInput(
  2649. CInPlaceEditWnd & wndEdit,
  2650. CExtCustomizeCmdTreeNode * pNode,
  2651. __EXT_MFC_SAFE_LPCTSTR sTextOld,
  2652. __EXT_MFC_SAFE_LPCTSTR sTextNew
  2653. );
  2654. static void stat_CbPutTextInputResult(
  2655. CInPlaceEditWnd & wndEdit,
  2656. CExtCustomizeCmdTreeNode * pNode,
  2657. __EXT_MFC_SAFE_LPCTSTR sTextNew
  2658. );
  2659. static bool stat_CbInplaceEditWndProc(
  2660. LRESULT & lResult,
  2661. UINT message,
  2662. WPARAM wParam,
  2663. LPARAM lParam,
  2664. CEdit & wndEdit,
  2665. CExtCustomizeCmdTreeNode * pNode
  2666. );
  2667. static bool stat_CbInitListBoxContent(
  2668. CExtPopupInplaceListBox & wndListBox,
  2669. CExtCustomizeCmdTreeNode * pNode
  2670. );
  2671. static bool stat_CbListBoxSelection(
  2672. CExtPopupInplaceListBox & wndListBox,
  2673. CExtCustomizeCmdTreeNode * pNode,
  2674. int eSAT // CExtPopupInplaceListBox::e_sel_action_t
  2675. );
  2676. static bool stat_CbListBoxItemDraw(
  2677. CExtPopupInplaceListBox & wndListBox,
  2678. CExtCustomizeCmdTreeNode * pNode,
  2679. LPDRAWITEMSTRUCT pDIS
  2680. );
  2681. static bool stat_CbListBoxItemMeasure(
  2682. CExtPopupInplaceListBox & wndListBox,
  2683. CExtCustomizeCmdTreeNode * pNode,
  2684. LPMEASUREITEMSTRUCT pMIS
  2685. );
  2686. #ifndef __EXT_MFC_NO_BUILTIN_DATEFIELD
  2687. static bool stat_CbInitDatePickerContent(
  2688. CExtDatePickerWnd & wndDatePicker,
  2689. CExtCustomizeCmdTreeNode * pNode
  2690. );
  2691. static bool stat_CbDatePickerSelection(
  2692. LPVOID pSelectionNotification,
  2693. CExtCustomizeCmdTreeNode * pNode
  2694. );
  2695. #endif // __EXT_MFC_NO_BUILTIN_DATEFIELD
  2696. #ifndef __EXT_MFC_NO_UNDO_REDO_POPUP
  2697. static bool stat_CbFormatCaption(
  2698. CExtSafeString & strCaption,
  2699. CExtPopupUndoRedoMenuWnd * pUndoRedoPopupMenuWnd,
  2700. CExtCustomizeCmdTreeNode * pNode
  2701. );
  2702. #endif // __EXT_MFC_NO_UNDO_REDO_POPUP
  2703. #endif // (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  2704. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2705. }; // class MENUITEMDATA
  2706. CExtPopupMenuWnd::MENUITEMDATA & ItemGetInfo( INT nPos );
  2707. const CExtPopupMenuWnd::MENUITEMDATA & ItemGetInfo( INT nPos ) const;
  2708. INT ItemGetIndexOf(
  2709. const CExtPopupMenuWnd::MENUITEMDATA * pMII
  2710. ) const;
  2711. /////////////////////////////////////////////////////////////////////////////
  2712. // CExtPopupMenuWnd::DRAWITEMDATA
  2713. struct DRAWITEMDATA;
  2714. friend struct DRAWITEMDATA;
  2715. struct __PROF_UIS_API DRAWITEMDATA
  2716. {
  2717. CDC * m_pDC;
  2718. LPCRECT m_pRectItem;
  2719. LPCRECT m_pRectItemWithIndents;
  2720. const MENUITEMDATA * m_pItemData;
  2721. CExtPopupMenuWnd * m_pPopup;
  2722. const bool m_bMenuOwnerDrawFixed:1;
  2723. const bool m_bPopupItem:1;
  2724. const bool m_bRarelyUsed:1;
  2725. const bool m_bRarelyUsedPrevious:1;
  2726. const bool m_bRarelyUsedNext:1;
  2727. public:
  2728. DRAWITEMDATA(
  2729. CDC * pDC,
  2730. LPCRECT pRectItem,
  2731. LPCRECT pRectItemWithIndents,
  2732. const MENUITEMDATA * pItemData,
  2733. CExtPopupMenuWnd * pPopup,
  2734. bool bMenuOwnerDrawFixed,
  2735. bool bPopupItem,
  2736. bool bRarelyUsed,
  2737. bool bRarelyUsedPrevious,
  2738. bool bRarelyUsedNext
  2739. )
  2740. : m_pDC( pDC )
  2741. , m_pRectItem( pRectItem )
  2742. , m_pRectItemWithIndents( pRectItemWithIndents )
  2743. , m_pItemData( pItemData )
  2744. , m_pPopup( pPopup )
  2745. , m_bMenuOwnerDrawFixed( bMenuOwnerDrawFixed )
  2746. , m_bPopupItem( bPopupItem )
  2747. , m_bRarelyUsed( bRarelyUsed )
  2748. , m_bRarelyUsedPrevious( bRarelyUsedPrevious )
  2749. , m_bRarelyUsedNext( bRarelyUsedNext )
  2750. {
  2751. ASSERT( m_pDC != NULL );
  2752. ASSERT( m_pDC->GetSafeHdc() != NULL );
  2753. ASSERT( m_pRectItem != NULL );
  2754. ASSERT( m_pRectItemWithIndents != NULL );
  2755. ASSERT( m_pItemData != NULL );
  2756. ASSERT( m_pPopup != NULL );
  2757. }
  2758. operator CDC * ()
  2759. {
  2760. ASSERT( this != NULL );
  2761. ASSERT( m_pDC != NULL );
  2762. ASSERT( m_pDC->GetSafeHdc() != NULL );
  2763. return m_pDC;
  2764. }
  2765. operator LPCRECT()
  2766. {
  2767. ASSERT( this != NULL );
  2768. ASSERT( m_pRectItem != NULL );
  2769. return m_pRectItem;
  2770. }
  2771. operator const MENUITEMDATA * ()
  2772. {
  2773. ASSERT( this != NULL );
  2774. ASSERT( m_pItemData != NULL );
  2775. return m_pItemData;
  2776. }
  2777. operator __EXT_MFC_SAFE_LPCTSTR()
  2778. {
  2779. ASSERT( this != NULL );
  2780. ASSERT( m_pItemData != NULL );
  2781. return m_pItemData->GetText();
  2782. }
  2783. operator CSize()
  2784. {
  2785. ASSERT( this != NULL );
  2786. ASSERT( m_pRectItem != NULL );
  2787. return
  2788. CSize(
  2789. m_pRectItem->right - m_pRectItem->left,
  2790. m_pRectItem->bottom - m_pRectItem->top
  2791. );
  2792. }
  2793. operator CExtPopupMenuWnd * ()
  2794. {
  2795. ASSERT( this != NULL );
  2796. ASSERT( m_pPopup != NULL );
  2797. return m_pPopup;
  2798. }
  2799. CExtPopupMenuWnd * operator -> ()
  2800. {
  2801. ASSERT( this != NULL );
  2802. ASSERT( m_pPopup != NULL );
  2803. return m_pPopup;
  2804. }
  2805. operator LPARAM()
  2806. {
  2807. return reinterpret_cast < LPARAM > ( this );
  2808. }
  2809. UINT GetCmdID()
  2810. {
  2811. ASSERT( this != NULL );
  2812. ASSERT( m_pItemData != NULL );
  2813. return m_pItemData->GetCmdID();
  2814. }
  2815. void PaintDefault(
  2816. bool bForceNoIcon = false,
  2817. bool bForceNoText = false,
  2818. bool bForceNoCheck = false,
  2819. bool bForceEnabled = false,
  2820. bool bForceUnselected = false
  2821. );
  2822. void PaintDefaultBk()
  2823. {
  2824. PaintDefault(
  2825. true,
  2826. true,
  2827. true,
  2828. true,
  2829. false
  2830. );
  2831. }
  2832. bool DoOwnerDrawPainting();
  2833. friend class CExtPopupMenuWnd;
  2834. }; // struct DRAWITEMDATA
  2835. /////////////////////////////////////////////////////////////////////////////
  2836. // CExtPopupMenuWnd::DRAWBACKGROUNDDATA
  2837. struct __PROF_UIS_API DRAWBACKGROUNDDATA
  2838. {
  2839. CDC & m_DC;
  2840. CRect m_rcBackground;
  2841. CExtPopupMenuWnd * m_pPopup;
  2842. bool m_bCustomBackgroundDrawn:1, m_bCustomBorderDrawn:1;
  2843. DRAWBACKGROUNDDATA(
  2844. CDC & dc,
  2845. const RECT & rcBackground,
  2846. CExtPopupMenuWnd * pPopup
  2847. )
  2848. : m_DC( dc )
  2849. , m_rcBackground( rcBackground )
  2850. , m_pPopup( pPopup )
  2851. , m_bCustomBackgroundDrawn( false )
  2852. , m_bCustomBorderDrawn( false )
  2853. {
  2854. ASSERT( m_DC.GetSafeHdc() != NULL );
  2855. ASSERT( m_pPopup != NULL );
  2856. }
  2857. public:
  2858. operator CDC & ()
  2859. {
  2860. ASSERT( this != NULL );
  2861. ASSERT( m_DC.GetSafeHdc() != NULL );
  2862. return m_DC;
  2863. }
  2864. operator LPCRECT()
  2865. {
  2866. ASSERT( this != NULL );
  2867. return (&m_rcBackground);
  2868. }
  2869. operator CSize()
  2870. {
  2871. ASSERT( this != NULL );
  2872. return m_rcBackground.Size();
  2873. }
  2874. operator CExtPopupMenuWnd * ()
  2875. {
  2876. ASSERT( this != NULL );
  2877. ASSERT( m_pPopup != NULL );
  2878. return m_pPopup;
  2879. }
  2880. CExtPopupMenuWnd * operator -> ()
  2881. {
  2882. ASSERT( this != NULL );
  2883. ASSERT( m_pPopup != NULL );
  2884. return m_pPopup;
  2885. }
  2886. operator LPARAM()
  2887. {
  2888. return reinterpret_cast < LPARAM > ( this );
  2889. }
  2890. void Notify();
  2891. };
  2892. /////////////////////////////////////////////////////////////////////////////
  2893. // CExtPopupMenuWnd::DRAWLEFTAREADATA
  2894. struct DRAWLEFTAREADATA;
  2895. friend struct DRAWLEFTAREADATA;
  2896. struct __PROF_UIS_API DRAWLEFTAREADATA
  2897. {
  2898. CDC * m_pDC;
  2899. LPCRECT m_pRectLeftArea;
  2900. CExtPopupMenuWnd * m_pPopup;
  2901. protected:
  2902. DRAWLEFTAREADATA(
  2903. CDC * pDC,
  2904. LPCRECT pRectLeftArea,
  2905. CExtPopupMenuWnd * pPopup
  2906. )
  2907. : m_pDC( pDC )
  2908. , m_pRectLeftArea( pRectLeftArea )
  2909. , m_pPopup( pPopup )
  2910. {
  2911. ASSERT( m_pDC != NULL );
  2912. ASSERT( m_pDC->GetSafeHdc() != NULL );
  2913. ASSERT( m_pRectLeftArea != NULL );
  2914. ASSERT( m_pPopup != NULL );
  2915. }
  2916. public:
  2917. operator CDC * ()
  2918. {
  2919. ASSERT( this != NULL );
  2920. ASSERT( m_pDC != NULL );
  2921. ASSERT( m_pDC->GetSafeHdc() != NULL );
  2922. return m_pDC;
  2923. }
  2924. operator LPCRECT()
  2925. {
  2926. ASSERT( this != NULL );
  2927. ASSERT( m_pRectLeftArea != NULL );
  2928. return m_pRectLeftArea;
  2929. }
  2930. operator CSize()
  2931. {
  2932. ASSERT( this != NULL );
  2933. ASSERT( m_pRectLeftArea != NULL );
  2934. return
  2935. CSize(
  2936. m_pRectLeftArea->right - m_pRectLeftArea->left,
  2937. m_pRectLeftArea->bottom - m_pRectLeftArea->top
  2938. );
  2939. }
  2940. operator CExtPopupMenuWnd * ()
  2941. {
  2942. ASSERT( this != NULL );
  2943. ASSERT( m_pPopup != NULL );
  2944. return m_pPopup;
  2945. }
  2946. CExtPopupMenuWnd * operator -> ()
  2947. {
  2948. ASSERT( this != NULL );
  2949. ASSERT( m_pPopup != NULL );
  2950. return m_pPopup;
  2951. }
  2952. operator LPARAM()
  2953. {
  2954. return reinterpret_cast < LPARAM > ( this );
  2955. }
  2956. protected:
  2957. bool DoOwnerDrawPainting();
  2958. friend class CExtPopupMenuWnd;
  2959. friend class CExtPopupColorMenuWnd;
  2960. }; // struct DRAWLEFTAREADATA
  2961. protected:
  2962. virtual void _EndSequenceEx(
  2963. MENUITEMDATA & mi
  2964. );
  2965. virtual void _EndSequence(
  2966. UINT nCmdID = 0,
  2967. HWND hWndDeliver = NULL
  2968. );
  2969. typedef
  2970. CArray < MENUITEMDATA, MENUITEMDATA & >
  2971. items_container_t;
  2972. typedef
  2973. const items_container_t
  2974. const_items_container_t;
  2975. items_container_t m_items_all;
  2976. // items_container_t & _GetItemsContaner();
  2977. // const_items_container_t & _GetItemsContaner() const;
  2978. MENUITEMDATA & _GetItemRef(int nIndex);
  2979. const MENUITEMDATA & _GetItemRef(int nIndex) const;
  2980. virtual void _InsertItem(
  2981. int nInsertBefore,
  2982. MENUITEMDATA & mi,
  2983. bool bNoRefToCmdMngr = false
  2984. );
  2985. public:
  2986. static bool TestHoverEnabledFromActiveHWND(
  2987. HWND hWndTestFrom,
  2988. HWND hWndActive = ::GetActiveWindow(),
  2989. bool bCheckEnabled = true,
  2990. bool bCheckVisible = true,
  2991. bool bCheckExtPopupMenuTracking = true
  2992. );
  2993. // Overrides
  2994. // ClassWizard generated virtual function overrides
  2995. //{{AFX_VIRTUAL(CExtPopupMenuWnd)
  2996. protected:
  2997. virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam );
  2998. //}}AFX_VIRTUAL
  2999. // Implementation
  3000. public:
  3001. virtual ~CExtPopupMenuWnd();
  3002. virtual CExtPopupMenuSite & GetSite() const;
  3003. protected:
  3004. virtual void _StartAnimation();
  3005. bool m_bHelperReCreateDynamicShadowAtTheEndOfNearestAnimation:1;
  3006. virtual void _EndAnimation();
  3007. public:
  3008. virtual bool _FindHelpMode() const;
  3009. virtual BOOL DestroyWindow();
  3010. protected:
  3011. virtual void PostNcDestroy();
  3012. virtual void _DeleteFadeOutMenu();
  3013. // Generated message map functions
  3014. //{{AFX_MSG(CExtPopupMenuWnd)
  3015. afx_msg void OnCancelMode();
  3016. afx_msg void OnTimer(__EXT_MFC_UINT_PTR nIDEvent);
  3017. afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
  3018. afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
  3019. //}}AFX_MSG
  3020. #if _MFC_VER < 0x700
  3021. afx_msg void OnActivateApp(BOOL bActive, HTASK hTask);
  3022. #else
  3023. afx_msg void OnActivateApp(BOOL bActive, DWORD hTask);
  3024. #endif
  3025. DECLARE_MESSAGE_MAP()
  3026. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  3027. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  3028. afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
  3029. afx_msg UINT OnNcHitTest(CPoint point);
  3030.     afx_msg void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI);
  3031. friend class CExtPopupMenuCmdUI;
  3032. protected:
  3033. CExtSafeString m_sMenuCaption;
  3034. mutable CSize m_sizeCaptionMeasured;
  3035. public:
  3036. virtual __EXT_MFC_SAFE_LPCTSTR MenuCaptionTextGet() const;
  3037. virtual void MenuCaptionTextSet(
  3038. __EXT_MFC_SAFE_LPCTSTR sMenuCaption = NULL
  3039. );
  3040. virtual CSize MenuCaptionMeasure() const;
  3041. virtual void MenuCaptionPaint(
  3042. CDC & dc,
  3043. CRect rcMenuCaption
  3044. ) const;
  3045. public:
  3046. bool m_bHelperResizingMode:1;
  3047. CSize m_sizeResizingMin, m_sizeResizingMax;
  3048. bool m_bHelperAnimationControllerDetected:1;
  3049. protected:
  3050. INT m_nFadeOutAnimationStepIndex, m_nFadeOutAnimationStepCount, m_nFadeOutAnimationEllapse;
  3051. public:
  3052. static INT g_nDefaultFadeOutAnimationStepCount;
  3053. static INT g_nDefaultFadeOutAnimationEllapse;
  3054. static INT g_nAutoExpandTime;
  3055. virtual bool _IsResizingMode() const;
  3056. virtual void _DoResizing(
  3057. CPoint ptScreenClick,
  3058. bool bVerticalOnlyResizing
  3059. );
  3060. virtual void _DoAdjustControlMetrics(
  3061. CSize _sizeAdjust
  3062. );
  3063. virtual CSize ResizingMinSizeGet() const;
  3064. virtual void ResizingMinSizeSet( CSize _size );
  3065. virtual CSize ResizingMaxSizeGet() const;
  3066. virtual void ResizingMaxSizeSet( CSize _size );
  3067. static const UINT g_nMsgInstantiatePopupMenu;
  3068. struct __PROF_UIS_API INSTANTIATEPOPUPMENUNOTIFICATION
  3069. {
  3070. CRuntimeClass * m_pMenuRTC;
  3071. CObject * m_pQuerySrc;
  3072. LPARAM m_lParam;
  3073. CExtPopupMenuWnd * m_pCreatedPopupMenuInstance;
  3074. INSTANTIATEPOPUPMENUNOTIFICATION(
  3075. CRuntimeClass * pMenuRTC,
  3076. CObject * pQuerySrc,
  3077. LPARAM lParam
  3078. );
  3079. operator WPARAM ();
  3080. static INSTANTIATEPOPUPMENUNOTIFICATION & FromWPARAM( WPARAM wParam );
  3081. void Notify( HWND hWndNotifyTarget );
  3082. }; // struct INSTANTIATEPOPUPMENUNOTIFICATION
  3083. static CExtPopupMenuWnd * InstantiatePopupMenu(
  3084. HWND hWndNotifyTarget,
  3085. CRuntimeClass * pMenuRTC,
  3086. CObject * pQuerySrc,
  3087. LPARAM lParam = 0L
  3088. );
  3089. }; // class CExtPopupMenuWnd
  3090. class __PROF_UIS_API CExtPopupColorMenuWnd :
  3091. public CExtPopupMenuWnd
  3092. {
  3093. public:
  3094. DECLARE_DYNCREATE( CExtPopupColorMenuWnd );
  3095. CExtPopupColorMenuWnd();
  3096. virtual ~CExtPopupColorMenuWnd();
  3097. // Attributes
  3098. public:
  3099. static const UINT g_nMsgNotifyColorChanged;
  3100. static const UINT g_nMsgNotifyColorChangedFinally;
  3101. static const UINT g_nMsgNotifyCustColor;
  3102. HWND m_hWndNotifyColorChanged; // def is NULL - use command targed
  3103. LPARAM m_lParamCookie;
  3104. COLORREF * m_pClrValueFinal;
  3105. enum e_color_selection_t
  3106. {
  3107. __ECST_NONE = COLORREF( -1L ),
  3108. __ECST_BUTTON_CUSTOM = COLORREF( -2L ),
  3109. __ECST_BUTTON_DEFAULT = COLORREF( -3L ),
  3110. };
  3111. COLORREF m_clrDefault,m_clrInitial;
  3112. bool m_bEnableBtnColorDefault:1;
  3113. bool m_bEnableBtnColorCustom:1;
  3114. CExtSafeString m_sBtnTextColorDefault;
  3115. CExtSafeString m_sBtnTextColorCustom;
  3116. protected:
  3117. CRect m_rcDefColorText, m_rcCustColorText;
  3118. enum
  3119. {
  3120. IDX_DEFAULT_COLOR_BTN = -101,
  3121. IDX_CUSTOM_COLOR_BTN = -102
  3122. };
  3123. // Implementation
  3124. protected:
  3125. int m_nColorIdxCurr, m_nInitialColorIdx;
  3126. HWND _GetWndNotifyColorChanged();
  3127. int _FindCellByColorRef( COLORREF clr );
  3128. virtual bool _CreateHelper(
  3129. CWnd * pWndCmdReceiver
  3130. );
  3131. virtual bool IsAllItemsRarelyUsed() const;
  3132. virtual CExtPopupMenuTipWnd::e_tip_style_t _CoolTipGetStyle() const;
  3133. public:
  3134. class __PROF_UIS_API COLORREF_TABLE_ENTRY
  3135. {
  3136. protected:
  3137. void _AssignFromOther (
  3138. const COLORREF_TABLE_ENTRY & other
  3139. );
  3140. public:
  3141. UINT             m_nStrTblResID;
  3142. COLORREF         m_clrValue;
  3143. CExtSafeString   m_strColorNameEnglish;
  3144. COLORREF_TABLE_ENTRY();
  3145. COLORREF_TABLE_ENTRY(
  3146. UINT         nStrTblResID,
  3147. COLORREF     clrValue,
  3148. __EXT_MFC_SAFE_LPCTSTR
  3149.              strColorNameEnglish
  3150. );
  3151. COLORREF_TABLE_ENTRY(
  3152. const COLORREF_TABLE_ENTRY & other
  3153. );
  3154. virtual ~COLORREF_TABLE_ENTRY();
  3155. COLORREF_TABLE_ENTRY & operator = (
  3156. const COLORREF_TABLE_ENTRY & other
  3157. );
  3158. virtual CExtSafeString GetLocalColorName() const;
  3159. }; // struct COLORREF_TABLE_ENTRY
  3160. static const COLORREF_TABLE_ENTRY
  3161. g_arrDefaultColors[ 40 ];
  3162. static const COLORREF_TABLE_ENTRY
  3163. g_arrDefaultColorsLess[ 16 ];
  3164. typedef
  3165. CTypedPtrArray < CPtrArray, COLORREF_TABLE_ENTRY * >
  3166. color_array_t;
  3167. protected:
  3168. int m_nColorsInRow;
  3169. color_array_t m_arrColors;
  3170. public:
  3171. CSize m_sizeColorItemCell, m_sizeColorItemSpaces;
  3172. void AddColor( COLORREF_TABLE_ENTRY * pCTE );
  3173. void RemoveAllColors();
  3174. void SetColorsInRow( int nColorsInRow );
  3175. void SetColors8x5();
  3176. void SetColors8x2();
  3177. virtual CSize _GetColorItemCellSize() const;
  3178. virtual CSize _GetColorItemSpaces() const;
  3179. virtual int _GetColorCellCount() const;
  3180. virtual int _GetColorsInRow() const;
  3181. virtual void _SetColorsInRow( int nColorsInRow );
  3182. virtual CSize _GetColorDimension() const;
  3183. virtual const COLORREF_TABLE_ENTRY * _GetColorEntry( int nIndex ) const;
  3184. virtual COLORREF _GetColorValue( int nIndex ) const;
  3185. virtual CExtSafeString _GetLocalColorName( int nIndex ) const;
  3186. virtual int _GetNextKeyColor(
  3187. int nColorIndex,
  3188. UINT nChar // VK_LEFT, VK_RIGHT, VK_UP and VK_DOWN
  3189. );
  3190. virtual void _RemoveAllColorEntries();
  3191. virtual int _HitTest(
  3192. const CPoint & point,
  3193. bool * p_bInplaceControlArea = NULL,
  3194. bool * p_bInplaceDropDownArea = NULL
  3195. )
  3196. {
  3197. ASSERT_VALID( this );
  3198. if( p_bInplaceControlArea != NULL )
  3199. *p_bInplaceControlArea = false;
  3200. if( p_bInplaceDropDownArea != NULL )
  3201. *p_bInplaceDropDownArea = false;
  3202. point;
  3203. return IDX_NOTHING;
  3204. }
  3205. protected:
  3206. bool m_bHelperInNotifyColorChanged:1;
  3207. void _NotifyColorChanged(
  3208. bool bFinal = false
  3209. );
  3210. CPoint _GetColorItemCoord(int nIdx);
  3211. CRect _GetColorItemRect(int nIdx);
  3212. int _ColorItemHitTest(const CPoint & point);
  3213. public:
  3214. virtual CRect _CalcTrackRect();
  3215. virtual CSize _CalcTrackSize();
  3216. virtual void _DoPaint( CDC & dcPaint, bool bUseBackBuffer = true );
  3217. protected:
  3218. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3219. // CExtCustomizeSite::ICustomizeDropTarget
  3220. virtual DROPEFFECT OnCustomizeTargetOver(
  3221. CExtCustomizeSite::CCmdDragInfo & _dragInfo,
  3222. CPoint point,
  3223. DWORD dwKeyState
  3224. );
  3225. virtual void OnCustomizeTargetLeave();
  3226. virtual bool OnCustomizeTargetDrop(
  3227. CExtCustomizeSite::CCmdDragInfo & _dragInfo,
  3228. CPoint point,
  3229. DROPEFFECT de
  3230. );
  3231. // CExtCustomizeSite::ICustomizeDropSource
  3232. virtual void OnCustomizeSourceDragComplete(
  3233. DROPEFFECT de,
  3234. bool bCanceled,
  3235. bool * p_bNoResetActiveItem
  3236. );
  3237. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3238. public:
  3239. virtual bool _OnMouseWheel(
  3240. WPARAM wParam,
  3241. LPARAM lParam,
  3242. bool & bNoEat
  3243. );
  3244. virtual bool _OnMouseMove(
  3245. UINT nFlags,
  3246. CPoint point,
  3247. bool & bNoEat
  3248. );
  3249. virtual bool _OnMouseClick(
  3250. UINT nFlags,
  3251. CPoint point,
  3252. bool & bNoEat
  3253. );
  3254. virtual bool _OnKeyDown(
  3255. UINT nChar,
  3256. UINT nRepCnt,
  3257. UINT nFlags,
  3258. bool & bNoEat
  3259. );
  3260. virtual bool _CanStartLevelTracking();
  3261. protected:
  3262. // Generated message map functions
  3263. //{{AFX_MSG(CExtPopupColorMenuWnd)
  3264. //}}AFX_MSG
  3265.     afx_msg BOOL OnQueryNewPalette();
  3266.     afx_msg void OnPaletteChanged(CWnd* pFocusWnd);
  3267. DECLARE_MESSAGE_MAP()
  3268. }; // class CExtPopupColorMenuWnd
  3269. /////////////////////////////////////////////////////////////////////////////
  3270. //{{AFX_INSERT_LOCATION}}
  3271. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  3272. #endif // __EXT_POPUP_MENU_WND_H