📄 newmenu.h
字号:
CNewMenu* FindAnotherMenuOption(int nId, int& nLoc, CArray<CNewMenu*,CNewMenu*>&newSubs, CArray<int,int&>&newLocs);
CNewMenuItemData* NewODMenu(UINT pos, UINT nFlags, UINT nID, LPCTSTR string);
void SynchronizeMenu();
void InitializeMenuList(int value);
void DeleteMenuList();
CNewMenuItemData* FindMenuList(UINT nID);
CNewMenuItemData* CheckMenuItemData(ULONG_PTR nItemData) const;
void DrawSpecial_OldStyle(CDC* pDC, LPCRECT pRect, UINT nID, DWORD dwStyle);
void DrawSpecial_WinXP(CDC* pDC, LPCRECT pRect, UINT nID, DWORD dwStyle);
void DrawSpecialCharStyle(CDC* pDC, LPCRECT pRect, TCHAR Sign, DWORD dwStyle);
void DrawSpecialChar(CDC* pDC, LPCRECT pRect, TCHAR Sign, BOOL bBold);
void DrawMenuTitle(LPDRAWITEMSTRUCT lpDIS, BOOL bIsMenuBar);
// Measure an item
void MeasureItem_OldStyle( LPMEASUREITEMSTRUCT lpMIS, BOOL bIsMenuBar);
void DrawItem_OldStyle (LPDRAWITEMSTRUCT lpDIS, BOOL bIsMenubar);
BOOL Draw3DCheckmark(CDC* dc, const CRect& rc, HBITMAP hbmCheck, DWORD dwStyle);
void MeasureItem_WinXP( LPMEASUREITEMSTRUCT lpMIS, BOOL bIsMenuBar);
void DrawItem_WinXP (LPDRAWITEMSTRUCT lpDIS, BOOL bIsMenuBar);
void DrawItem_SpecialStyle (LPDRAWITEMSTRUCT lpDIS, BOOL bIsMenubar);
// BOOL ImageListDuplicate(CImageList* il,int xoffset,CImageList* newlist);
void ColorBitmap(CDC* pDC, CBitmap& bmp, CSize size, COLORREF fill, COLORREF border, int hatchstyle=-1);
// Member Variables
public:
static DWORD m_dwLastActiveItem;
protected:
// Stores list of menu items
CTypedPtrArray<CPtrArray, CNewMenuItemData*> m_MenuItemList;
// When loading an owner-drawn menu using a Resource, CNewMenu must keep track of
// the popup menu's that it creates. Warning, this list *MUST* be destroyed
// last item first :)
// Stores list of sub-menus
CTypedPtrArray<CPtrArray, HMENU> m_SubMenus;
static BOOL m_bEnableXpBlendig;
static BOOL m_bSelectDisable;
static CMenuTheme* m_pActMenuDrawing;
static LOGFONT m_MenuTitleFont;
static CTypedPtrList<CPtrList, CNewMenuIcons*>* m_pSharedMenuIcons;
int m_iconX;
int m_iconY;
COLORREF m_bitmapBackground;
CImageList* m_checkmaps;
BOOL m_checkmapsshare;
int m_selectcheck;
int m_unselectcheck;
BOOL m_bDynIcons;
HMENU m_hParentMenu;
BOOL m_bIsPopupMenu;
CRect m_LastActiveMenuRect;
DWORD m_dwOpenMenu;
void* m_pData;
};
/////////////////////////////////////////////////////////////////////////////
// CNewFrame<> template for easy using of the new menu
template<class baseClass>
class CNewFrame : public baseClass
{
typedef CNewFrame<baseClass> MyNewFrame;
public:
CNewMenu m_DefaultNewMenu;
CNewMenu m_SystemNewMenu;
public:
CNewFrame()
{
m_bInMenuLoop = FALSE;
m_TimerID = NULL;
m_menubarItemIndex = UINT(-1);
}
// control bar docking
void EnableDocking(DWORD dwDockStyle);
private:
static const AFX_MSGMAP_ENTRY _messageEntries[];
protected:
static const AFX_MSGMAP messageMap;
BOOL m_bInMenuLoop;
UINT m_TimerID;
UINT m_menubarItemIndex;
#if _MFC_VER < 0x0700
static const AFX_MSGMAP* PASCAL _GetBaseMessageMap()
{
return &baseClass::messageMap;
};
#else
static const AFX_MSGMAP* PASCAL GetThisMessageMap()
{
return &CNewFrame<baseClass>::messageMap;
}
#endif
virtual const AFX_MSGMAP* GetMessageMap() const
{
return &CNewFrame<baseClass>::messageMap;
}
static const AFX_MSGMAP_ENTRY* GetMessageEntries()
{
static const AFX_MSGMAP_ENTRY Entries[] =
{
ON_WM_MEASUREITEM()
ON_WM_MENUCHAR()
ON_WM_INITMENUPOPUP()
ON_WM_ENTERMENULOOP()
ON_WM_EXITMENULOOP()
ON_WM_TIMER()
ON_WM_CREATE()
ON_WM_NCHITTEST()
ON_WM_DESTROY()
ON_WM_SYSCOLORCHANGE()
{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 }
};
return Entries;
}
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (baseClass::OnCreate(lpCreateStruct) == -1)
return -1;
m_SystemNewMenu.Attach(::GetSystemMenu(m_hWnd,FALSE));
return 0;
}
afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
baseClass::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
CNewMenu::OnInitMenuPopup(m_hWnd,pPopupMenu, nIndex, bSysMenu);
}
afx_msg void OnSysColorChange()
{
baseClass::OnSysColorChange();
CNewMenu::OnSysColorChange();
}
afx_msg void OnEnterMenuLoop(BOOL bIsTrackPopupMenu)
{
m_bInMenuLoop = TRUE;
if(m_TimerID!=NULL)
{
KillTimer(m_TimerID);
m_TimerID = NULL;
}
if (m_menubarItemIndex!=UINT(-1))
{
DrawMenubarItem(this,GetMenu(),m_menubarItemIndex,NULL);
m_menubarItemIndex=UINT(-1);
}
baseClass::OnEnterMenuLoop(bIsTrackPopupMenu);
}
afx_msg void OnExitMenuLoop(BOOL bIsTrackPopupMenu)
{
m_bInMenuLoop = FALSE;
baseClass::OnExitMenuLoop(bIsTrackPopupMenu);
}
afx_msg void OnTimer(UINT_PTR nIDEvent)
{
baseClass::OnTimer(nIDEvent);
if(m_TimerID==nIDEvent)
{
CPoint pt;
GetCursorPos(&pt);
SendMessage(WM_NCHITTEST, 0, MAKELONG(pt.x, pt.y));
}
}
afx_msg void OnDestroy()
{
if(m_TimerID!=NULL)
{
KillTimer(m_TimerID);
m_TimerID = NULL;
}
baseClass::OnDestroy();
}
afx_msg UINT OnNcHitTest(CPoint point)
{
UINT nHitCode = baseClass::OnNcHitTest(point);
// Test Win85/98/me and Win NT 4.0
if(g_Shell<Win2000 || bRemoteSession)
{
UINT nStatus = IsChild(GetFocus()) ? 0: ODS_INACTIVE;
CNewMenu* pNewMenu = DYNAMIC_DOWNCAST(CNewMenu,GetMenu());
if (!m_bInMenuLoop && nHitCode == HTMENU)
{
// I support only CNewMenu ownerdrawings menu!!
if(pNewMenu)
{
UINT nItemIndex = MenuItemFromPoint(m_hWnd, pNewMenu->m_hMenu, point);
if ( nItemIndex!=(UINT)-1 )
{
if(m_menubarItemIndex!=nItemIndex)
{
// Clear the old Item
DrawMenubarItem(this,pNewMenu,m_menubarItemIndex,nStatus);
// Draw the hotlight item.
if(DrawMenubarItem(this,pNewMenu,nItemIndex,ODS_HOTLIGHT|nStatus))
{
// Set a new Timer
if(m_TimerID==NULL)
{
m_TimerID=GetSafeTimerID(m_hWnd,100);
}
m_menubarItemIndex = nItemIndex;
}
else
{
m_menubarItemIndex = UINT(-1);
}
}
else
{
// Draw the hotlight item again.
if(CNewMenu::m_dwLastActiveItem==NULL &&
DrawMenubarItem(this,pNewMenu,nItemIndex,ODS_HOTLIGHT|nStatus))
{
// Set a new Timer
if(m_TimerID==NULL)
{
m_TimerID=GetSafeTimerID(m_hWnd,100);
}
m_menubarItemIndex = nItemIndex;
}
}
return nHitCode;
}
}
}
if (m_menubarItemIndex!=UINT(-1))
{
DrawMenubarItem(this,pNewMenu,m_menubarItemIndex,nStatus);
m_menubarItemIndex=UINT(-1);
}
if(m_TimerID!=NULL)
{
KillTimer(m_TimerID);
m_TimerID=NULL;
}
}
return nHitCode;
}
afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMIS)
{
if(!CNewMenu::OnMeasureItem(GetCurrentMessage()))
{
baseClass::OnMeasureItem(nIDCtl, lpMIS);
}
}
afx_msg LRESULT OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu)
{
LRESULT lresult;
if( DYNAMIC_DOWNCAST(CNewMenu,pMenu) )
lresult=CNewMenu::FindKeyboardShortcut(nChar, nFlags, pMenu);
else
lresult=baseClass::OnMenuChar(nChar, nFlags, pMenu);
return lresult;
}
};
#ifdef _AFXDLL
#if _MFC_VER < 0x0700
template<class baseClass>
const AFX_MSGMAP CNewFrame<baseClass>::messageMap = { &CNewFrame<baseClass>::_GetBaseMessageMap, GetMessageEntries()};
#else
template<class baseClass>
const AFX_MSGMAP CNewFrame<baseClass>::messageMap = { &baseClass::GetThisMessageMap, GetMessageEntries()};
#endif
#else
template<class baseClass>
const AFX_MSGMAP CNewFrame<baseClass>::messageMap = { &baseClass::messageMap, GetMessageEntries()};
#endif
/////////////////////////////////////////////////////////////////////////////
// CNewMiniDockFrameWnd for docking toolbars with new menu
class CNewMiniDockFrameWnd: public CNewFrame<CMiniDockFrameWnd>
{
DECLARE_DYNCREATE(CNewMiniDockFrameWnd)
};
// control bar docking
template<class baseClass>
void CNewFrame<baseClass>::EnableDocking(DWORD dwDockStyle)
{
baseClass::EnableDocking(dwDockStyle);
// Owerite registering for floating frame
m_pFloatingFrameClass = RUNTIME_CLASS(CNewMiniDockFrameWnd);
}
/////////////////////////////////////////////////////////////////////////////
// CNewDialog for dialog implementation
class CNewDialog : public CNewFrame<CDialog>
{
DECLARE_DYNAMIC(CNewDialog);
public:
CNewDialog();
CNewDialog(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);
CNewDialog(UINT nIDTemplate, CWnd* pParentWnd = NULL);
// Overridables (special message map entries)
virtual BOOL OnInitDialog();
protected:
// Generated message map functions
//{{AFX_MSG(CNewDialog)
afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
// CNewMiniFrameWnd for menu to documents
class CNewMiniFrameWnd : public CNewFrame<CMiniFrameWnd>
{
DECLARE_DYNCREATE(CNewMiniFrameWnd)
};
/////////////////////////////////////////////////////////////////////////////
// CNewMDIChildWnd for menu to documents
class CNewMDIChildWnd : public CNewFrame<CMDIChildWnd>
{
DECLARE_DYNCREATE(CNewMDIChildWnd)
};
/////////////////////////////////////////////////////////////////////////////
// CNewFrameWnd for menu to documents
class CNewFrameWnd : public CNewFrame<CFrameWnd>
{
DECLARE_DYNCREATE(CNewFrameWnd)
public:
#if _MFC_VER < 0x0700
// dynamic creation - load frame and associated resources
virtual BOOL LoadFrame(UINT nIDResource,
DWORD dwDefaultStyle = WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
CWnd* pParentWnd = NULL,
CCreateContext* pContext = NULL);
#endif
// under MFC 7.0 the next function is virtual so we don't neet to owerwrite
// loadframe
BOOL Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle = WS_OVERLAPPEDWINDOW,
const RECT& rect = rectDefault,
CWnd* pParentWnd = NULL, // != NULL for popups
LPCTSTR lpszMenuName = NULL,
DWORD dwExStyle = 0,
CCreateContext* pContext = NULL);
};
/////////////////////////////////////////////////////////////////////////////
// CNewMDIFrameWnd for menu to documents
class CNewMDIFrameWnd : public CNewFrame<CMDIFrameWnd>
{
DECLARE_DYNCREATE(CNewMDIFrameWnd);
public:
#if _MFC_VER < 0x0700
// dynamic creation - load frame and associated resources
virtual BOOL LoadFrame(UINT nIDResource,
DWORD dwDefaultStyle = WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
CWnd* pParentWnd = NULL,
CCreateContext* pContext = NULL);
#endif
// under MFC 7.0 the next function is virtual so we don't neet to owerwrite
// loadframe
BOOL Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle = WS_OVERLAPPEDWINDOW,
const RECT& rect = rectDefault,
CWnd* pParentWnd = NULL, // != NULL for popups
LPCTSTR lpszMenuName = NULL,
DWORD dwExStyle = 0,
CCreateContext* pContext = NULL);
};
/////////////////////////////////////////////////////////////////////////////
// CNewMultiDocTemplate for menu to documents
class CNewMultiDocTemplate: public CMultiDocTemplate
{
DECLARE_DYNAMIC(CNewMultiDocTemplate)
public:
CNewMenu m_NewMenuShared;
// Constructors
public:
CNewMultiDocTemplate(UINT nIDResource, CRuntimeClass* pDocClass,
CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass);
~CNewMultiDocTemplate();
};
#pragma warning(pop)
#endif // __CNewMenu_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -