MenuBar.h
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:13k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. //-----------------------------------------------------------------------//
  2. // This is a part of the GuiLib MFC Extention.  //
  3. // Modified  :  Francisco Campos  //
  4. // (C) 2002 Francisco Campos <www.beyondata.com> All rights reserved     //
  5. // This code is provided "as is", with absolutely no warranty expressed  //
  6. // or implied. Any use is at your own risk.  //
  7. // You must obtain the author's consent before you can include this code //
  8. // in a software library.  //
  9. // If the source code in  this file is used in any application  //
  10. // then acknowledgement must be made to the author of this program  //
  11. // fcampos@tutopia.com  //
  12. //-----------------------------------------------------------------------//
  13. #if !defined(AFX_MENUBAR_H__02D8B982_4869_11D3_8D37_C0620A1F032F__INCLUDED_)
  14. #define AFX_MENUBAR_H__02D8B982_4869_11D3_8D37_C0620A1F032F__INCLUDED_
  15. #if _MSC_VER > 1000
  16. #pragma once
  17. #endif // _MSC_VER > 1000
  18. // MenuBar.h : header file
  19. //
  20. #include <afxtempl.h>
  21. #include <afxpriv.h>
  22. #include "Subclass.h"
  23. #include "GuiDrawLayer.h"
  24. #include "GuiComboBoxExt.h"
  25. #include "GuiToolButton.h"
  26. //#include "TestMenu.h"
  27. //////////////////////////////////////////////////////////////////////
  28. // CMenuBar class version 2.12
  29. // simulates a Dev Studio style dockable menu bar.
  30. // based on PixieLib written by Paul DiLascia<www.dilascia.com>
  31. //
  32. // version history
  33. // 2.12 : support OLE menu carelessly.
  34. // 2.11 : WindowMenu fixed by VORGA.
  35. // 2.10 : CMenuDockBar's problem fixed again and again.
  36. // 2.08 : give up precise ComputeMenuTrackPoint
  37. // 2.07 : Sychronizing with frame activation problem fixed
  38. // 2.06 : CMenuItem::ComputeMenuTrackPoint fixed a little
  39. // 2.05 : CMenuDockBar fixed
  40. //  : Inactive state problem fixed
  41. // 2.04 : bug with ::TrackPopupEx carelessly fixed 
  42. //           : synchronizing TrackPopup animation with win98 effect
  43. //
  44. // written by MB <mb2@geocities.co.jp> 1999.11.27
  45. //////////////////////////////////////////////////////////////////////
  46. // CMenuItem interface
  47. class CMenuItem
  48. {
  49. // Construction
  50. public:
  51. CMenuItem();
  52. // Attributes
  53. BYTE GetStyle() const { return m_fsStyle; }
  54. void ModifyState(BYTE fsRemove, BYTE fsAdd);
  55. BYTE GetState() const { return m_fsState; }
  56. CSize GetHorizontalSize() const;
  57. CRect GetRect() const { return m_rcItem; }
  58. TCHAR GetAccessKey() const { return m_cAccessKey; }
  59. // Overidables
  60. virtual void Update(CDC*) = 0;
  61. virtual void Layout(CPoint, BOOL bHorz) = 0;
  62. virtual void TrackPopup(CWnd* pBar, CWnd* pWndSentCmd) = 0;
  63. // Implementation
  64. public:
  65. virtual ~CMenuItem() { }
  66. protected:
  67. BYTE m_fsStyle;    // menu item style
  68. BYTE m_fsState;    // menu item state
  69. CRect m_rcItem;    // current rect
  70. CSize m_sizeHorz;  // ordinary horizontal size
  71. TCHAR m_cAccessKey;// access key (Alt key + X)
  72. };
  73. // CMenuItem style flags
  74. #define MISTYLE_TRACKABLE 0x01
  75. #define MISTYLE_WRAPPABLE 0x02
  76. // CMenuItem state flags
  77. #define MISTATE_HOT             0x01
  78. #define MISTATE_PRESSED         0x02
  79. #define MISTATE_HORZ            0x04
  80. #define MISTATE_HIDDEN          0x08
  81. #define MISTATE_WRAP            0x10
  82. #define MISTATE_INACTIVE 0x20
  83. //////////////////////////////////////////////////////////////////////
  84. // CMenuButton class
  85. class CMenuBar;
  86. class CMenuButton : public CMenuItem  
  87. {
  88. // Construction
  89. public:
  90. CMenuButton(HMENU hMenu, int nIndex);
  91. // Overidables
  92. virtual void Update(CDC*);
  93. virtual void Layout(CPoint, BOOL bHorz);
  94. virtual void TrackPopup(CWnd* pBar, CWnd* pWndSentCmd);
  95. // Implementation
  96. public:
  97. virtual ~CMenuButton() { }
  98. //CPopupMenu m_popupmenu;
  99. // CTestMenu m_popupmenu;
  100. CString m_strBtn;
  101. private:
  102.                 // string on button
  103. CPoint  m_ptLineFrom, m_ptLineTo;// vertical line point on button
  104. HMENU   m_hSubMenu;              // handle to sub menu
  105. UINT    m_nID;                   // Item ID (if no sub menu)
  106. GuiDrawLayer m_dw;
  107. CMenuBar* pMenuBar;
  108. // Implementation helper
  109. // used on Update
  110. void DrawHot(CDC*);
  111. void DrawPressed(CDC*);
  112. void DrawNone(CDC*);
  113. void DrawHorzText(CDC*, CPoint ptOffset = CPoint(0, 0));
  114. void DrawVertText(CDC*, CPoint ptOffset = CPoint(0, 0));
  115. void DrawButton(CDC* pDC,WORD wState);
  116. // used on constructing
  117. void InitButtonStringAndSubMenuHandle(HMENU hMenu, int nIndex);
  118. void InitHorizontalButtonSize();
  119. void InitAccessKeyAndVerticalLinePoint();
  120. };
  121. //////////////////////////////////////////////////////////////////////
  122. // CMenuIcon class
  123. class CMenuIcon : public CMenuItem  
  124. {
  125. // Construction
  126. public:
  127. CMenuIcon(CWnd* pMenuBar);
  128. // Operations
  129. void OnActivateChildWnd();
  130. // Overidables
  131. virtual void Update(CDC*);
  132. virtual void Layout(CPoint, BOOL bHorz);
  133. virtual void TrackPopup(CWnd* pBar, CWnd* pWndSentCmd);
  134. // Implementation
  135. public:
  136. virtual ~CMenuIcon();
  137. private:
  138. CWnd* m_pMenuBar;
  139. HICON m_hDocIcon;
  140. HICON m_hIconWinLogo;// used on View which has no own Doc icon
  141. };
  142. //////////////////////////////////////////////////////////////////////
  143. // CMenuControl class
  144. class CMenuControl : public CMenuItem  
  145. {
  146. // Construction
  147. public:
  148. CMenuControl(CWnd* pMenuBar);
  149. // Operations
  150. void OnActivateChildWnd();
  151. void DelayLayoutAndDraw(CDC* pDC, CSize sizeBar,BOOL bFlota);
  152. void DrawControl();
  153. // Overidables
  154. virtual void Update(CDC*);
  155. virtual void Layout(CPoint, BOOL bHorz);
  156. virtual void TrackPopup(CWnd* pBar, CWnd* pWndSentCmd) { ASSERT(TRUE); }
  157. // Implementation
  158. public:
  159. CGuiToolButton m_arrButton[3];
  160. CImageList m_img;
  161. public:
  162. virtual ~CMenuControl() { }
  163. private:
  164. CWnd* m_pMenuBar;
  165. CRect m_arrCaption[3];
  166. BOOL  m_bDown;
  167. int   m_nTracking;
  168. // Implementation helper
  169. int HitTest(CPoint point);
  170. CSize GetCaptionSize();
  171. };
  172. /////////////////////////////////////////////////////////////////////////////
  173. // CMenuBarFrameHook
  174. class CMenuBar;
  175. class CMainFrameHook : public CSubclassWnd
  176. {
  177. public:
  178. CMainFrameHook();
  179. BOOL Install(CMenuBar* pMenuBar, HWND hWndToHook);
  180. virtual ~CMainFrameHook();
  181. protected:
  182. virtual LRESULT WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam);
  183. private:
  184. CMenuBar* m_pMenuBar;
  185. };
  186. class CMDIClientHook : public CSubclassWnd
  187. {
  188. public:
  189. CMDIClientHook();
  190. BOOL Install(CMenuBar* pMenuBar, HWND hWndToHook);
  191. virtual ~CMDIClientHook();
  192. protected:
  193. virtual LRESULT WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam);
  194. private:
  195. CMenuBar* m_pMenuBar;
  196. };
  197. /////////////////////////////////////////////////////////////////////////////
  198. // CMenuBar 
  199. #if _MFC_VER >= 0x0600
  200. #define AFX_IDW_MENUBAR 0xE806  // Menu bar
  201. #else
  202. #define AFX_IDW_MENUBAR 0xE804  // Menu bar
  203. #define CBRS_GRIPPER 0x00400000L
  204. #endif
  205. #define CBRS_RAISEDBORDER 0x01000000L
  206. class AFX_EXT_CLASS CMenuBar : public CControlBar
  207. {
  208. DECLARE_DYNAMIC(CMenuBar)
  209. // Constructors
  210. public:
  211. CMenuBar();
  212. BOOL Create(CWnd* pParentWnd,
  213. DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP,
  214. UINT nID = AFX_IDW_MENUBAR);
  215. BOOL CreateEx(CWnd* pParentWnd,
  216. DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,
  217. CRect rcBorders = CRect(0, 0, 0, 0),
  218. UINT nID = AFX_IDW_MENUBAR);
  219. BOOL LoadMenuBar(UINT nIDResource);
  220. HMENU LoadMenu(HMENU hMenu, HMENU hMenuWindow);
  221. // Operations
  222. public:
  223. BOOL TranslateFrameMessage(MSG* pMsg);
  224. void EnableDockingEx(DWORD dwStyle);
  225. static const UINT WM_GETMENU;
  226. // Overidables
  227. //{{AFX_VIRTUAL(CMenuBar)
  228. //}}AFX_VIRTUAL
  229. // Implementation
  230. public:
  231. virtual ~CMenuBar();
  232. virtual void DoPaint(CDC* pDC);
  233. virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler);
  234. virtual CSize CalcFixedLayout(BOOL bStretch, BOOL bHorz);
  235. virtual CSize CalcDynamicLayout(int nLength, DWORD dwMode);
  236. void    SetXP(BOOL bXp){m_bXP=bXp;};
  237. void SetSaveHistory(CString szNameHistory,BOOL bSaveHistory);
  238. void SetTabbed(BOOL bIstabed);
  239. enum StyleG{
  240.  Office97=0,
  241.  Office2000=1
  242.  };
  243. void setStyleG(StyleG style) {m_style=style;OnNcPaint();}
  244. BOOL CreateCombo(CComboBox* pControl,UINT nID,int iSize,
  245. DWORD dwStyle=WS_CHILD|WS_VISIBLE|CBS_DROPDOWN | 
  246.                     WS_VSCROLL | WS_TABSTOP| CBS_AUTOHSCROLL);
  247. void CalcSizeItem();
  248. void DrawCombo();
  249. UINT m_style;
  250. // Generated message map functions
  251. protected:
  252. //{{AFX_MSG(CMenuBar)
  253. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  254. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  255. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  256. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  257. afx_msg void OnTimer(UINT nIDEvent);
  258. afx_msg void OnDestroy();
  259. afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp);
  260. afx_msg void OnNcPaint();
  261. afx_msg UINT OnNcHitTest(CPoint point);
  262. afx_msg void OnSize(UINT nType, int cx, int cy);
  263. afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
  264. //}}AFX_MSG
  265. afx_msg LRESULT OnSetMenuNull(WPARAM wParam, LPARAM lParam);
  266. afx_msg LRESULT OnSettingChange(WPARAM wParam, LPARAM lParam);
  267. DECLARE_MESSAGE_MAP()
  268. // for message hook
  269. void OnMenuSelect(HMENU hMenu, UINT nIndex);
  270. void OnSetMenu(HMENU hNewMenu, HMENU hWindowMenu);
  271. void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu);
  272. void OnFrameNcActivate(BOOL bActive);
  273. protected:
  274. // Implementation helper
  275. enum TrackingState { none = 0, button, popup, buttonmouse };
  276. void UpdateBar(TrackingState nState = none, int nNewIndex = -1);
  277. // layout
  278. CSize CalcLayout(DWORD nMode, int nLength = -1);
  279. CSize CalcSize(int nCount);
  280. int WrapMenuBar(int nCount, int nWidth);
  281. void SizeMenuBar(int nLength, BOOL bVert = FALSE);
  282. void Layout(); // called for for delayed button layout
  283. void CalcItemLayout(int nCount, BOOL bVert = FALSE);
  284. CSize CalcVertDockSize(int nCount);
  285. int GetClipBoxLength(BOOL bHorz);
  286. BOOL bIsTabbed;  //el Frame tiene activo el tabbed
  287. // draw
  288. void RefreshBar();
  289. void EraseNonClientEx();
  290. void DrawRaisedBorders(CDC*, CRect&);
  291. // won't use MFC6 functions
  292. void _DrawGripper(CWindowDC* dc,CRect* rcWin);
  293. //void _DrawGripper(CDC* pDC, const CRect& rect);
  294. void _CalcInsideRect(CRect& rect, BOOL bHorz) const;
  295. // Items
  296. BOOL InitItems();
  297. void DeleteItems();
  298. int GetItemCount() const { return m_arrItem.GetSize(); }
  299. BOOL IsValidIndex(int nIndex) const { return 0 <= nIndex && nIndex < GetItemCount(); }
  300. BOOL MapAccessKey(TCHAR cKey, int& nIndex);
  301. int HitTestOnTrack(CPoint point);
  302. // system hook
  303. static LRESULT CALLBACK MenuInputFilter(int code, WPARAM wParam, LPARAM lParam);
  304. BOOL OnMenuInput(MSG&);
  305. // popup
  306. void TrackPopup(int nIndex);
  307. int GetNextOrPrevButton(int nIndex, BOOL bPrev);
  308. void CheckActiveChildWndMaximized();
  309. HWND GetActiveChildWnd(BOOL& bMaximized);
  310. #if _MFC_VER < 0x0600
  311. void SetBorders(int cxLeft, int cyTop, int cxRight, int cyBottom);
  312. void SetBorders(LPCRECT lpRect)
  313. { SetBorders(lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); }
  314. #endif
  315. private:
  316. // used for important functions
  317. BOOL m_bLoop;
  318. int  m_nCurIndex;
  319. BOOL m_bIgnoreAlt;
  320. BOOL m_bXP;
  321. CString szNameHistory;
  322. BOOL bSaveHistory;
  323. TrackingState m_nTrackingState;
  324. CArray<CMenuItem*, CMenuItem*> m_arrItem;
  325. public:
  326. HMENU m_hMenu;// CMenu object is unavaiable, cause we have to share menu with MFC in MDI app.
  327. CPoint m_ptMouse;// cursor position while hooking
  328. BOOL   m_bProcessRightArrow, m_bProcessLeftArrow;
  329. UINT   m_nIDEvent;// Timer ID for mouse moving away
  330. CMainFrameHook m_hookFrame;
  331. BOOL m_bFrameActive;// synchronize with Frame Activation
  332. CMDIClientHook m_hookMDIClient;
  333. BOOL m_bMDIApp;// this is a MDI application?
  334. HWND m_hWndMDIClient;
  335. CMenuControl* m_pMenuControl;
  336. CMenuIcon* m_pMenuIcon;
  337. BOOL m_bMDIMaximized;
  338. HMENU m_hWindowMenu;
  339. HWND m_hWndActiveChild;
  340. CGuiComboBoxExt*  cmb;
  341. BOOL m_bDelayedButtonLayout;// what is this?
  342. DWORD m_dwExStyle;// my service
  343. BOOL m_bCombo;
  344. int   m_sizex;
  345. friend class CMainFrameHook;
  346. friend class CMDIClientHook;
  347. // for OLE menu
  348. HWND OleMenuDescriptor(BOOL& bSend, UINT nMsg, WPARAM wParam, LPARAM lParam);
  349. CWnd* GetCmdSentOleWnd();
  350. };
  351. /////////////////////////////////////////////////////////////////////////////
  352. // CMenuDocBar 
  353. //     for insisting its own line on DockBar
  354. // I'm afraid this trick will make some problems.
  355. class CMenuDockBar : public CDockBar  
  356. {
  357. public:
  358. CMenuDockBar() { }
  359. protected:
  360. virtual CSize CalcFixedLayout(BOOL bStretch, BOOL bHorz);
  361. public:
  362. virtual ~CMenuDockBar() { }
  363. };
  364. /////////////////////////////////////////////////////////////////////////////
  365. //{{AFX_INSERT_LOCATION}}
  366. // Microsoft Visual C++
  367. #endif // !defined(AFX_MENUBAR_H__02D8B982_4869_11D3_8D37_C0620A1F032F__INCLUDED_)