⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menubar.h

📁 使用VC编写的GPRS通讯代码,可用于GPRS MODEM收发数据
💻 H
字号:
#if !defined(AFX_MENUBAR_H__AF01DCA8_266A_11D3_8FA2_444553540000__INCLUDED_)
#define AFX_MENUBAR_H__AF01DCA8_266A_11D3_8FA2_444553540000__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#include <afxtempl.h>
#include "SubclassWnd.h"


// CMenuBar inspired by *PixieLib(TM) Copyright 1997-1998 Paul DiLascia*
//
// This class simulates VC++ style menu bar.
// It does'nt any new products(IE4 or a new comctrl32.dll).
//
// It is possible this code has many bugs :(
//
// Written by MB <mb2@geocities.co.jp>


//It is used when loading bar state from ini files, never change it!
#define AFX_IDW_MENUBAR 0xE804  // Menu bar

/////////////////////////////////////////////////////////////////////////////
// CMenuBar Control Bar

class CMenuBar;
class CMenuIcon;
class CMenuControl;
class CMenuButton;

class CMenuBarFrameHook : public CSubclassWnd
{
public:
	CMenuBarFrameHook();
	BOOL Install(CMenuBar* pMenuBar, HWND hWndToHook);
	virtual ~CMenuBarFrameHook();

protected:
	virtual LRESULT WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam);

private:
	CMenuBar* m_pMenuBar;
};

class CMenuItem  
{
// Constructors
public:
	CMenuItem();

// Attributes
	enum State { none, select, hot };
	CRect& GetItemRect() { return m_rcItem; }

// Operations
	void SetState(State state) { m_itemState = state; }
	State GetState() { return m_itemState; }

// Overidables
	virtual void Update(CDC*) = 0;
	virtual void Layout(CPoint, BOOL bHorz) = 0;
	virtual void TrackPopup(CWnd* pWnd) = 0;
	virtual BOOL CanTrack() = 0;
	virtual BOOL CanWrap() = 0;
	virtual void Validate(BOOL bValid) = 0;
	virtual BOOL IsValid() = 0;
	virtual BOOL GetAccessKey(TCHAR&) = 0;


// Implementation
	virtual ~CMenuItem();

	// Implementation helper
	CPoint ComputeMenuTrackPoint(CWnd* pWnd, HMENU hSubMenu, TPMPARAMS& tpm, CFont* pFont);

protected:
	State	m_itemState;	// current state
	CRect	m_rcItem;		// current rect
	CSize	m_sizeHorz;		// ordinary size
	BOOL	m_bHorz;		// now horizontal?
	BOOL	m_bWrapped;		// start a new line?

	friend class CMenuBar;
};

class CMenuBar : public CControlBar
{
// Constructors
public:
	CMenuBar();
	BOOL Create(CWnd* pParentWnd,
		DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP,
		UINT nID = AFX_IDW_MENUBAR);

	BOOL LoadMenuBar(UINT nIDResource);
	HMENU LoadMenu(HMENU hMenu, HMENU hMenuWindow);

// Attributes
public:

// Operations
public:
	BOOL TranslateFrameMessage(MSG* pMsg);

// Overidables
	//{{AFX_VIRTUAL(CMenuBar)
	//}}AFX_VIRTUAL

// Implementation
public:
	int OnActivateFrame(int nCmdShow);
	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);
    HMENU   GetMyMenu();
// 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 void OnTimer(UINT nIDEvent);
	afx_msg void OnKillFocus(CWnd* pNewWnd);
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnDestroy();
	//}}AFX_MSG
	afx_msg LRESULT OnSetMenuNull(WPARAM wParam, LPARAM lParam);
	afx_msg LRESULT OnSettingChange(WPARAM wParam, LPARAM lParam);
	DECLARE_MESSAGE_MAP()

protected:
	//	Implementation helper
	enum TrackingState { none = 0, button, popup, buttonmouse };
	void UpdateBar(TrackingState nState = none, int nNewIndex = -1);

	// decoration
	void DrawBorder(CDC* pDC);
	void DrawGripper(CDC* pDC);
	void RefreshBar();

	// layout
	void CalcFloatingLayout();
	CSize CalcLayout(DWORD dwMode, int nLength = -1);
	void SizeMenuBar(int nCount, int nLength, BOOL bVert);
	int WrapMenuBar(int nCount, int nWidth);
	CSize CalcSize(int nCount);

	// Items
	BOOL InitItems();
	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);

	// message hook
	void OnMenuSelect(HMENU hMenu, UINT nIndex);

	// timer
	void _KillTimer();

	void DeleteItems();
	void AddIcon(HICON hIcon);
	void OnPaintMDIClient();

protected:
	HWND GetActiveChildWnd(BOOL& bMaximized);
	void OnSetMenu(HMENU hNewMenu, HMENU hWindowMenu);
	void OnInitMenuPopup();
	// CMenu is unavaiable, cause we have to share menu with MFC in MDI app.
	HMENU		  m_hMenu;			
	TrackingState m_nTrackingState;
	CArray<CMenuItem*, CMenuItem*> m_arrItem;	// menu items include buttons

private:
	int m_nCmdShow;
	// used for most important function
	BOOL	m_bLoop;
	int		m_nCurIndex;
	BOOL	m_bIgnoreAlt;

	CPoint	m_ptMouse;		// cursor position while hooking
	UINT	m_nIDEvent;		// timer ID
	BOOL	m_bDown;
	BOOL	m_bProcessRightArrow, m_bProcessLeftArrow;

	CMenuBarFrameHook m_hookFrame;
	CMenuBarFrameHook m_hookMDIClient;

	HWND	m_hWndMDIClient;
	static BOOL	m_bMDIApp;	// this is MDI application?

	BOOL m_bIcon;
	CMenuControl* m_pMenuControl;
	CMenuIcon*    m_pMenuIcon;
	BOOL m_bMDIMaximized;
	HMENU m_hWindowMenu;
	HWND m_hWndActiveChild;

	friend class CMenuBarFrameHook;
};

class CMenuIcon : public CMenuItem  
{
// Constructors
public:
	CMenuIcon(CWnd* pWnd);

// Operations
	void OnActivateChildWnd(HWND hWndChild);

// Overidables
	virtual void Update(CDC*);
	virtual void Layout(CPoint, BOOL bHorz);
	virtual void TrackPopup(CWnd* pWnd);
	virtual BOOL CanTrack() { return TRUE; }
	virtual BOOL CanWrap() { return FALSE; }
	virtual void Validate(BOOL bValid) { m_bValid = bValid; }
	virtual BOOL IsValid() { return m_bValid; }
	virtual BOOL GetAccessKey(TCHAR&) { return FALSE; }

// Implementation
	virtual ~CMenuIcon();

private:
	HICON	m_hDocIcon;
	HMENU	m_hSysMenu;
	BOOL	m_bValid;
};

class CMenuControl : public CMenuItem  
{
// Constructors
public:
	void ForceDrawControl(CDC* pDC);
	BOOL OnMouseMsg(UINT msg, UINT nFlags, CPoint pt);
	CMenuControl(CControlBar* pBar);

// Operations
	void DelayLayoutAndDraw(CDC* pDC, CSize sizeBar);

// Overidables
	virtual void Update(CDC*);
	virtual void Layout(CPoint, BOOL bHorz);
	virtual void TrackPopup(CWnd* pWnd) { ASSERT(TRUE); }
	virtual BOOL CanTrack() { return FALSE; }
	virtual BOOL CanWrap() { return TRUE; }
	virtual void Validate(BOOL bValid) { m_bValid = bValid; }
	virtual BOOL IsValid() { return m_bValid; }
	virtual BOOL GetAccessKey(TCHAR&) { return FALSE; }

// Implementation
	virtual ~CMenuControl();

private:
	// Implementation helper
	void DrawControl(CDC* pDC, int nIndex, BOOL bDown);
	int HitTest(CPoint point);

	CControlBar* m_pBar;
	BOOL	m_bValid;
//	UINT	m_nState;
	CRect	m_arrCaption[3];
	BOOL	m_bDown;
	int		m_nTracking;
};

class CMenuButton : public CMenuItem  
{
// Constructors
public:
	CMenuButton(HMENU hMenu, int nIndex);
	static BOOL InitCommonResource();

// Operations
// Overidables
	virtual void Update(CDC*);
	virtual void Layout(CPoint, BOOL bHorz);
	virtual void TrackPopup(CWnd* pWnd);
	virtual BOOL CanTrack() { return TRUE; }
	virtual BOOL CanWrap() { return TRUE; }
	virtual void Validate(BOOL) { /*always valid*/}
	virtual BOOL IsValid() { return TRUE; }
	virtual BOOL GetAccessKey(TCHAR& cKey) { cKey = m_cAccessKey; return TRUE; }

// Implementation
	virtual ~CMenuButton();
	
	// Implementation helper
	// used on Update
	void DrawHot(CDC* pDC);
	void DrawSelect(CDC* pDC);
	void DrawNone(CDC* pDC);
	void DrawHorzText(CDC* pDC, CPoint ptOffset = CPoint(0, 0));
	void DrawVertText(CDC* pDC, CPoint ptOffset = CPoint(0, 0));

	// used on constructing
	void InitButtonStringAndSubMenuHandle(HMENU hMenu, int nIndex);
	void InitHorizontalButtonSize();
	void InitAccessKeyAndVerticalLinePoint();

private:
	CString		m_strBtn;		// string on button
	TCHAR		m_cAccessKey;	// access key
	CPoint		m_ptLineFrom, m_ptLineTo;	// vertical line point on button
	HMENU		m_hSubMenu;		// handle to sub menu
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio 

#endif // !defined(AFX_MENUBARCTRL_H__AF01DCA8_266A_11D3_8FA2_444553540000__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -