UIMenuBar.h
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:4k
源码类别:

图形图象

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////
  2. // Copyright 1998 Paul DiLascia
  3. // If this code works, it was written by Paul DiLascia.
  4. // If not, I don't know who wrote it.
  5. //
  6. #ifndef __MENUBAR_H
  7. #define __MENUBAR_H
  8. #include "UIsubclass.h"
  9. #include "UIFlatBar.h"
  10. //////////////////
  11. // CMenuBar uses this private class to intercept messages on behalf
  12. // of its owning frame, as well as the MDI client window. Conceptually,
  13. // these should be two different hooks, but I want to save code.
  14. //
  15. class CMenuBarFrameHook : public CSubclassWnd {
  16. protected:
  17.    friend class CMenuBar;
  18.    CMenuBar* m_pMenuBar;
  19.    CMenuBarFrameHook();
  20.    ~CMenuBarFrameHook();
  21.    BOOL Install(CMenuBar* pMenuBar, HWND hWndToHook);
  22.    virtual LRESULT WindowProc(UINT msg, WPARAM wp, LPARAM lp);
  23. };
  24. //////////////////
  25. // CMenuBar implements an Office 97-style menu bar. Use it the way you would
  26. // a CToolBar, only you need not call LoadToolbar. All you have to do is
  27. //
  28. // * Create the CMenuBar from your OnCreate or OnCreateBands handler.
  29. //
  30. // * Call LoadMenu to load a menu. This will set your frame's menu to NULL.
  31. //
  32. // * Implemenent your frame's PreTranslateMessage function, to call
  33. //   CMenuBar::TranslateFrameMessage. 
  34. //
  35. class CTRL_EXT_CLASS CMenuBar : public CFlatToolBar {
  36. public:
  37. BOOL  m_bAutoRemoveFrameMenu;  // set frame's menu to NULL
  38. CMenuBar();
  39. ~CMenuBar();
  40. // You must call this from your frame's PreTranslateMessage fn
  41. virtual BOOL TranslateFrameMessage(MSG* pMsg);
  42. HMENU LoadMenu(HMENU hmenu); // load menu
  43. HMENU LoadMenu(LPCTSTR lpszMenuName); // ...from resource file
  44. HMENU LoadMenu(UINT nID) {
  45. return LoadMenu(MAKEINTRESOURCE(nID));
  46. }
  47. HMENU GetMenu() { return m_hmenu; } // get current menu
  48. enum TRACKINGSTATE { // menubar has three states:
  49. TRACK_NONE = 0,   // * normal, not tracking anything
  50. TRACK_BUTTON,     // * tracking buttons (F10/Alt mode)
  51. TRACK_POPUP       // * tracking popups
  52. };
  53. TRACKINGSTATE GetTrackingState(int& iPopup) {
  54. iPopup = m_iPopupTracking; return m_iTrackingState;
  55. }
  56. static BOOL bTRACE;  // set TRUE to see TRACE msgs
  57. protected:
  58. friend class CMenuBarFrameHook;
  59. CMenuBarFrameHook m_frameHook;  // hooks frame window messages
  60. CStringArray m_arStrings;  // array of menu item names
  61. HMENU m_hmenu;  // the menu
  62. // menu tracking stuff:
  63. int  m_iPopupTracking;  // which popup I'm tracking if any
  64. int  m_iNewPopup;  // next menu to track
  65. BOOL  m_bProcessRightArrow;  // process l/r arrow keys?
  66. BOOL  m_bProcessLeftArrow;  // ...
  67. BOOL  m_bEscapeWasPressed;  // user pressed escape to exit menu
  68. CPoint m_ptMouse;  // mouse location when tracking popup
  69. HMENU  m_hMenuTracking;  // current popup I'm tracking
  70. TRACKINGSTATE m_iTrackingState;  // current tracking state
  71. // helpers
  72. void  RecomputeToolbarSize();
  73. void RecomputeMenuLayout();
  74. void UpdateFont();
  75. int GetNextOrPrevButton(int iButton, BOOL bPrev);
  76. void SetTrackingState(TRACKINGSTATE iState, int iButton=-1);
  77. void TrackPopup(int iButton);
  78. void ToggleTrackButtonMode();
  79. void CancelMenuAndTrackNewOne(int iButton);
  80. void  OnMenuSelect(HMENU hmenu, UINT nItemID);
  81. CPoint ComputeMenuTrackPoint(const CRect& rcButn, TPMPARAMS& tpm);
  82. BOOL IsValidButton(int iButton) const
  83. { return 0 <= iButton && iButton < GetButtonCount(); }
  84. virtual BOOL OnMenuInput(MSG& m);  // handle popup menu input
  85. // overrides
  86. virtual void OnBarStyleChange(DWORD dwOldStyle, DWORD dwNewStyle);
  87. int HitTest(CPoint p) const;
  88. // command/message handlers
  89. afx_msg int  OnCreate(LPCREATESTRUCT lpCreateStruct);
  90. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  91. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  92. afx_msg void OnSize(UINT nType, int cx, int cy);
  93. afx_msg void OnUpdateMenuButton(CCmdUI* pCmdUI);
  94. afx_msg LRESULT OnSetMenuNull(WPARAM wp, LPARAM lp);
  95. static LRESULT CALLBACK MenuInputFilter(int code, WPARAM wp, LPARAM lp);
  96. DECLARE_DYNAMIC(CMenuBar)
  97. DECLARE_MESSAGE_MAP()
  98. #ifdef _DEBUG
  99. virtual void AssertValid() const;
  100. virtual void Dump(CDumpContext& dc) const;
  101. #endif
  102. };
  103. #endif