www.pudn.com > SCIDE.rar > MenuBar.h
#if !defined(AFX_MENUBAR_H__02D8B982_4869_11D3_8D37_C0620A1F032F__INCLUDED_) #define AFX_MENUBAR_H__02D8B982_4869_11D3_8D37_C0620A1F032F__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // MenuBar.h : header file // #include#include #include "Subclass.h" ////////////////////////////////////////////////////////////////////// // CMenuBar class version 2.12 // simulates a Dev Studio style dockable menu bar. // based on PixieLib written by Paul DiLascia // // version history // 2.12 : support OLE menu carelessly. // 2.11 : WindowMenu fixed by VORGA. // 2.10 : CMenuDockBar's problem fixed again and again. // 2.08 : give up precise ComputeMenuTrackPoint // 2.07 : Sychronizing with frame activation problem fixed // 2.06 : CMenuItem::ComputeMenuTrackPoint fixed a little // 2.05 : CMenuDockBar fixed // : Inactive state problem fixed // 2.04 : bug with ::TrackPopupEx carelessly fixed // : synchronizing TrackPopup animation with win98 effect // // written by MB 1999.11.27 ////////////////////////////////////////////////////////////////////// // CMenuItem interface class CMenuItem { // Construction public: CMenuItem(); // Attributes BYTE GetStyle() const { return m_fsStyle; } void ModifyState(BYTE fsRemove, BYTE fsAdd); BYTE GetState() const { return m_fsState; } CSize GetHorizontalSize() const; CRect GetRect() const { return m_rcItem; } TCHAR GetAccessKey() const { return m_cAccessKey; } // Overidables virtual void Update(CDC*) = 0; virtual void Layout(CPoint, BOOL bHorz) = 0; virtual void TrackPopup(CWnd* pBar, CWnd* pWndSentCmd) = 0; // Implementation public: virtual ~CMenuItem() { } protected: BYTE m_fsStyle; // menu item style BYTE m_fsState; // menu item state CRect m_rcItem; // current rect CSize m_sizeHorz; // ordinary horizontal size TCHAR m_cAccessKey;// access key (Alt key + X) }; // CMenuItem style flags #define MISTYLE_TRACKABLE 0x01 #define MISTYLE_WRAPPABLE 0x02 // CMenuItem state flags #define MISTATE_HOT 0x01 #define MISTATE_PRESSED 0x02 #define MISTATE_HORZ 0x04 #define MISTATE_HIDDEN 0x08 #define MISTATE_WRAP 0x10 #define MISTATE_INACTIVE 0x20 ////////////////////////////////////////////////////////////////////// // CMenuButton class class CMenuButton : public CMenuItem { // Construction public: CMenuButton(HMENU hMenu, int nIndex); // Overidables virtual void Update(CDC*); virtual void Layout(CPoint, BOOL bHorz); virtual void TrackPopup(CWnd* pBar, CWnd* pWndSentCmd); // Implementation public: virtual ~CMenuButton() { } private: CString m_strBtn; // string on button CPoint m_ptLineFrom, m_ptLineTo;// vertical line point on button HMENU m_hSubMenu; // handle to sub menu UINT m_nID; // Item ID (if no sub menu) // Implementation helper // used on Update void DrawHot(CDC*); void DrawPressed(CDC*); void DrawNone(CDC*); void DrawHorzText(CDC*, CPoint ptOffset = CPoint(0, 0)); void DrawVertText(CDC*, CPoint ptOffset = CPoint(0, 0)); // used on constructing void InitButtonStringAndSubMenuHandle(HMENU hMenu, int nIndex); void InitHorizontalButtonSize(); void InitAccessKeyAndVerticalLinePoint(); }; ////////////////////////////////////////////////////////////////////// // CMenuIcon class class CMenuIcon : public CMenuItem { // Construction public: CMenuIcon(CWnd* pMenuBar); // Operations void OnActivateChildWnd(); // Overidables virtual void Update(CDC*); virtual void Layout(CPoint, BOOL bHorz); virtual void TrackPopup(CWnd* pBar, CWnd* pWndSentCmd); // Implementation public: virtual ~CMenuIcon(); private: CWnd* m_pMenuBar; HICON m_hDocIcon; HICON m_hIconWinLogo;// used on View which has no own Doc icon }; ////////////////////////////////////////////////////////////////////// // CMenuControl class class CMenuControl : public CMenuItem { // Construction public: CMenuControl(CWnd* pMenuBar); // Operations void OnActivateChildWnd(); BOOL OnMouseMsg(UINT msg, UINT nFlags, CPoint pt); void ForceDrawControl(CDC*); void DelayLayoutAndDraw(CDC* pDC, CSize sizeBar); // Overidables virtual void Update(CDC*); virtual void Layout(CPoint, BOOL bHorz); virtual void TrackPopup(CWnd* pBar, CWnd* pWndSentCmd) { ASSERT(TRUE); } // Implementation public: virtual ~CMenuControl() { } private: CWnd* m_pMenuBar; CRect m_arrCaption[3]; BOOL m_bDown; int m_nTracking; // Implementation helper void DrawControl(CDC*, int nIndex, BOOL bDown); int HitTest(CPoint point); CSize GetCaptionSize(); }; ///////////////////////////////////////////////////////////////////////////// // CMenuBarFrameHook class CMenuBar; class CMainFrameHook : public CSubclassWnd { public: CMainFrameHook(); BOOL Install(CMenuBar* pMenuBar, HWND hWndToHook); virtual ~CMainFrameHook(); protected: virtual LRESULT WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam); private: CMenuBar* m_pMenuBar; }; class CMDIClientHook : public CSubclassWnd { public: CMDIClientHook(); BOOL Install(CMenuBar* pMenuBar, HWND hWndToHook); virtual ~CMDIClientHook(); protected: virtual LRESULT WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam); private: CMenuBar* m_pMenuBar; }; ///////////////////////////////////////////////////////////////////////////// // CMenuBar #if _MFC_VER >= 0x0600 #define AFX_IDW_MENUBAR 0xE806 // Menu bar #else #define AFX_IDW_MENUBAR 0xE804 // Menu bar #define CBRS_GRIPPER 0x00400000L #endif #define CBRS_RAISEDBORDER 0x01000000L class /*AFX_EXT_CLASS*/ CMenuBar : public CControlBar { DECLARE_DYNAMIC(CMenuBar) // Constructors public: CMenuBar(); BOOL Create(CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP, UINT nID = AFX_IDW_MENUBAR); BOOL CreateEx(CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP, CRect rcBorders = CRect(0, 0, 0, 0), UINT nID = AFX_IDW_MENUBAR); BOOL LoadMenuBar(UINT nIDResource); HMENU LoadMenu(HMENU hMenu, HMENU hMenuWindow); // Operations public: BOOL TranslateFrameMessage(MSG* pMsg); void EnableDockingEx(DWORD dwStyle); static const UINT WM_GETMENU; // Overidables //{{AFX_VIRTUAL(CMenuBar) //}}AFX_VIRTUAL // Implementation public: virtual ~CMenuBar(); virtual void DoPaint(CDC* pDC); virtual void OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler); virtual CSize CalcFixedLayout(BOOL bStretch, BOOL bHorz); virtual CSize CalcDynamicLayout(int nLength, DWORD dwMode); // Generated message map functions protected: //{{AFX_MSG(CMenuBar) afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnDestroy(); afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp); afx_msg void OnNcPaint(); afx_msg UINT OnNcHitTest(CPoint point); //}}AFX_MSG afx_msg LRESULT OnSetMenuNull(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnSettingChange(WPARAM wParam, LPARAM lParam); DECLARE_MESSAGE_MAP() // for message hook void OnMenuSelect(HMENU hMenu, UINT nIndex); void OnSetMenu(HMENU hNewMenu, HMENU hWindowMenu); void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu); void OnFrameNcActivate(BOOL bActive); protected: // Implementation helper enum TrackingState { none = 0, button, popup, buttonmouse }; void UpdateBar(TrackingState nState = none, int nNewIndex = -1); // layout CSize CalcLayout(DWORD nMode, int nLength = -1); CSize CalcSize(int nCount); int WrapMenuBar(int nCount, int nWidth); void SizeMenuBar(int nLength, BOOL bVert = FALSE); void Layout(); // called for for delayed button layout void CalcItemLayout(int nCount, BOOL bVert = FALSE); CSize CalcVertDockSize(int nCount); int GetClipBoxLength(BOOL bHorz); // draw void RefreshBar(); void EraseNonClientEx(); void DrawRaisedBorders(CDC*, CRect&); // won't use MFC6 functions void _DrawGripper(CDC* pDC, const CRect& rect); void _CalcInsideRect(CRect& rect, BOOL bHorz) const; // Items BOOL InitItems(); void DeleteItems(); int GetItemCount() const { return m_arrItem.GetSize(); } BOOL IsValidIndex(int nIndex) const { return 0 <= nIndex && nIndex < GetItemCount(); } BOOL MapAccessKey(TCHAR cKey, int& nIndex); int HitTestOnTrack(CPoint point); // system hook static LRESULT CALLBACK MenuInputFilter(int code, WPARAM wParam, LPARAM lParam); BOOL OnMenuInput(MSG&); // popup void TrackPopup(int nIndex); int GetNextOrPrevButton(int nIndex, BOOL bPrev); void CheckActiveChildWndMaximized(); HWND GetActiveChildWnd(BOOL& bMaximized); #if _MFC_VER < 0x0600 void SetBorders(int cxLeft, int cyTop, int cxRight, int cyBottom); void SetBorders(LPCRECT lpRect) { SetBorders(lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); } #endif private: // used for important functions BOOL m_bLoop; int m_nCurIndex; BOOL m_bIgnoreAlt; TrackingState m_nTrackingState; CArray m_arrItem; public: HMENU m_hMenu;// CMenu object is unavaiable, cause we have to share menu with MFC in MDI app. CPoint m_ptMouse;// cursor position while hooking BOOL m_bProcessRightArrow, m_bProcessLeftArrow; UINT m_nIDEvent;// Timer ID for mouse moving away CMainFrameHook m_hookFrame; BOOL m_bFrameActive;// synchronize with Frame Activation CMDIClientHook m_hookMDIClient; BOOL m_bMDIApp;// this is a MDI application? HWND m_hWndMDIClient; CMenuControl* m_pMenuControl; CMenuIcon* m_pMenuIcon; BOOL m_bMDIMaximized; HMENU m_hWindowMenu; HWND m_hWndActiveChild; BOOL m_bDelayedButtonLayout;// what is this? DWORD m_dwExStyle;// my service friend class CMainFrameHook; friend class CMDIClientHook; // for OLE menu HWND OleMenuDescriptor(BOOL& bSend, UINT nMsg, WPARAM wParam, LPARAM lParam); CWnd* GetCmdSentOleWnd(); }; ///////////////////////////////////////////////////////////////////////////// // CMenuDocBar // for insisting its own line on DockBar // I'm afraid this trick will make some problems. class CMenuDockBar : public CDockBar { public: CMenuDockBar() { } protected: virtual CSize CalcFixedLayout(BOOL bStretch, BOOL bHorz); public: virtual ~CMenuDockBar() { } }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ #endif // !defined(AFX_MENUBAR_H__02D8B982_4869_11D3_8D37_C0620A1F032F__INCLUDED_)