📄 menuext.h
字号:
#if !defined(AFX_CMENUEXT_H__INCLUDED_)
#define AFX_CMENUEXT_H__INCLUDED_
#include <afxtempl.h>
// CMenuExtData用来记录一个菜单项数据
class CMenuExtData
{
public:
CMenuExtData()
{
xoffset = -1;
menuIconNormal = -1;
nFlags = 0;
nID = 0;
syncflag = 0;
bitmap = NULL;
pContext = NULL;
m_szMenuText = NULL;
}
~CMenuExtData ();
void SetAnsiString(LPCSTR szAnsiString);
void SetWideString(const wchar_t *szWideString);
CString GetString(); //返回菜单文本串(ANSI或UNICODE)
const wchar_t *GetWideString() { return m_szMenuText; }
public:
int xoffset;
int menuIconNormal;
UINT nFlags,nID,syncflag;
CImageList *bitmap;
void *pContext; // used to attach user data
protected:
wchar_t *m_szMenuText;
};
struct CMenuItemInfo : public tagMENUITEMINFOA
/*
#ifndef UNICODE
tagMENUITEMINFOA
#else
tagMENUITEMINFOW
#endif
// 此结构可以参照MENUITEMINFO结构来使用
*/
{
CMenuItemInfo()
{
memset(this,0,sizeof(MENUITEMINFO));
cbSize = sizeof(MENUITEMINFO);
}
};
typedef enum { Normal,TextOnly } HIGHLIGHTSTYLE;
#define AppendMenu AppendMenuA
#define InsertMenu InsertMenuA
#define InsertODMenu InsertODMenuA
#define AppendODMenu AppendODMenuA
#define ModifyODMenu ModifyODMenuA
#define AppendODPopupMenu AppendODPopupMenuA
/*
#ifndef UNICODE
#define AppendMenu AppendMenuA
#define InsertMenu InsertMenuA
#define InsertODMenu InsertODMenuA
#define AppendODMenu AppendODMenuA
#define AppendODPopupMenu AppendODPopupMenuA
#define ModifyODMenu ModifyODMenuA
#else
#define AppendMenu AppendMenuW
#define InsertMenu InsertMenuW
#define InsertODMenu InsertODMenuW
#define AppendODMenu AppendODMenuW
#define ModifyODMenu ModifyODMenuW
#define AppendODPopupMenu AppendODPopupMenuW
#endif
*/
class CMenuExt : public CMenu
{
// Construction
public:
CMenuExt();
// Attributes
protected:
CTypedPtrArray<CPtrArray, CMenuExtData*> m_MenuList; //保存各个菜单项的列表
CTypedPtrArray<CPtrArray, HMENU> m_SubMenus; //保存子菜单列表
//保存所有生成的CMenuExt(主要用来存储所有的弹出菜单带有的每个子菜单项)
static CTypedPtrArray<CPtrArray, HMENU> m_AllSubMenus;
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CCustomMenu)
//}}AFX_VIRTUAL
// Implementation
public:
static BOOL IsNewShell();
static LRESULT FindKeyboardShortcut(UINT nChar,UINT nFlags,CMenu *pMenu);
static void UpdateMenu(CMenu *pMenu);
static BOOL IsMenu(CMenu *subMenu);
static BOOL IsMenu(HMENU subMenu);
static HBITMAP LoadSysColorBitmap(int nResourceId);
void SetBitmapBackground(COLORREF color);
void SetDisableOldStyle();
void UnSetDisableOldStyle();
void UnSetBitmapBackground();
BOOL GetDisableOldStyle();
BOOL AddBitmapToImageList(CImageList *list,UINT nResourceID);
BOOL LoadFromToolBar(UINT nID,UINT nToolBar,int& xoffset);
BOOL GetMenuText(UINT id,CString &string,UINT nFlags = MF_BYPOSITION );
void InsertSpaces();
void DrawCheckMark(CDC *pDC,int x,int y,COLORREF color);
void DrawRadioDot(CDC *pDC,int x,int y,COLORREF color);
CMenuExtData *CMenuExt::FindMenuItem(UINT nID);
CMenuExt *FindMenuOption(int nId,int& nLoc);
CMenuExtData *FindMenuOption(wchar_t *lpstrText);
CImageList *checkmaps;
BOOL checkmapsshare;
int m_selectcheck;
int m_unselectcheck;
BOOL m_bDynIcons;
void LoadCheckmarkBitmap(int unselect,int select);
void DitherBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HBITMAP hbm, int nXSrc, int nYSrc);
void DitherBlt2(CDC *drawdc, int nXDest, int nYDest, int nWidth, int nHeight, CBitmap &bmp, int nXSrc, int nYSrc);
BOOL GetBitmapFromImageList(CDC* pDC,CImageList *imglist,int nIndex,CBitmap &bmp);
BOOL ImageListDuplicate(CImageList *il,int xoffset,CImageList *newlist);
virtual ~CMenuExt();
virtual void DrawItem( LPDRAWITEMSTRUCT); //菜单项显示
virtual void MeasureItem( LPMEASUREITEMSTRUCT );
void SetIconSize (int, int); //设置图标大小
BOOL AppendODMenuA(LPCSTR lpstrText,UINT nFlags = MF_OWNERDRAW, UINT nID = 0, int nIconNormal = -1);
BOOL AppendODMenuW(wchar_t *lpstrText, UINT nFlags = MF_OWNERDRAW, UINT nID = 0, int nIconNormal = -1);
BOOL AppendODMenuA(LPCSTR lpstrText, UINT nFlags, UINT nID, CImageList *il, int xoffset);
BOOL AppendODMenuW(wchar_t *lpstrText, UINT nFlags, UINT nID, CImageList *il, int xoffset);
BOOL InsertODMenuA(UINT nPosition, LPCSTR lpstrText, UINT nFlags = MF_OWNERDRAW, UINT nID = 0,int nIconNormal = -1);
BOOL InsertODMenuW(UINT nPosition, wchar_t *lpstrText, UINT nFlags = MF_OWNERDRAW, UINT nID = 0, int nIconNormal = -1);
BOOL InsertODMenuA(UINT nPosition, LPCSTR lpstrText, UINT nFlags, UINT nID, CImageList *il, int xoffset);
BOOL InsertODMenuW(UINT nPosition, wchar_t *lpstrText, UINT nFlags, UINT nID, CImageList *il, int xoffset);
BOOL ModifyODMenuA(const char *lpstrText,UINT nID=0,int nIconNormal=-1);
BOOL ModifyODMenuA(const char *lpstrText,UINT nID,CImageList *il,int xoffset);
BOOL ModifyODMenuA(const char *lpstrText,UINT nID,CBitmap *bmp);
BOOL ModifyODMenuA(const char *lpstrText,const char *OptionText,int nIconNormal);
BOOL ModifyODMenuW(wchar_t *lpstrText,UINT nID=0,int nIconNormal=-1);
BOOL ModifyODMenuW(wchar_t *lpstrText,UINT nID,CImageList *il,int xoffset);
BOOL ModifyODMenuW(wchar_t *lpstrText,UINT nID,CBitmap *bmp);
BOOL ModifyODMenuW(wchar_t *lpstrText,wchar_t *OptionText,int nIconNormal);
CMenuExtData *NewODMenu(UINT pos,UINT nFlags,UINT nID,CString string);
void SynchronizeMenu(void);
void CMenuExt::InitializeMenuList(int value);
void CMenuExt::DeleteMenuList(void);
CMenuExtData *CMenuExt::FindMenuList(UINT nID);
virtual BOOL LoadMenu(LPCTSTR lpszResourceName);
virtual BOOL LoadMenu(UINT nID);
void AddFromToolBar(CToolBar* pToolBar, int nResourceID);
BOOL Draw3DCheckmark(CDC *dc, const CRect& rc,BOOL bSelected,HBITMAP hbmCheck);
BOOL LoadToolbar(UINT nToolBar);
BOOL LoadToolbars(const UINT *arID,int n);
// 重载是为了动态菜单使用
BOOL RemoveMenu(UINT uiId,UINT nFlags);
BOOL DeleteMenu(UINT uiId,UINT nFlags);
BOOL AppendMenuA(UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,int nIconNormal=-1);
BOOL AppendMenuA(UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CImageList *il,int xoffset);
BOOL AppendMenuA(UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CBitmap *bmp);
BOOL AppendMenuW(UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,int nIconNormal=-1);
BOOL AppendMenuW(UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CImageList *il,int xoffset);
BOOL AppendMenuW(UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CBitmap *bmp);
BOOL InsertMenuA(UINT nPosition,UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,int nIconNormal=-1);
BOOL InsertMenuA(UINT nPosition,UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CImageList *il,int xoffset);
BOOL InsertMenuA(UINT nPosition,UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CBitmap *bmp);
BOOL InsertMenuW(UINT nPosition,UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,int nIconNormal=-1);
BOOL InsertMenuW(UINT nPosition,UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CImageList *il,int xoffset);
BOOL InsertMenuW(UINT nPosition,UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CBitmap *bmp);
CMenuExt* AppendODPopupMenuA(LPCSTR lpstrText);
CMenuExt* AppendODPopupMenuW(wchar_t *lpstrText);
virtual BOOL DestroyMenu();
// Generated message map functions
protected:
int m_iconX,m_iconY;
COLORREF m_bitmapBackground;
BOOL m_bitmapBackgroundFlag;
BOOL disable_old_style;
};
#endif
/*
使用说明:
ModifyODMenu -- 可以使您任意修改所需要显示图标的菜单项
LoadToolbar -- 可以一次性将所有的菜单项都加上图标(只要工具条中存在对应的命令)
基本操作实例:
CMenuExt PopMenu;
PopMenu.LoadMenu(IDR_POPUPMENU);
PopMenu.ModifyODMenu(NULL,ID_EDIT_PASTE,IDR_MAINFRAME);
PopMenu.ModifyODMenu(NULL,ID_APP_ABOUT,IDR_MAINFRAME);
PopMenu.ModifyODMenu(NULL,_T("&Rocscience on the Web"),IDB_NET);//SK modified for Unicode
//(或)PopMenu.LoadToolbar(IDR_MAINFRAME);
//下面操作同CMenu
ClientToScreen(&point);
CMenuExt *pSub = (CMenuExt *)PopMenu.GetSubMenu(0);
pSub->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,AfxGetMainWnd());
PopMenu.DestroyMenu();
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -