XTPPopupBar.h
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:23k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPPopupBar.h : interface for the CXTPPopupBar class.
  2. //
  3. // This file is a part of the XTREME COMMANDBARS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. //{{AFX_CODEJOCK_PRIVATE
  21. #if !defined(__XTPPOPUPBAR_H__)
  22. #define __XTPPOPUPBAR_H__
  23. //}}AFX_CODEJOCK_PRIVATE
  24. #if _MSC_VER >= 1000
  25. #pragma once
  26. #endif // _MSC_VER >= 1000
  27. #include "XTPCommandBar.h"
  28. class CXTPControlPopup;
  29. class CXTPCommandBars;
  30. //===========================================================================
  31. // Summary:
  32. //     CXTPPopupBar is a CXTPCommandBar derived class. It represents submenu of menu bar.
  33. //===========================================================================
  34. class _XTP_EXT_CLASS CXTPPopupBar : public CXTPCommandBar
  35. {
  36. //{{AFX_CODEJOCK_PRIVATE
  37. DECLARE_XTP_COMMANDBAR(CXTPPopupBar)
  38. //}}AFX_CODEJOCK_PRIVATE
  39. private:
  40. class CControlExpandButton;
  41. protected:
  42. //-----------------------------------------------------------------------
  43. // Summary:
  44. //     Constructs a CXTPPopupBar object
  45. //-----------------------------------------------------------------------
  46. CXTPPopupBar();
  47. //-----------------------------------------------------------------------
  48. // Summary:
  49. //     Destroys a CXTPPopupBar object, handles cleanup and deallocation
  50. //-----------------------------------------------------------------------
  51. ~CXTPPopupBar();
  52. public:
  53. //-----------------------------------------------------------------------
  54. // Summary:
  55. //     Creates a popup bar object.
  56. // Parameters:
  57. //     pCommandBars - Points to a CXTPCommandBars object
  58. // Returns:
  59. //     A pointer to a CXTPPopupBar object
  60. //-----------------------------------------------------------------------
  61. static CXTPPopupBar* AFX_CDECL CreatePopupBar(CXTPCommandBars* pCommandBars);
  62. public:
  63. //-----------------------------------------------------------------------
  64. // Summary:
  65. //     This method adds the tear-off state to the popup bar.
  66. // Parameters:
  67. //     lpszCaption - Caption of the tear-off toolbar.
  68. //     nID        - Identifier of the toolbar to be created.
  69. //     nWidth     - Width of the toolbar.
  70. //-----------------------------------------------------------------------
  71. void SetTearOffPopup(LPCTSTR lpszCaption, UINT nID, int nWidth = 400);
  72. //-----------------------------------------------------------------------
  73. // Summary:
  74. //     Determines if Popupbar has tear-off state.
  75. // Parameters:
  76. //     strCaption - Caption of the tear-off toolbar.
  77. //     nID        - Identifier of the toolbar to be created.
  78. //     nWidth     - Width of the toolbar.
  79. // Returns:
  80. //     TRUE if tear-off; otherwise returns FALSE
  81. //-----------------------------------------------------------------------
  82. BOOL IsTearOffPopup(CString& strCaption, UINT& nID, int& nWidth);
  83. //-------------------------------------------------------------------------
  84. // Summary:
  85. //     Call this member to determine if the popup menu is currently visiblepopped up.
  86. // Returns:
  87. //     TRUE is the popup menu is visible/displayed, FALSE if the popup menu
  88. //     is currently hidden.
  89. //-------------------------------------------------------------------------
  90. BOOL IsVisible() const;
  91. //-----------------------------------------------------------------------
  92. // Summary:
  93. //     This method opens the popup bar.
  94. // Parameters:
  95. //     xPos          - Specifies the logical x-coordinate of the popup bar
  96. //     yPos          - Specifies the logical y-coordinate of the  position.
  97. //     rcExclude     - Excluded area.
  98. //     pControlPopup - Pointer to a CXTPControlPopup object
  99. //     bSelectFirst  - TRUE to select the first item.
  100. // Returns:
  101. //     TRUE if successful; otherwise returns FALSE.
  102. //-----------------------------------------------------------------------
  103. BOOL Popup(int xPos, int yPos, LPCRECT rcExclude);
  104. BOOL Popup(CXTPControlPopup* pControlPopup, BOOL bSelectFirst = FALSE); // <combine CXTPPopupBar::Popup@int@int@LPCRECT>
  105. //-----------------------------------------------------------------------
  106. // Summary:
  107. //     Call this member to retrieve the control's popup.
  108. // Returns:
  109. //     A pointer to a CXTPControlPopup object.
  110. //-----------------------------------------------------------------------
  111. CXTPControlPopup* GetControlPopup() const;
  112. //-----------------------------------------------------------------------
  113. // Summary:
  114. //     This method expands the bar.
  115. //-----------------------------------------------------------------------
  116. void ExpandBar();
  117. //-----------------------------------------------------------------------
  118. // Summary:
  119. //     Call this member to destroy the window.
  120. // Returns:
  121. //     TRUE if successful; otherwise returns FALSE.
  122. //-----------------------------------------------------------------------
  123. BOOL DestroyWindow();
  124. //-----------------------------------------------------------------------
  125. // Summary:
  126. //     Call this method to make popup bar looks like popup toolbar.
  127. // Parameters:
  128. //     bToolBarType - TRUE to make bar as popup toolbar
  129. //-----------------------------------------------------------------------
  130. void SetPopupToolBar(BOOL bToolBarType);
  131. //-----------------------------------------------------------------------
  132. // Summary:
  133. //     Sets the default menu item for the specified popup bar.
  134. // Parameters:
  135. //     uItem  - Identifier or position of the new default menu item or
  136. //              - 1 for no default item. The meaning of this parameter
  137. //              depends on the value of fByPos.
  138. //     fByPos - Value specifying the meaning of uItem. If this parameter
  139. //              is FALSE, uItem is a menu item identifier. Otherwise,
  140. //              it is a menu item position.
  141. //-----------------------------------------------------------------------
  142. void SetDefaultItem(UINT uItem, BOOL fByPos = FALSE);
  143. //-----------------------------------------------------------------------
  144. // Summary:
  145. //     Determines the default menu item on the specified popup bar.
  146. // Parameters:
  147. //     gmdiFlags - Reserved. Should be NULL.
  148. //     fByPos    - Value specifying whether to retrieve the menu item's
  149. //                 identifier or its position. If this parameter is
  150. //                 FALSE, the identifier is returned. Otherwise, the
  151. //                 position is returned.
  152. // Returns:
  153. //     If the function succeeds, the return value is the identifier
  154. //     or position of the menu item. If the function fails, the return
  155. //     value is - 1.
  156. //-----------------------------------------------------------------------
  157. UINT GetDefaultItem(UINT gmdiFlags, BOOL fByPos = FALSE);
  158. //-----------------------------------------------------------------------
  159. // Summary:
  160. //     Call this method to determine if popup bar has double gripper.
  161. // Returns:
  162. //     TRUE if popup bar has double gripper.
  163. //-----------------------------------------------------------------------
  164. BOOL IsDoubleGripper() const;
  165. //-----------------------------------------------------------------------
  166. // Summary:
  167. //     Call this member to set double gripper for popup bar
  168. // Parameters:
  169. //     bDoubleGripper - TRUE to set double gripper for popup bar
  170. //-----------------------------------------------------------------------
  171. void SetDoubleGripper(BOOL bDoubleGripper = TRUE);
  172. //-----------------------------------------------------------------------
  173. // Summary:
  174. //     Call this member function to determine if the CommandBar is a
  175. //     CXTPPopupBar.
  176. // Returns:
  177. //     Returns TRUE if the CommandBar is a CXTPPopupBar, otherwise FALSE
  178. // See Also: CXTPCommandBar, CXTPPopupBar
  179. //-----------------------------------------------------------------------
  180. virtual BOOL IsPopupBar() const;
  181. //-----------------------------------------------------------------------
  182. // Summary:
  183. //     Determines if popup bar was added as context menu.
  184. // Returns:
  185. //     TRUE if popup bar is context menu
  186. // See Also: CXTPCommandBarsContextMenus
  187. //-----------------------------------------------------------------------
  188. BOOL IsContextMenu() const;
  189. //-------------------------------------------------------------------------
  190. // Summary:
  191. //     Translates all messages in message queue.
  192. //-------------------------------------------------------------------------
  193. void PumpMessage();
  194. //-----------------------------------------------------------------------
  195. // Summary:
  196. //     This method is called to get the size of the command bar.
  197. // Parameters:
  198. //      nLength - The requested dimension of the control bar, either horizontal or vertical, depending on dwMode.
  199. //      dwMode - see CControlBar::CalcDynamicLayout for list of supported flags.
  200. // Returns:
  201. //     Size of the command bar.
  202. //-----------------------------------------------------------------------
  203. CSize CalcDynamicLayout(int nLength, DWORD dwMode);
  204. //-----------------------------------------------------------------------
  205. // Summary:
  206. //     Creates the popup bar.
  207. // Returns:
  208. //     TRUE if successful; otherwise returns FALSE
  209. //-----------------------------------------------------------------------
  210. virtual BOOL Create();
  211. //-----------------------------------------------------------------------
  212. // Summary:
  213. //     This method is called to calculate destination rectangle of popup bar
  214. // Parameters:
  215. //     sz - Size of popup bar
  216. // Returns:
  217. //     Rectangle where popup bar will be located.
  218. //-----------------------------------------------------------------------
  219. virtual CRect CalculatePopupRect(CPoint ptPopup, CSize sz);
  220. void SetPopupFlags(DWORD dwPopupFlags);
  221. //-----------------------------------------------------------------------
  222. // Summary:
  223. //     Call this member to change the tracking state.
  224. // Parameters:
  225. //     bMode        - TRUE to set the tracking mode; otherwise FALSE.
  226. //     bSelectFirst - TRUE to select the first item.
  227. //     bKeyboard    - TRUE if the item is popuped by the keyboard.
  228. // Returns:
  229. //     TRUE if the method was successful.
  230. // See Also: IsTrackingMode.
  231. //-----------------------------------------------------------------------
  232. BOOL SetTrackingMode(int bMode, BOOL bSelectFirst = TRUE, BOOL bKeyboard = FALSE);
  233. protected:
  234. //-----------------------------------------------------------------------
  235. // Summary:
  236. //     Redraw the popup bar.
  237. //-----------------------------------------------------------------------
  238. void DelayRedraw() { Redraw(); }
  239. //-----------------------------------------------------------------------
  240. // Summary:
  241. //     Call this member to select the specified control.
  242. // Parameters:
  243. //     nSelected - An integer index of the item to be selected.
  244. //     bKeyboard - TRUE if the item was selected using the keyboard.
  245. // Returns:
  246. //     TRUE if the method was successful; otherwise FALSE.
  247. //-----------------------------------------------------------------------
  248. BOOL SetSelected(int nSelected, BOOL bKeyboard = FALSE);
  249. //-----------------------------------------------------------------------
  250. // Summary:
  251. //     This method sets the PopupBar position.
  252. // Parameters:
  253. //     sz - Size of the popup bar.
  254. //-----------------------------------------------------------------------
  255. void UpdateLocation(CSize sz);
  256. //-----------------------------------------------------------------------
  257. // Summary:
  258. //     Update flags.
  259. //-----------------------------------------------------------------------
  260. virtual void UpdateFlags();
  261. //-----------------------------------------------------------------------
  262. // Summary:
  263. //     Update expanding state.
  264. //-----------------------------------------------------------------------
  265. void UpdateExpandingState();
  266. //-----------------------------------------------------------------------
  267. // Summary:
  268. //     This method is called to draw the command bar in the given context.
  269. // Parameters:
  270. //     pDC - Pointer to a valid device context
  271. //     rcClipBox - The rectangular area of the control that is invalid
  272. //-----------------------------------------------------------------------
  273. void DrawCommandBar(CDC* pDC, CRect rcClipBox);
  274. //-----------------------------------------------------------------------
  275. // Summary:
  276. //     This method is called when the controls array is changed.
  277. //-----------------------------------------------------------------------
  278. virtual void OnControlsChanged();
  279. //-----------------------------------------------------------------------
  280. // Summary:
  281. //     This method is called to recalculate the command bar layout.
  282. //-----------------------------------------------------------------------
  283. void OnRecalcLayout();
  284. //-----------------------------------------------------------------------
  285. // Summary:
  286. //     Call this member to retrieve the parent command bar
  287. // Returns:
  288. //     A pointer to a CXTPCommandBar object
  289. //-----------------------------------------------------------------------
  290. CXTPCommandBar* GetParentCommandBar() const;
  291. //-----------------------------------------------------------------------
  292. // Summary:
  293. //     Reads or writes this object from or to an archive.
  294. // Parameters:
  295. //     pPX - A CXTPPropExchange object to serialize to or from.
  296. //----------------------------------------------------------------------
  297. virtual void DoPropExchange(CXTPPropExchange* pPX);
  298. //-----------------------------------------------------------------------
  299. // Summary:
  300. //     Call this method make a copy of the command bar.
  301. // Parameters:
  302. //     pCommandBar - Command bar needed to be copied.
  303. //     bRecursive - TRUE to copy recursively.
  304. //-----------------------------------------------------------------------
  305. virtual void Copy(CXTPCommandBar* pCommandBar, BOOL bRecursive = FALSE);
  306. //-----------------------------------------------------------------------
  307. // Summary:
  308. //     The framework calls this member function when a non-system key
  309. //     is pressed.
  310. // Parameters:
  311. //     nChar - Specifies the virtual key code of the given key.
  312. //     lParam   - Specifies additional message-dependent information.
  313. // Returns:
  314. //     TRUE if key handled, otherwise returns FALSE
  315. //-----------------------------------------------------------------------
  316. virtual BOOL OnHookKeyDown(UINT nChar, LPARAM lParam);
  317. //-----------------------------------------------------------------------
  318. // Summary:
  319. //     Updates rectangle to set position where popup bar become visible.
  320. // Parameters:
  321. //     rc - CRect object specifying size of exclude area.
  322. //     bVertical - TRUE if parent control is located vertically in bar.
  323. //-----------------------------------------------------------------------
  324. virtual void AdjustExcludeRect(CRect& rc, BOOL bVertical);
  325. public:
  326. //-----------------------------------------------------------------------
  327. // Summary:
  328. //     Sets the toolbars borders.
  329. // Parameters:
  330. //     rcBorders - Borders of the toolbar.
  331. //-----------------------------------------------------------------------
  332. void SetBorders(CRect rcBorders);
  333. //-----------------------------------------------------------------------
  334. // Summary:
  335. //     Disables shadow use.
  336. //-----------------------------------------------------------------------
  337. void DisableShadow();
  338. BOOL IsResizable() const;
  339. protected:
  340. //{{AFX_CODEJOCK_PRIVATE
  341. DECLARE_MESSAGE_MAP()
  342. virtual CRect GetBorders();
  343. //{{AFX_MSG(CXTPPopupBar)
  344. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  345. afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message);
  346. BOOL OnNcActivate(BOOL bActive);
  347. afx_msg void OnTimer(UINT_PTR nIDEvent);
  348. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  349. afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
  350. afx_msg BOOL OnNcCreate(LPCREATESTRUCT lpCreateStruct);
  351. LRESULT OnFloatStatus(WPARAM wParam, LPARAM);
  352. //}}AFX_MSG
  353. //}}AFX_CODEJOCK_PRIVATE
  354. protected:
  355. virtual void Animate();
  356. private:
  357. void AdjustScrolling(LPSIZE lpSize, BOOL bDown = FALSE, BOOL bInvalidate = FALSE);
  358. void TrackTearOff();
  359. void TrackResize();
  360. void RecalcSizeLayout();
  361. void SwitchTearOffTracking(BOOL bShow, CPoint point);
  362. void _MakeSameWidth(int nStart, int nLast, int nWidth);
  363. BOOL _MouseInResizeGripper(const POINT& pt);
  364. XTPAnimationType GetAnimationType() const;
  365. public:
  366. static double m_dMaxWidthDivisor;   // Maximum available width of popup
  367. protected:
  368. CXTPControlPopup* m_pControlPopup;  // Control that popuped the bar.
  369. CPoint m_ptPopup;                   // Position of the bar.
  370. CRect m_rcExclude;                  // Excluded area.
  371. DWORD m_popupFlags;                 // Flags of the bar.
  372. BOOL m_bDynamicLayout;              // TRUE if DynamicLayout routine executed.
  373. BOOL m_bCollapsed;                  // TRUE if popupbar is collapsed.
  374. BOOL m_bExpanded;                   // TRUE if popupbar is expanded.
  375. BOOL m_bExpanding;                  // TRUE if popupbar is expanding.
  376. BOOL m_bTearOffPopup;               // TRUE if popupbar has tear-off option.
  377. CRect m_rcTearOffGripper;           // Tear-off gripper position.
  378. CRect m_rcResizeGripper;            // Resizable gripper position.
  379. BOOL m_bResizable;                  // TRUE to allow resize
  380. BOOL m_bTearOffSelected;            // TRUE if gripper selected.
  381. UINT_PTR m_nTearOffTimer;           // Tear-off timer.
  382. BOOL m_bTearOffTracking;            // Tear-off tracking mode.
  383. CSize m_szTearOffBar;               // Size of the bar.
  384. CXTPToolBar* m_pTearOffBar;         // Tear-off toolbar pointer.
  385. CString m_strTearOffCaption;        // Caption of the Tear-off toolbar.
  386. UINT m_nTearOffID;                  // ID of the Tear-off toolbar.
  387. int m_nTearOffWidth;                // Width of the Tear-off toolbar.
  388. BOOL m_bShowShadow;                 // TRUE to show the shadow.
  389. CRect m_rcBorders;                  // Borders of the bar.
  390. BOOL m_bDoubleGripper;              // TRUE if popup is state popup type
  391. BOOL m_bContextMenu;                // TRUE if popup bar is context menu
  392. private:
  393. struct SCROLLINFO
  394. {
  395. struct BTNSCROLL
  396. {
  397. void Init(CWnd* pParent, UINT nID)
  398. {
  399. m_pParent = pParent;
  400. m_nID = nID;
  401. m_rc.SetRectEmpty();
  402. m_nTimer = 0;
  403. }
  404. CRect m_rc;
  405. UINT m_nTimer;
  406. CWnd* m_pParent;
  407. UINT m_nID;
  408. void KillTimer() { m_pParent->KillTimer(m_nTimer); m_nTimer = 0;}
  409. void SetTimer() { if (m_nTimer == 0) m_nTimer = (UINT)m_pParent->SetTimer(m_nID, 80, 0); }
  410. BOOL OnMouseMove(CPoint point)
  411. {
  412. if (m_rc.PtInRect(point))
  413. {
  414. SetTimer();
  415. return TRUE;
  416. } else if (m_nTimer) KillTimer();
  417. return FALSE;
  418. }
  419. };
  420. BOOL bScroll;
  421. int nScrollFirst, nScrollLast;
  422. BTNSCROLL btnUp;
  423. BTNSCROLL btnDown;
  424. void Init(CWnd* pWnd, UINT nIDUp, UINT nIDDown)
  425. {
  426. btnUp.Init(pWnd, nIDUp);
  427. btnDown.Init(pWnd, nIDDown);
  428. bScroll = nScrollFirst = nScrollLast = 0;
  429. }
  430. } m_scrollInfo;
  431. private:
  432. BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
  433. friend class CControlExpandButton;
  434. friend class CXTPControlPopup;
  435. friend class CXTPCommandBars;
  436. friend class CXTPCommandBar;
  437. friend class CXTPCommandBarsContextMenus;
  438. };
  439. //===========================================================================
  440. // Summary:
  441. //     CXTPPopupToolBar is a CXTPPopupBar derived class.
  442. //===========================================================================
  443. class _XTP_EXT_CLASS CXTPPopupToolBar : public CXTPPopupBar
  444. {
  445. DECLARE_XTP_COMMANDBAR(CXTPPopupToolBar)
  446. //-----------------------------------------------------------------------
  447. // Summary:
  448. //     Constructs a CXTPPopupToolBar object
  449. //-----------------------------------------------------------------------
  450. CXTPPopupToolBar();
  451. public:
  452. //-----------------------------------------------------------------------
  453. // Summary:
  454. //     Creates a popup toolbar object.
  455. // Parameters:
  456. //     pCommandBars - Points to a CXTPCommandBars object
  457. // Returns:
  458. //     A pointer to a CXTPPopupToolBar object
  459. //-----------------------------------------------------------------------
  460. static CXTPPopupToolBar* AFX_CDECL CreatePopupToolBar(CXTPCommandBars* pCommandBars);
  461. protected:
  462. //-----------------------------------------------------------------------
  463. // Summary:
  464. //     This method is called to get the size of the command bar.
  465. // Parameters:
  466. //      nLength - The requested dimension of the control bar, either horizontal or vertical, depending on dwMode.
  467. //      dwMode - see CControlBar::CalcDynamicLayout for list of supported flags.
  468. // Returns:
  469. //     Size of the command bar.
  470. //-----------------------------------------------------------------------
  471. CSize CalcDynamicLayout(int nLength, DWORD dwMode);
  472. };
  473. //////////////////////////////////////////////////////////////////////////
  474. AFX_INLINE void CXTPPopupBar::DisableShadow() {
  475. m_bShowShadow = FALSE;
  476. }
  477. AFX_INLINE void CXTPPopupBar::SetBorders(CRect rcBorders) {
  478. m_rcBorders = rcBorders;
  479. }
  480. AFX_INLINE BOOL CXTPPopupBar::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) {
  481. return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
  482. }
  483. AFX_INLINE BOOL CXTPPopupBar::IsDoubleGripper() const {
  484. return m_bDoubleGripper;
  485. }
  486. AFX_INLINE void CXTPPopupBar::SetDoubleGripper(BOOL bDoubleGripper /*= TRUE*/) {
  487. m_bDoubleGripper = bDoubleGripper;
  488. }
  489. AFX_INLINE CXTPControlPopup* CXTPPopupBar::GetControlPopup() const {
  490. return m_pControlPopup;
  491. }
  492. AFX_INLINE BOOL CXTPPopupBar::IsPopupBar() const {
  493. return TRUE;
  494. }
  495. AFX_INLINE BOOL CXTPPopupBar::IsContextMenu() const {
  496. return m_bContextMenu;
  497. }
  498. AFX_INLINE BOOL CXTPPopupBar::IsResizable() const {
  499. return m_bResizable;
  500. }
  501. AFX_INLINE void CXTPPopupBar::SetPopupFlags(DWORD dwPopupFlags) {
  502. m_popupFlags = dwPopupFlags;
  503. }
  504. #endif // #if !defined(__XTPPOPUPBAR_H__)