MenuBar.h
上传用户:sdxhgc
上传日期:2013-09-14
资源大小:388k
文件大小: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.     HMENU   GetMyMenu();
  94. // message map functions
  95. protected:
  96. //{{AFX_MSG(CMenuBar)
  97. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  98. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  99. afx_msg void OnTimer(UINT nIDEvent);
  100. afx_msg void OnKillFocus(CWnd* pNewWnd);
  101. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  102. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  103. afx_msg void OnDestroy();
  104. //}}AFX_MSG
  105. afx_msg LRESULT OnSetMenuNull(WPARAM wParam, LPARAM lParam);
  106. afx_msg LRESULT OnSettingChange(WPARAM wParam, LPARAM lParam);
  107. DECLARE_MESSAGE_MAP()
  108. protected:
  109. // Implementation helper
  110. enum TrackingState { none = 0, button, popup, buttonmouse };
  111. void UpdateBar(TrackingState nState = none, int nNewIndex = -1);
  112. // decoration
  113. void DrawBorder(CDC* pDC);
  114. void DrawGripper(CDC* pDC);
  115. void RefreshBar();
  116. // layout
  117. void CalcFloatingLayout();
  118. CSize CalcLayout(DWORD dwMode, int nLength = -1);
  119. void SizeMenuBar(int nCount, int nLength, BOOL bVert);
  120. int WrapMenuBar(int nCount, int nWidth);
  121. CSize CalcSize(int nCount);
  122. // Items
  123. BOOL InitItems();
  124. int GetItemCount() const { return m_arrItem.GetSize(); }
  125. BOOL IsValidIndex(int nIndex) const { return 0 <= nIndex && nIndex < GetItemCount(); }
  126. BOOL MapAccessKey(TCHAR cKey, int& nIndex);
  127. int HitTestOnTrack(CPoint point);
  128. // system hook
  129. static LRESULT CALLBACK MenuInputFilter(int code, WPARAM wParam, LPARAM lParam);
  130. BOOL OnMenuInput(MSG&);
  131. // popup
  132. void TrackPopup(int nIndex);
  133. int GetNextOrPrevButton(int nIndex, BOOL bPrev);
  134. // message hook
  135. void OnMenuSelect(HMENU hMenu, UINT nIndex);
  136. // timer
  137. void _KillTimer();
  138. void DeleteItems();
  139. void AddIcon(HICON hIcon);
  140. void OnPaintMDIClient();
  141. protected:
  142. HWND GetActiveChildWnd(BOOL& bMaximized);
  143. void OnSetMenu(HMENU hNewMenu, HMENU hWindowMenu);
  144. void OnInitMenuPopup();
  145. // CMenu is unavaiable, cause we have to share menu with MFC in MDI app.
  146. HMENU   m_hMenu;
  147. TrackingState m_nTrackingState;
  148. CArray<CMenuItem*, CMenuItem*> m_arrItem; // menu items include buttons
  149. private:
  150. int m_nCmdShow;
  151. // used for most important function
  152. BOOL m_bLoop;
  153. int m_nCurIndex;
  154. BOOL m_bIgnoreAlt;
  155. CPoint m_ptMouse; // cursor position while hooking
  156. UINT m_nIDEvent; // timer ID
  157. BOOL m_bDown;
  158. BOOL m_bProcessRightArrow, m_bProcessLeftArrow;
  159. CMenuBarFrameHook m_hookFrame;
  160. CMenuBarFrameHook m_hookMDIClient;
  161. HWND m_hWndMDIClient;
  162. static BOOL m_bMDIApp; // this is MDI application?
  163. BOOL m_bIcon;
  164. CMenuControl* m_pMenuControl;
  165. CMenuIcon*    m_pMenuIcon;
  166. BOOL m_bMDIMaximized;
  167. HMENU m_hWindowMenu;
  168. HWND m_hWndActiveChild;
  169. friend class CMenuBarFrameHook;
  170. };
  171. class CMenuIcon : public CMenuItem  
  172. {
  173. // Constructors
  174. public:
  175. CMenuIcon(CWnd* pWnd);
  176. // Operations
  177. void OnActivateChildWnd(HWND hWndChild);
  178. // Overidables
  179. virtual void Update(CDC*);
  180. virtual void Layout(CPoint, BOOL bHorz);
  181. virtual void TrackPopup(CWnd* pWnd);
  182. virtual BOOL CanTrack() { return TRUE; }
  183. virtual BOOL CanWrap() { return FALSE; }
  184. virtual void Validate(BOOL bValid) { m_bValid = bValid; }
  185. virtual BOOL IsValid() { return m_bValid; }
  186. virtual BOOL GetAccessKey(TCHAR&) { return FALSE; }
  187. // Implementation
  188. virtual ~CMenuIcon();
  189. private:
  190. HICON m_hDocIcon;
  191. HMENU m_hSysMenu;
  192. BOOL m_bValid;
  193. };
  194. class CMenuControl : public CMenuItem  
  195. {
  196. // Constructors
  197. public:
  198. void ForceDrawControl(CDC* pDC);
  199. BOOL OnMouseMsg(UINT msg, UINT nFlags, CPoint pt);
  200. CMenuControl(CControlBar* pBar);
  201. // Operations
  202. void DelayLayoutAndDraw(CDC* pDC, CSize sizeBar);
  203. // Overidables
  204. virtual void Update(CDC*);
  205. virtual void Layout(CPoint, BOOL bHorz);
  206. virtual void TrackPopup(CWnd* pWnd) { ASSERT(TRUE); }
  207. virtual BOOL CanTrack() { return FALSE; }
  208. virtual BOOL CanWrap() { return TRUE; }
  209. virtual void Validate(BOOL bValid) { m_bValid = bValid; }
  210. virtual BOOL IsValid() { return m_bValid; }
  211. virtual BOOL GetAccessKey(TCHAR&) { return FALSE; }
  212. // Implementation
  213. virtual ~CMenuControl();
  214. private:
  215. // Implementation helper
  216. void DrawControl(CDC* pDC, int nIndex, BOOL bDown);
  217. int HitTest(CPoint point);
  218. CControlBar* m_pBar;
  219. BOOL m_bValid;
  220. // UINT m_nState;
  221. CRect m_arrCaption[3];
  222. BOOL m_bDown;
  223. int m_nTracking;
  224. };
  225. class CMenuButton : public CMenuItem  
  226. {
  227. // Constructors
  228. public:
  229. CMenuButton(HMENU hMenu, int nIndex);
  230. static BOOL InitCommonResource();
  231. // Operations
  232. // Overidables
  233. virtual void Update(CDC*);
  234. virtual void Layout(CPoint, BOOL bHorz);
  235. virtual void TrackPopup(CWnd* pWnd);
  236. virtual BOOL CanTrack() { return TRUE; }
  237. virtual BOOL CanWrap() { return TRUE; }
  238. virtual void Validate(BOOL) { /*always valid*/}
  239. virtual BOOL IsValid() { return TRUE; }
  240. virtual BOOL GetAccessKey(TCHAR& cKey) { cKey = m_cAccessKey; return TRUE; }
  241. // Implementation
  242. virtual ~CMenuButton();
  243. // Implementation helper
  244. // used on Update
  245. void DrawHot(CDC* pDC);
  246. void DrawSelect(CDC* pDC);
  247. void DrawNone(CDC* pDC);
  248. void DrawHorzText(CDC* pDC, CPoint ptOffset = CPoint(0, 0));
  249. void DrawVertText(CDC* pDC, CPoint ptOffset = CPoint(0, 0));
  250. // used on constructing
  251. void InitButtonStringAndSubMenuHandle(HMENU hMenu, int nIndex);
  252. void InitHorizontalButtonSize();
  253. void InitAccessKeyAndVerticalLinePoint();
  254. private:
  255. CString m_strBtn; // string on button
  256. TCHAR m_cAccessKey; // access key
  257. CPoint m_ptLineFrom, m_ptLineTo; // vertical line point on button
  258. HMENU m_hSubMenu; // handle to sub menu
  259. };
  260. /////////////////////////////////////////////////////////////////////////////
  261. //{{AFX_INSERT_LOCATION}}
  262. // Microsoft Developer Studio 
  263. #endif // !defined(AFX_MENUBARCTRL_H__AF01DCA8_266A_11D3_8FA2_444553540000__INCLUDED_)