MenuBar.h
上传用户:wlkj888
上传日期:2022-08-01
资源大小:806k
文件大小:15k
源码类别:

对话框与窗口

开发平台:

Visual C++

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