📄 newmenu.h
字号:
// Function to set how menu is drawn, either original or XP style
static UINT GetMenuDrawMode();
static UINT SetMenuDrawMode(UINT mode);
// Function to set how disabled items are drawn
//(mode=FALSE means they are not drawn selected)
static BOOL SetSelectDisableMode(BOOL mode);
static BOOL GetSelectDisableMode();
// Function to set how icons were drawn in normal mode
//(enable=TRUE means they are drawn blended)
static BOOL SetXpBlendig(BOOL bEnable=TRUE);
static BOOL GetXpBlendig();
// Function to set how default menu border were drawn
//(enable=TRUE means that all menu in the application has the same border)
static BOOL SetNewMenuBorderAllMenu(BOOL bEnable=TRUE);
static BOOL GetNewMenuBorderAllMenu();
static void OnSysColorChange();
// Static functions used for handling menu's in the mainframe
static LRESULT FindKeyboardShortcut(UINT nChar,UINT nFlags,CMenu *pMenu);
static BOOL OnMeasureItem(const MSG* pMsg);
static void OnInitMenuPopup(HWND hWnd, CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu);
// Helperfunction to find the menu to the item
static CMenu* FindPopupMenuFromID(CMenu* pMenu, UINT nID);
static CMenu* FindPopupMenuFromID(HMENU hMenu, UINT nID);
static CMenu* FindPopupMenuFromIDData(CMenu* pMenu, UINT nID, ULONG_PTR pData);
static CMenu* FindPopupMenuFromIDData(HMENU hMenu, UINT nID, ULONG_PTR pData);
virtual void OnInitMenuPopup();
virtual BOOL OnUnInitPopupMenu();
// Customizing:
// Set icon size
void SetIconSize(int width, int height);
// set the color in the bitmaps that is the background transparent color
COLORREF SetBitmapBackground(COLORREF newColor);
COLORREF GetBitmapBackground();
// Return the last itemrect from a menubaritem.
CRect GetLastActiveMenuRect();
HMENU GetParent();
BOOL IsPopup();
BOOL SetPopup(BOOL bIsPopup=TRUE);
BOOL SetItemData(UINT uiId, DWORD_PTR dwItemData, BOOL fByPos = FALSE);
BOOL SetItemDataPtr(UINT uiId, void* pItemData, BOOL fByPos = FALSE);
DWORD_PTR GetItemData(UINT uiId, BOOL fByPos = FALSE) const;
void* GetItemDataPtr(UINT uiId, BOOL fByPos = FALSE) const;
BOOL SetMenuData(DWORD_PTR dwMenuData);
BOOL SetMenuDataPtr(void* pMenuData);
DWORD_PTR GetMenuData() const;
void* GetMenuDataPtr() const;
// Miscellaneous Protected Member functions
protected:
CNewMenuIcons* GetMenuIcon(int &nIndex, UINT nID, CImageList *pil, int xoffset);
CNewMenuIcons* GetMenuIcon(int &nIndex, int nID);
CNewMenuIcons* GetMenuIcon(int &nIndex, CBitmap* pBmp);
CNewMenuIcons* GetToolbarIcons(UINT nToolBar, HMODULE hInst=NULL);
DWORD SetMenuIcons(CNewMenuIcons* pMenuIcons);
BOOL Replace(UINT nID, UINT nNewID);
static BOOL IsNewShell();
BOOL IsMenuBar(HMENU hMenu=NULL);
void SetLastMenuRect(HDC hDC, LPRECT pRect);
CNewMenuItemData* FindMenuItem(UINT nID);
CNewMenu* FindMenuOption(int nId, int& nLoc);
CNewMenu* FindMenuOption(LPCTSTR lpstrText, int& nLoc);
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);
void MeasureItem_Icy( LPMEASUREITEMSTRUCT lpMIS, BOOL bIsMenuBar);
void DrawItem_Icy (LPDRAWITEMSTRUCT lpDIS, BOOL bIsMenubar);
BOOL Draw3DCheckmark(CDC* dc, CRect rc, HBITMAP hbmpChecked, HBITMAP hbmpUnchecked, DWORD dwState);
void MeasureItem_WinXP( LPMEASUREITEMSTRUCT lpMIS, BOOL bIsMenuBar);
void DrawItem_WinXP (LPDRAWITEMSTRUCT lpDIS, BOOL bIsMenuBar);
void DrawItem_XP_2003 (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_bEnableXpBlending;
static BOOL m_bNewMenuBorderAllMenu;
static BOOL m_bSelectDisable;
static CMenuTheme* m_pActMenuDrawing;
static LOGFONT m_MenuTitleFont;
static CTypedPtrList<CPtrList, CNewMenuIcons*>* m_pSharedMenuIcons;
int m_iconX;
int m_iconY;
HWND m_hTempOwner;
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()
#ifdef USE_NEW_DOCK_BAR
ON_WM_NCPAINT()
ON_WM_PAINT()
ON_WM_ACTIVATEAPP()
ON_WM_ACTIVATE()
#endif //USE_NEW_DOCK_BAR
{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 }
};
return Entries;
}
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (baseClass::OnCreate(lpCreateStruct) == -1)
return -1;
if(m_SystemNewMenu.m_hMenu)
{
::DestroyMenu(m_SystemNewMenu.Detach());
}
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();
UpdateMenuBarColor(m_DefaultNewMenu);
}
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 Win95/98/me and Win NT 4.0
if(g_Shell<Win2000 || bRemoteSession)
{
UINT nStatus;
UINT nHotlightStatus;
if( IsChild(GetFocus()) )
{
nStatus = 0;
nHotlightStatus = ODS_HOTLIGHT;
}
else if(g_Shell==Win95 || g_Shell==WinNT4)
{ // Win95 or winNt 4.0 do not have an inactive menubar
nStatus = 0;
nHotlightStatus = 0;
}
else
{
nStatus = ODS_INACTIVE;
nHotlightStatus = ODS_HOTLIGHT|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,nHotlightStatus))
{
// Set a new Timer
if(m_TimerID==NULL)
{
m_TimerID=GetSafeTimerID(m_hWnd,100);
}
m_menubarItemIndex = nItemIndex;
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -