MenuBar.h
上传用户:liudazhe
上传日期:2007-01-02
资源大小:51k
文件大小:8k
源码类别:

菜单

开发平台:

Visual C++

  1. #if !defined(AFX_MENUBAR_H__AF01DCA8_266A_11D3_8FA2_444553540000__INCLUDED_)
  2. #define AFX_MENUBAR_H__AF01DCA8_266A_11D3_8FA2_444553540000__INCLUDED_
  3. #if _MSC_VER >= 1000
  4. #pragma once
  5. #endif // _MSC_VER >= 1000
  6. #include <afxtempl.h>
  7. #include "SubclassWnd.h"
  8. // CMenuBar inspired by *PixieLib(TM) Copyright 1997-1998 Paul DiLascia*
  9. //
  10. // This class simulates VC++ style menu bar.
  11. // It does'nt any new products(IE4 or a new comctrl32.dll).
  12. //
  13. // It is possible this code has many bugs :(
  14. //
  15. // Written by MB <mb2@geocities.co.jp>
  16. //It is used when loading bar state from ini files, never change it!
  17. #define AFX_IDW_MENUBAR 0xE804  // Menu bar
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CMenuBar Control Bar
  20. class CMenuBar;
  21. class CMenuIcon;
  22. class CMenuControl;
  23. class CMenuButton;
  24. class CMenuBarFrameHook : public CSubclassWnd
  25. {
  26. public:
  27. CMenuBarFrameHook();
  28. BOOL Install(CMenuBar* pMenuBar, HWND hWndToHook);
  29. virtual ~CMenuBarFrameHook();
  30. protected:
  31. virtual LRESULT WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam);
  32. private:
  33. CMenuBar* m_pMenuBar;
  34. };
  35. class CMenuItem  
  36. {
  37. // Constructors
  38. public:
  39. CMenuItem();
  40. // Attributes
  41. enum State { none, select, hot };
  42. CRect& GetItemRect() { return m_rcItem; }
  43. // Operations
  44. void SetState(State state) { m_itemState = state; }
  45. State GetState() { return m_itemState; }
  46. // Overidables
  47. virtual void Update(CDC*) = 0;
  48. virtual void Layout(CPoint, BOOL bHorz) = 0;
  49. virtual void TrackPopup(CWnd* pWnd) = 0;
  50. virtual BOOL CanTrack() = 0;
  51. virtual BOOL CanWrap() = 0;
  52. virtual void Validate(BOOL bValid) = 0;
  53. virtual BOOL IsValid() = 0;
  54. virtual BOOL GetAccessKey(TCHAR&) = 0;
  55. // Implementation
  56. virtual ~CMenuItem();
  57. // Implementation helper
  58. CPoint ComputeMenuTrackPoint(CWnd* pWnd, HMENU hSubMenu, TPMPARAMS& tpm, CFont* pFont);
  59. protected:
  60. State m_itemState; // current state
  61. CRect m_rcItem; // current rect
  62. CSize m_sizeHorz; // ordinary size
  63. BOOL m_bHorz; // now horizontal?
  64. BOOL m_bWrapped; // start a new line?
  65. friend class CMenuBar;
  66. };
  67. class CMenuBar : public CControlBar
  68. {
  69. // Constructors
  70. public:
  71. CMenuBar();
  72. BOOL Create(CWnd* pParentWnd,
  73. DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP,
  74. UINT nID = AFX_IDW_MENUBAR);
  75. BOOL LoadMenuBar(UINT nIDResource);
  76. HMENU LoadMenu(HMENU hMenu, HMENU hMenuWindow);
  77. // Attributes
  78. public:
  79. // Operations
  80. public:
  81. BOOL TranslateFrameMessage(MSG* pMsg);
  82. // Overidables
  83. //{{AFX_VIRTUAL(CMenuBar)
  84. //}}AFX_VIRTUAL
  85. // Implementation
  86. public:
  87. int OnActivateFrame(int nCmdShow);
  88. virtual ~CMenuBar();
  89. virtual void DoPaint(CDC* pDC);
  90. virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler) { }
  91. virtual CSize CalcFixedLayout(BOOL bStretch, BOOL bHorz);
  92. virtual CSize CalcDynamicLayout(int nLength, DWORD dwMode);
  93. // message map functions
  94. protected:
  95. //{{AFX_MSG(CMenuBar)
  96. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  97. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  98. afx_msg void OnTimer(UINT nIDEvent);
  99. afx_msg void OnKillFocus(CWnd* pNewWnd);
  100. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  101. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  102. afx_msg void OnDestroy();
  103. //}}AFX_MSG
  104. afx_msg LRESULT OnSetMenuNull(WPARAM wParam, LPARAM lParam);
  105. afx_msg LRESULT OnSettingChange(WPARAM wParam, LPARAM lParam);
  106. DECLARE_MESSAGE_MAP()
  107. protected:
  108. // Implementation helper
  109. enum TrackingState { none = 0, button, popup, buttonmouse };
  110. void UpdateBar(TrackingState nState = none, int nNewIndex = -1);
  111. // decoration
  112. void DrawBorder(CDC* pDC);
  113. void DrawGripper(CDC* pDC);
  114. void RefreshBar();
  115. // layout
  116. void CalcFloatingLayout();
  117. CSize CalcLayout(DWORD dwMode, int nLength = -1);
  118. void SizeMenuBar(int nCount, int nLength, BOOL bVert);
  119. int WrapMenuBar(int nCount, int nWidth);
  120. CSize CalcSize(int nCount);
  121. // Items
  122. BOOL InitItems();
  123. int GetItemCount() const { return m_arrItem.GetSize(); }
  124. BOOL IsValidIndex(int nIndex) const { return 0 <= nIndex && nIndex < GetItemCount(); }
  125. BOOL MapAccessKey(TCHAR cKey, int& nIndex);
  126. int HitTestOnTrack(CPoint point);
  127. // system hook
  128. static LRESULT CALLBACK MenuInputFilter(int code, WPARAM wParam, LPARAM lParam);
  129. BOOL OnMenuInput(MSG&);
  130. // popup
  131. void TrackPopup(int nIndex);
  132. int GetNextOrPrevButton(int nIndex, BOOL bPrev);
  133. // message hook
  134. void OnMenuSelect(HMENU hMenu, UINT nIndex);
  135. // timer
  136. void _KillTimer();
  137. void DeleteItems();
  138. void AddIcon(HICON hIcon);
  139. void OnPaintMDIClient();
  140. protected:
  141. HWND GetActiveChildWnd(BOOL& bMaximized);
  142. void OnSetMenu(HMENU hNewMenu, HMENU hWindowMenu);
  143. void OnInitMenuPopup();
  144. // CMenu is unavaiable, cause we have to share menu with MFC in MDI app.
  145. HMENU   m_hMenu;
  146. TrackingState m_nTrackingState;
  147. CArray<CMenuItem*, CMenuItem*> m_arrItem; // menu items include buttons
  148. private:
  149. int m_nCmdShow;
  150. // used for most important function
  151. BOOL m_bLoop;
  152. int m_nCurIndex;
  153. BOOL m_bIgnoreAlt;
  154. CPoint m_ptMouse; // cursor position while hooking
  155. UINT m_nIDEvent; // timer ID
  156. BOOL m_bDown;
  157. BOOL m_bProcessRightArrow, m_bProcessLeftArrow;
  158. CMenuBarFrameHook m_hookFrame;
  159. CMenuBarFrameHook m_hookMDIClient;
  160. HWND m_hWndMDIClient;
  161. static BOOL m_bMDIApp; // this is MDI application?
  162. BOOL m_bIcon;
  163. CMenuControl* m_pMenuControl;
  164. CMenuIcon*    m_pMenuIcon;
  165. BOOL m_bMDIMaximized;
  166. HMENU m_hWindowMenu;
  167. HWND m_hWndActiveChild;
  168. friend class CMenuBarFrameHook;
  169. };
  170. class CMenuIcon : public CMenuItem  
  171. {
  172. // Constructors
  173. public:
  174. CMenuIcon(CWnd* pWnd);
  175. // Operations
  176. void OnActivateChildWnd(HWND hWndChild);
  177. // Overidables
  178. virtual void Update(CDC*);
  179. virtual void Layout(CPoint, BOOL bHorz);
  180. virtual void TrackPopup(CWnd* pWnd);
  181. virtual BOOL CanTrack() { return TRUE; }
  182. virtual BOOL CanWrap() { return FALSE; }
  183. virtual void Validate(BOOL bValid) { m_bValid = bValid; }
  184. virtual BOOL IsValid() { return m_bValid; }
  185. virtual BOOL GetAccessKey(TCHAR&) { return FALSE; }
  186. // Implementation
  187. virtual ~CMenuIcon();
  188. private:
  189. HICON m_hDocIcon;
  190. HMENU m_hSysMenu;
  191. BOOL m_bValid;
  192. };
  193. class CMenuControl : public CMenuItem  
  194. {
  195. // Constructors
  196. public:
  197. void ForceDrawControl(CDC* pDC);
  198. BOOL OnMouseMsg(UINT msg, UINT nFlags, CPoint pt);
  199. CMenuControl(CControlBar* pBar);
  200. // Operations
  201. void DelayLayoutAndDraw(CDC* pDC, CSize sizeBar);
  202. // Overidables
  203. virtual void Update(CDC*);
  204. virtual void Layout(CPoint, BOOL bHorz);
  205. virtual void TrackPopup(CWnd* pWnd) { ASSERT(TRUE); }
  206. virtual BOOL CanTrack() { return FALSE; }
  207. virtual BOOL CanWrap() { return TRUE; }
  208. virtual void Validate(BOOL bValid) { m_bValid = bValid; }
  209. virtual BOOL IsValid() { return m_bValid; }
  210. virtual BOOL GetAccessKey(TCHAR&) { return FALSE; }
  211. // Implementation
  212. virtual ~CMenuControl();
  213. private:
  214. // Implementation helper
  215. void DrawControl(CDC* pDC, int nIndex, BOOL bDown);
  216. int HitTest(CPoint point);
  217. CControlBar* m_pBar;
  218. BOOL m_bValid;
  219. // UINT m_nState;
  220. CRect m_arrCaption[3];
  221. BOOL m_bDown;
  222. int m_nTracking;
  223. };
  224. class CMenuButton : public CMenuItem  
  225. {
  226. // Constructors
  227. public:
  228. CMenuButton(HMENU hMenu, int nIndex);
  229. static BOOL InitCommonResource();
  230. // Operations
  231. // Overidables
  232. virtual void Update(CDC*);
  233. virtual void Layout(CPoint, BOOL bHorz);
  234. virtual void TrackPopup(CWnd* pWnd);
  235. virtual BOOL CanTrack() { return TRUE; }
  236. virtual BOOL CanWrap() { return TRUE; }
  237. virtual void Validate(BOOL) { /*always valid*/}
  238. virtual BOOL IsValid() { return TRUE; }
  239. virtual BOOL GetAccessKey(TCHAR& cKey) { cKey = m_cAccessKey; return TRUE; }
  240. // Implementation
  241. virtual ~CMenuButton();
  242. // Implementation helper
  243. // used on Update
  244. void DrawHot(CDC* pDC);
  245. void DrawSelect(CDC* pDC);
  246. void DrawNone(CDC* pDC);
  247. void DrawHorzText(CDC* pDC, CPoint ptOffset = CPoint(0, 0));
  248. void DrawVertText(CDC* pDC, CPoint ptOffset = CPoint(0, 0));
  249. // used on constructing
  250. void InitButtonStringAndSubMenuHandle(HMENU hMenu, int nIndex);
  251. void InitHorizontalButtonSize();
  252. void InitAccessKeyAndVerticalLinePoint();
  253. private:
  254. CString m_strBtn; // string on button
  255. TCHAR m_cAccessKey; // access key
  256. CPoint m_ptLineFrom, m_ptLineTo; // vertical line point on button
  257. HMENU m_hSubMenu; // handle to sub menu
  258. };
  259. /////////////////////////////////////////////////////////////////////////////
  260. //{{AFX_INSERT_LOCATION}}
  261. // Microsoft Developer Studio 
  262. #endif // !defined(AFX_MENUBARCTRL_H__AF01DCA8_266A_11D3_8FA2_444553540000__INCLUDED_)