MenuBar.h
上传用户:wlkj888
上传日期:2022-08-01
资源大小:806k
文件大小:15k
- /****************************************************************************
- * *
- * GuiToolKit *
- * (MFC extension) *
- * Created by Francisco Campos G. www.beyondata.com fcampos@beyondata.com *
- *--------------------------------------------------------------------------*
- * *
- * This program is free software;so you are free to use it any of your *
- * applications (Freeware, Shareware, Commercial),but leave this header *
- * intact. *
- * *
- * These files are provided "as is" without warranty of any kind. *
- * *
- * GuiToolKit is forever FREE CODE !!!!! *
- * *
- *--------------------------------------------------------------------------*
- * *
- * Bug Fixes and improvements : (Add your name) *
- * -Francisco Campos *
- * -igor1960 *
- ****************************************************************************/
- #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 "Subclass.h"
- #include "GuiDrawLayer.h"
- #include "GuiComboBoxExt.h"
- #include "GuiToolButton.h"
- #include "GuiControlBar.h"
-
- //#include "TestMenu.h"
- //////////////////////////////////////////////////////////////////////
- // CMenuBar class version 2.12
- // simulates a Dev Studio style dockable menu bar.
- // based on PixieLib written by Paul DiLascia<www.dilascia.com>
- //
- // 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 <mb2@geocities.co.jp> 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;
- virtual void UpdateButtons()=0;
- virtual void UpdateClr()=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 CMenuBar;
- //a hogly truck but........
- class CGuiMenuButton : public CGuiToolButton
- {
- public:
- CGuiMenuButton();
- ~CGuiMenuButton();
- void SetHorzVert(BOOL bHorz=TRUE){m_bHorz=bHorz;};
- protected:
- virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
- public:
- afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
- BOOL m_bHorz;
- protected:
- DECLARE_MESSAGE_MAP()
- };
- class CGuiIconButton : public CGuiToolButton
- {
- public:
- CGuiIconButton();
- ~CGuiIconButton();
- protected:
- virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
- public:
- afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
- protected:
- DECLARE_MESSAGE_MAP()
- };
- class CMenuButton : public CMenuItem
- {
- // Construction
- public:
- CMenuButton(HMENU hMenu, int nIndex,CWnd*);
- // Overidables
- virtual void Update(CDC*);
- virtual void Layout(CPoint, BOOL bHorz);
- virtual void TrackPopup(CWnd* pBar, CWnd* pWndSentCmd);
- virtual void UpdateButtons();
- virtual void UpdateClr(){m_bt.SetColor(GuiDrawLayer::GetRGBColorFace()); };
- // Implementation
- public:
- virtual ~CMenuButton() { }
- //CPopupMenu m_popupmenu;
- // CTestMenu m_popupmenu;
- CString m_strBtn;
- // ERNESTO
- void SetText(TCHAR *szText);
- public:
- CGuiMenuButton m_bt;
- private:
- // 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)
- GuiDrawLayer m_dw;
- CMenuBar* pMenuBar;
- CWnd* pParent;
- CFont m_cfont;
- // 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));
- void DrawButton(CDC* pDC,WORD wState);
- // 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();
- CGuiIconButton m_btnIcon;
- // Overidables
- virtual void Update(CDC*);
- virtual void Layout(CPoint, BOOL bHorz);
- virtual void TrackPopup(CWnd* pBar, CWnd* pWndSentCmd);
- virtual void UpdateButtons();
- virtual void UpdateClr(){};
- // 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();
- void DelayLayoutAndDraw(CDC* pDC, CSize sizeBar,BOOL bFlota);
- void DrawControl();
- // Overidables
- virtual void Update(CDC*);
- virtual void Layout(CPoint, BOOL bHorz);
- virtual void TrackPopup(CWnd* pBar, CWnd* pWndSentCmd) { ASSERT(TRUE); }
- void SetColorButton(COLORREF clrBtn);
- virtual void UpdateButtons();
- virtual void UpdateClr(){SetColorButton(GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style)); };
- // Implementation
- public:
- CGuiToolButton m_arrButton[3];
- CImageList m_img;
- public:
- virtual ~CMenuControl() { }
- private:
- CWnd* m_pMenuBar;
- CRect m_arrCaption[3];
- BOOL m_bDown;
- int m_nTracking;
-
- // Implementation helper
-
- 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 GUILIBDLLEXPORT 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;
- void SetMenuContext(UINT MnuContext) {m_MenuContext=MnuContext; };
- // 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);
-
- //ERNESTO
- BOOL SetSubMenuText( int id, TCHAR *szText);
- void SetXP(BOOL bXp){m_bXP=bXp;};
- void SetSaveHistory(CString szNameHistory,BOOL bSaveHistory);
- void SetTabbed(BOOL bIstabed);
- void StyleDispl(DWORD dwDsp=GUISTYLE_XP)
- {
- for(int i = 0; i < m_arrItem.GetSize(); ++i) {
- CMenuButton *pMenu = (CMenuButton*)m_arrItem.GetAt(i);
- if (::IsWindow(pMenu->m_bt.GetSafeHwnd()))
- {
- pMenu->m_bt.SetColor(GuiDrawLayer::GetRGBColorFace(dwDsp));
- pMenu->m_bt.StyleDispl(dwDsp);
- }
- }
- for( i = 0; i < 3; ++i) {
- if (m_pMenuControl)
- {
-
- m_pMenuControl->m_arrButton[0].StyleDispl(GUISTYLE_2003MENUBTN);
- m_pMenuControl->m_arrButton[1].StyleDispl(GUISTYLE_2003MENUBTN);
- m_pMenuControl->m_arrButton[2].StyleDispl(GUISTYLE_2003MENUBTN);
- }
- }
-
-
- if (m_bCombo)
- {
- cmb->Invalidate();
- cmb->UpdateWindow();
- }
- m_StyleDisplay=dwDsp;
- SendMessage(WM_NCPAINT);
- Invalidate(); UpdateWindow();}
-
- BOOL CreateCombo(CComboBox* pControl,UINT nID,int iSize,
- DWORD dwStyle=WS_CHILD|WS_VISIBLE|CBS_DROPDOWN |
- WS_VSCROLL | WS_TABSTOP| CBS_AUTOHSCROLL);
- void CalcSizeItem();
- void DrawCombo();
- void OnSysColorChange( );
- UINT m_style;
- UINT m_MenuContext;
- DWORD m_StyleDisplay;
- // Generated message map functions
- protected:
- //{{AFX_MSG(CMenuBar)
- afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
- afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
- afx_msg void OnLButtonDblClk(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 void OnSize(UINT nType, int cx, int cy);
- afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
- //}}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);
- BOOL bIsTabbed; //el Frame tiene activo el tabbed
- // draw
- void RefreshBar();
- void EraseNonClientEx();
- void DrawRaisedBorders(CDC*, CRect&);
- // won't use MFC6 functions
- void _DrawGripper(CWindowDC* dc,CRect* rcWin);
- //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;
- BOOL m_bXP;
- CString szNameHistory;
- BOOL bSaveHistory;
- TrackingState m_nTrackingState;
- CArray<CMenuItem*, CMenuItem*> 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;
- CGuiComboBoxExt* cmb;
- BOOL m_bDelayedButtonLayout;// what is this?
- DWORD m_dwExStyle;// my service
- BOOL m_bCombo;
- BOOL m_bChangeState;
- int m_sizex;
- friend class CMainFrameHook;
- friend class CMDIClientHook;
-
- // for OLE menu
- HWND OleMenuDescriptor(BOOL& bSend, UINT nMsg, WPARAM wParam, LPARAM lParam);
- CWnd* GetCmdSentOleWnd();
- afx_msg void OnPaint();
- };
- /////////////////////////////////////////////////////////////////////////////
- // CMenuDocBar
- // for insisting its own line on DockBar
- // I'm afraid this trick will make some problems.
- class CMenuDockBar : public CDockBar
- {
- public:
- CMenuDockBar() { }
- public:
- friend class CGuiControlBar;
- 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_)