www.pudn.com > Tool_CJLibrary609.zip > CJMenuBar.h
// CJMenuBar.h : header file
// Copyright © 1998-1999 CodeJock.com, All Rights Reserved.
// See ReadMe.txt for TERMS OF USE.
//
// Based on the code written by Paul DiLascia for MSJ.
//
/////////////////////////////////////////////////////////////////////////////
/****************************************************************************
*
* $Date: 8/31/99 1:11a $
* $Revision: 5 $
* $Archive: /CodeJockey/Include/CJMenuBar.h $
*
* $History: CJMenuBar.h $
*
* ***************** Version 5 *****************
* User: Kirk Stowell Date: 8/31/99 Time: 1:11a
* Updated in $/CodeJockey/Include
* Updated copyright and contact information.
*
* ***************** Version 4 *****************
* User: Kirk Stowell Date: 7/25/99 Time: 12:42a
* Updated in $/CodeJockey/Include
*
* ***************** Version 3 *****************
* User: Kirk Stowell Date: 6/23/99 Time: 12:33a
* Updated in $/CodeJockey/Include
*
* ***************** Version 2 *****************
* User: Kirk Stowell Date: 7/18/99 Time: 10:13p
* Updated in $/CodeJockey/Include
* Cleaned up inline functions, and import/export macro so that class will
* be imported when linked to, and exported at compile time.
*
* ***************** Version 1 *****************
* User: Kirk Stowell Date: 7/15/99 Time: 12:34a
* Created in $/CodeJockey/Include
* Initial creation. Extended the original class written by Paul DiLascia
* for MSJ. Class uses CCJMenu and fixes some bugs with the original
* class.
*
***************************************************************************/
/////////////////////////////////////////////////////////////////////////////
#ifndef __CJMENUBAR_H__
#define __CJMENUBAR_H__
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "CJToolBar.h"
#include "CJMenu.h" // CCJMenu class declaration
#include "Subclass.h"
//////////////////
// CCJMenuBar uses this private class to intercept messages on behalf
// of its owning frame, as well as the MDI client window. Conceptually,
// these should be two different hooks, but I want to save code.
//
class _CJX_EXT_CLASS CCJMenuBarFrameHook : public CSubclassWnd {
protected:
friend class CCJMenuBar;
CCJMenuBar* m_pMenuBar;
CCJMenuBarFrameHook();
~CCJMenuBarFrameHook();
BOOL Install(CCJMenuBar* pMenuBar, HWND hWndToHook);
virtual LRESULT WindowProc(UINT msg, WPARAM wp, LPARAM lp);
};
typedef enum TRACKINGSTATE { // menubar has three states:
TRACK_NONE = 0, // * normal, not tracking anything
TRACK_BUTTON, // * tracking buttons (F10/Alt mode)
TRACK_POPUP // * tracking popups
};
//////////////////
// CCJMenuBar implements an Office 97-style menu bar. Use it the way you would
// a CToolBar, only you need not call LoadToolbar. All you have to do is
//
// * Create the CCJMenuBar from your OnCreate or OnCreateBands handler.
//
// * Call LoadMenu to load a menu. This will set your frame's menu to NULL.
//
// * Implemenent your frame's PreTranslateMessage function, to call
// CCJMenuBar::TranslateFrameMessage.
//
class _CJX_EXT_CLASS CCJMenuBar : public CCJToolBar
{
DECLARE_DYNAMIC(CCJMenuBar)
// Construction
public:
CCJMenuBar();
virtual ~CCJMenuBar();
virtual BOOL Create(CWnd* pParentWnd,
DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP,
UINT nID = AFX_IDW_TOOLBAR);
virtual BOOL CreateEx(CWnd* pParentWnd, DWORD dwCtrlStyle = TBSTYLE_FLAT,
DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,
CRect rcBorders = CRect(0, 0, 0, 0),
UINT nID = AFX_IDW_TOOLBAR);
// Attributes
public:
BOOL m_bAutoRemoveFrameMenu; // set frame's menu to NULL
protected:
friend class CCJMenuBarFrameHook;
CCJMenuBarFrameHook m_frameHook; // hooks frame window messages
CStringArray m_arStrings; // array of menu item names
int m_nMenuID; // menu resource id.
CCJMenu m_popupMenu; // the menu.
/********** Added by Ming Chang, Time: 04/22/2001 *******/
UINT *m_nToolBarIDs;
int m_nToolBarCount;
/*******************************************************/
// menu tracking stuff:
int m_iPopupTracking; // which popup I'm tracking if any
int m_iNewPopup; // next menu to track
BOOL m_bProcessRightArrow; // process l/r arrow keys?
BOOL m_bProcessLeftArrow; // ...
BOOL m_bEscapeWasPressed; // user pressed escape to exit menu
CPoint m_ptMouse; // mouse location when tracking popup
HMENU m_hMenuTracking; // current popup I'm tracking
CFont m_Font; // menu font.
TRACKINGSTATE m_iTrackingState; // current tracking state
// Operations
public:
/********** Added by Ming Chang, Time: 04/22/2001 *******/
void LoadToolBars(UINT *nToolBarIDs, int nToolBarCount);
/*******************************************************/
BOOL LoadMenu(UINT nID);
CCJMenu* GetMenu(); // get current menu
TRACKINGSTATE GetTrackingState(int& iPopup);
static BOOL bTRACE; // set TRUE to see TRACE msgs
protected:
// helpers
void RecomputeToolbarSize();
void RecomputeMenuLayout();
void UpdateFont();
int GetNextOrPrevButton(int iButton, BOOL bPrev);
void SetTrackingState(TRACKINGSTATE iState, int iButton=-1);
void TrackPopup(int iButton);
void ToggleTrackButtonMode();
void CancelMenuAndTrackNewOne(int iButton);
void OnMenuSelect(HMENU hmenu, UINT nItemID);
CPoint ComputeMenuTrackPoint(const CRect& rcButn, TPMPARAMS& tpm);
BOOL IsValidButton(int iButton) const;
int HitTest(CPoint p) const;
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CCJMenuBar)
public:
virtual BOOL TranslateFrameMessage(MSG* pMsg);
protected:
virtual BOOL OnMenuInput(MSG& m); // handle popup menu input
virtual void OnBarStyleChange(DWORD dwOldStyle, DWORD dwNewStyle);
virtual CSize CalcFixedLayout(BOOL bStretch, BOOL bHorz);
//}}AFX_VIRTUAL
// Implementation
public:
// Generated message map functions
protected:
//{{AFX_MSG(CCJMenuBar)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnUpdateMenuButton(CCmdUI* pCmdUI);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
static LRESULT CALLBACK MenuInputFilter(int code, WPARAM wp, LPARAM lp);
};
/////////////////////////////////////////////////////////////////////////////
// Inline Functions
/////////////////////////////////////////////////////////////////////////////
_CJXLIB_INLINE BOOL CCJMenuBar::IsValidButton(int iButton) const
{ return 0 <= iButton && iButton < GetButtonCount(); }
_CJXLIB_INLINE CCJMenu* CCJMenuBar::GetMenu()
{ return &m_popupMenu; }
_CJXLIB_INLINE TRACKINGSTATE CCJMenuBar::GetTrackingState(int& iPopup)
{ iPopup = m_iPopupTracking; return m_iTrackingState; }
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // __CJMENUBAR_H__