?? officexpmenu.cpp
字號:
return AppendODMenuW(A2W(lpstrText),nFlags,nID,nIconNormal);//SK: See MFC Tech Note 059
}
BOOL COfficeXPMenu::AppendODMenuW(wchar_t *lpstrText,UINT nFlags,UINT nID,
int nIconNormal)
{
// Add the MF_OWNERDRAW flag if not specified:
if(!nID)
{
if(nFlags&MF_BYPOSITION)nFlags=MF_SEPARATOR|MF_OWNERDRAW|MF_BYPOSITION;
else nFlags=MF_SEPARATOR|MF_OWNERDRAW;
}
else if(!(nFlags & MF_OWNERDRAW))nFlags |= MF_OWNERDRAW;
if(nFlags & MF_POPUP)
{
m_AllSubMenus.Add((HMENU)nID);
m_SubMenus.Add((HMENU)nID);
}
COfficeXPMenuData *mdata = new COfficeXPMenuData;
m_MenuList.Add(mdata);
mdata->SetWideString(lpstrText); //SK: modified for dynamic allocation
mdata->menuIconNormal = nIconNormal;
mdata->xoffset=-1;
if(nIconNormal>=0)
{
mdata->xoffset=0;
LoadFromToolBar(nID,nIconNormal,mdata->xoffset);
if(mdata->bitmap)mdata->bitmap->DeleteImageList();
else mdata->bitmap=new(CImageList);
mdata->bitmap->Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
if(!AddBitmapToImageList(mdata->bitmap,nIconNormal))
{
mdata->bitmap->DeleteImageList();
delete mdata->bitmap;
mdata->bitmap=NULL;
mdata->menuIconNormal = nIconNormal = -1;
mdata->xoffset = -1;
}
}
mdata->nFlags = nFlags;
mdata->nID = nID;
return(CMenu::AppendMenu(nFlags, nID, (LPCTSTR)mdata));
}
BOOL COfficeXPMenu::AppendODMenuA(LPCSTR lpstrText,UINT nFlags,UINT nID,
CImageList *il,int xoffset)
{
USES_CONVERSION;
return AppendODMenuW(A2W(lpstrText),nFlags,nID,il,xoffset);
}
BOOL COfficeXPMenu::AppendODMenuW(wchar_t *lpstrText,UINT nFlags,UINT nID,
CImageList *il,int xoffset)
{
// Add the MF_OWNERDRAW flag if not specified:
if(!nID)
{
if(nFlags&MF_BYPOSITION)nFlags=MF_SEPARATOR|MF_OWNERDRAW|MF_BYPOSITION;
else nFlags=MF_SEPARATOR|MF_OWNERDRAW;
}
else if(!(nFlags & MF_OWNERDRAW))nFlags |= MF_OWNERDRAW;
if(nFlags & MF_POPUP)
{
m_AllSubMenus.Add((HMENU)nID);
m_SubMenus.Add((HMENU)nID);
}
COfficeXPMenuData *mdata = new COfficeXPMenuData;
m_MenuList.Add(mdata);
mdata->SetWideString(lpstrText); //SK: modified for dynamic allocation
if(il)
{
mdata->menuIconNormal = 0;
mdata->xoffset=0;
if(mdata->bitmap)mdata->bitmap->DeleteImageList();
else mdata->bitmap=new(CImageList);
ImageListDuplicate(il,xoffset,mdata->bitmap);
}
else
{
mdata->menuIconNormal = -1;
mdata->xoffset = -1;
}
mdata->nFlags = nFlags;
mdata->nID = nID;
return(CMenu::AppendMenu(nFlags, nID, (LPCTSTR)mdata));
}
BOOL COfficeXPMenu::InsertODMenuA(UINT nPosition,LPCSTR lpstrText,UINT nFlags,UINT nID,
int nIconNormal)
{
USES_CONVERSION;
return InsertODMenuW(nPosition,A2W(lpstrText),nFlags,nID,nIconNormal);
}
BOOL COfficeXPMenu::InsertODMenuW(UINT nPosition,wchar_t *lpstrText,UINT nFlags,UINT nID,
int nIconNormal)
{
if(!(nFlags & MF_BYPOSITION))
{
int iPosition =0;
COfficeXPMenu* pMenu = FindMenuOption(nPosition,iPosition);
if(pMenu)
{
return(pMenu->InsertODMenuW(iPosition,lpstrText,nFlags|MF_BYPOSITION,nID,nIconNormal));
}
else return(FALSE);
}
if(!nID)nFlags=MF_SEPARATOR|MF_OWNERDRAW|MF_BYPOSITION;
else if(!(nFlags & MF_OWNERDRAW))nFlags |= MF_OWNERDRAW;
if(nFlags & MF_POPUP)
{
m_AllSubMenus.Add((HMENU)nID);
m_SubMenus.InsertAt(nPosition,(HMENU)nID);
}
//Stephane Clog suggested adding this, believe it or not it's in the help
if(nPosition==(UINT)-1)nPosition=GetMenuItemCount();
COfficeXPMenuData *mdata = new COfficeXPMenuData;
m_MenuList.InsertAt(nPosition,mdata);
mdata->SetWideString(lpstrText); //SK: modified for dynamic allocation
mdata->menuIconNormal = nIconNormal;
mdata->xoffset=-1;
if(nIconNormal>=0)
{
mdata->xoffset=0;
LoadFromToolBar(nID,nIconNormal,mdata->xoffset);
if(mdata->bitmap)mdata->bitmap->DeleteImageList();
else mdata->bitmap=new(CImageList);
mdata->bitmap->Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
if(!AddBitmapToImageList(mdata->bitmap,nIconNormal))
{
mdata->bitmap->DeleteImageList();
delete mdata->bitmap;
mdata->bitmap=NULL;
mdata->menuIconNormal = nIconNormal = -1;
mdata->xoffset = -1;
}
}
mdata->nFlags = nFlags;
mdata->nID = nID;
return(CMenu::InsertMenu(nPosition,nFlags,nID,(LPCTSTR)mdata));
}
BOOL COfficeXPMenu::InsertODMenuA(UINT nPosition,LPCSTR lpstrText,UINT nFlags,UINT nID,
CImageList *il,int xoffset)
{
USES_CONVERSION;
return InsertODMenuW(nPosition,A2W(lpstrText),nFlags,nID,il,xoffset);
}
BOOL COfficeXPMenu::InsertODMenuW(UINT nPosition,wchar_t *lpstrText,UINT nFlags,UINT nID,
CImageList *il,int xoffset)
{
if(!(nFlags & MF_BYPOSITION))
{
int iPosition =0;
COfficeXPMenu* pMenu = FindMenuOption(nPosition,iPosition);
if(pMenu)
{
return(pMenu->InsertODMenuW(iPosition,lpstrText,nFlags|MF_BYPOSITION,nID,il,xoffset));
}
else return(FALSE);
}
if(!nID)nFlags=MF_SEPARATOR|MF_OWNERDRAW|MF_BYPOSITION;
else if(!(nFlags & MF_OWNERDRAW))nFlags |= MF_OWNERDRAW;
if(nFlags & MF_POPUP)
{
m_AllSubMenus.Add((HMENU)nID);
m_SubMenus.InsertAt(nPosition,(HMENU)nID);
}
//Stephane Clog suggested adding this, believe it or not it's in the help
if(nPosition==(UINT)-1)nPosition=GetMenuItemCount();
COfficeXPMenuData *mdata = new COfficeXPMenuData;
m_MenuList.InsertAt(nPosition,mdata);
mdata->SetWideString(lpstrText); //SK: modified for dynamic allocation
if(il)
{
mdata->menuIconNormal = 0;
mdata->xoffset=0;
if(mdata->bitmap)mdata->bitmap->DeleteImageList();
else mdata->bitmap=new(CImageList);
ImageListDuplicate(il,xoffset,mdata->bitmap);
}
else
{
mdata->menuIconNormal = -1;
mdata->xoffset = -1;
}
mdata->nFlags = nFlags;
mdata->nID = nID;
return(CMenu::InsertMenu(nPosition,nFlags,nID,(LPCTSTR)mdata));
}
BOOL COfficeXPMenu::ModifyODMenuA(const char * lpstrText,UINT nID,int nIconNormal)
{
USES_CONVERSION;
return ModifyODMenuW(A2W(lpstrText),nID,nIconNormal);//SK: see MFC Tech Note 059
}
BOOL COfficeXPMenu::ModifyODMenuW(wchar_t *lpstrText,UINT nID,int nIconNormal)
{
int nLoc;
COfficeXPMenuData *mdata;
CArray<COfficeXPMenu*,COfficeXPMenu*>bcsubs;
CArray<int,int&>bclocs;
// Find the old COfficeXPMenuData structure:
COfficeXPMenu *psubmenu = FindMenuOption(nID,nLoc);
do{
if(psubmenu && nLoc>=0)mdata = psubmenu->m_MenuList[nLoc];
else
{
// Create a new COfficeXPMenuData structure:
mdata = new COfficeXPMenuData;
m_MenuList.Add(mdata);
}
ASSERT(mdata);
if(lpstrText)
mdata->SetWideString(lpstrText); //SK: modified for dynamic allocation
mdata->menuIconNormal = nIconNormal;
mdata->xoffset=-1;
if(nIconNormal>=0)
{
mdata->xoffset=0;
LoadFromToolBar(nID,nIconNormal,mdata->xoffset);
if(mdata->bitmap)mdata->bitmap->DeleteImageList();
else mdata->bitmap=new CImageList;
mdata->bitmap->Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
if(!AddBitmapToImageList(mdata->bitmap,nIconNormal))
{
mdata->bitmap->DeleteImageList();
delete mdata->bitmap;
mdata->bitmap=NULL;
mdata->menuIconNormal = nIconNormal = -1;
mdata->xoffset = -1;
}
}
mdata->nFlags &= ~(MF_BYPOSITION);
mdata->nFlags |= MF_OWNERDRAW;
mdata->nID = nID;
bcsubs.Add(psubmenu);
bclocs.Add(nLoc);
if(psubmenu && nLoc>=0)psubmenu = FindAnotherMenuOption(nID,nLoc,bcsubs,bclocs);
else psubmenu=NULL;
}while(psubmenu);
return (CMenu::ModifyMenu(nID,mdata->nFlags,nID,(LPCTSTR)mdata));
}
BOOL COfficeXPMenu::ModifyODMenuA(const char * lpstrText,UINT nID,CImageList *il,int xoffset)
{
USES_CONVERSION;
return ModifyODMenuW(A2W(lpstrText),nID,il,xoffset);
}
BOOL COfficeXPMenu::ModifyODMenuW(wchar_t *lpstrText,UINT nID,CImageList *il,int xoffset)
{
int nLoc;
COfficeXPMenuData *mdata;
CArray<COfficeXPMenu*,COfficeXPMenu*>bcsubs;
CArray<int,int&>bclocs;
// Find the old COfficeXPMenuData structure:
COfficeXPMenu *psubmenu = FindMenuOption(nID,nLoc);
do{
if(psubmenu && nLoc>=0)mdata = psubmenu->m_MenuList[nLoc];
else
{
// Create a new COfficeXPMenuData structure:
mdata = new COfficeXPMenuData;
m_MenuList.Add(mdata);
}
ASSERT(mdata);
if(lpstrText)
mdata->SetWideString(lpstrText); //SK: modified for dynamic allocation
if(il)
{
mdata->menuIconNormal = 0;
mdata->xoffset=0;
if(mdata->bitmap)mdata->bitmap->DeleteImageList();
else mdata->bitmap=new(CImageList);
ImageListDuplicate(il,xoffset,mdata->bitmap);
}
else
{
mdata->menuIconNormal = -1;
mdata->xoffset = -1;
}
mdata->nFlags &= ~(MF_BYPOSITION);
mdata->nFlags |= MF_OWNERDRAW;
mdata->nID = nID;
bcsubs.Add(psubmenu);
bclocs.Add(nLoc);
if(psubmenu && nLoc>=0)psubmenu = FindAnotherMenuOption(nID,nLoc,bcsubs,bclocs);
else psubmenu=NULL;
}while(psubmenu);
return (CMenu::ModifyMenu(nID,mdata->nFlags,nID,(LPCTSTR)mdata));
}
BOOL COfficeXPMenu::ModifyODMenuA(const char * lpstrText,UINT nID,CBitmap *bmp)
{
USES_CONVERSION;
return ModifyODMenuW(A2W(lpstrText),nID,bmp);
}
BOOL COfficeXPMenu::ModifyODMenuW(wchar_t *lpstrText,UINT nID,CBitmap *bmp)
{
if(bmp)
{
CImageList temp;
temp.Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
if(m_bitmapBackgroundFlag)temp.Add(bmp,m_bitmapBackground);
else temp.Add(bmp,GetSysColor(COLOR_3DFACE));
return ModifyODMenuW(lpstrText,nID,&temp,0);
}
return ModifyODMenuW(lpstrText,nID,NULL,0);
}
// courtesy of Warren Stevens
BOOL COfficeXPMenu::ModifyODMenuA(const char * lpstrText,UINT nID,COLORREF fill,COLORREF border,int hatchstyle)
{
USES_CONVERSION;
return ModifyODMenuW(A2W(lpstrText),nID,fill,border,hatchstyle);
}
BOOL COfficeXPMenu::ModifyODMenuW(wchar_t *lpstrText,UINT nID,COLORREF fill,COLORREF border,int hatchstyle)
{
CWnd *pWnd = AfxGetMainWnd(); // Get main window
CDC *pDC = pWnd->GetDC(); // Get device context
CSize bitmap_size(m_iconX,m_iconY);
CBitmap bmp;
ColorBitmap(pDC,bmp,bitmap_size,fill,border,hatchstyle);
return ModifyODMenuW(lpstrText,nID,&bmp);
}
BOOL COfficeXPMenu::ModifyODMenuA(const char *lpstrText,const char *OptionText,
int nIconNormal)
{
USES_CONVERSION;
return ModifyODMenuW(A2W(lpstrText),A2W(OptionText),nIconNormal);//SK: see MFC Tech Note 059
}
BOOL COfficeXPMenu::ModifyODMenuW(wchar_t *lpstrText,wchar_t *OptionText,
int nIconNormal)
{
COfficeXPMenuData *mdata;
// Find the old COfficeXPMenuData structure:
CString junk=OptionText;
mdata=FindMenuOption(OptionText);
if(mdata)
{
if(lpstrText)
mdata->SetWideString(lpstrText);//SK: modified for dynamic allocation
mdata->menuIconNormal = nIconNormal;
mdata->xoffset=-1;
if(nIconNormal>=0)
{
mdata->xoffset=0;
if(mdata->bitmap)mdata->bitmap->DeleteImageList();
else mdata->bitmap=new(CImageList);
mdata->bitmap->Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
if(!AddBitmapToImageList(mdata->bitmap,nIconNormal))
{
mdata->bitmap->DeleteImageList();
delete mdata->bitmap;
mdata->bitmap=NULL;
mdata->menuIconNormal = nIconNormal = -1;
mdata->xoffset = -1;
}
}
return(TRUE);
}
return(FALSE);
}
COfficeXPMenuData *COfficeXPMenu::NewODMenu(UINT pos,UINT nFlags,UINT nID,CString string)
{
COfficeXPMenuData *mdata;
mdata = new COfficeXPMenuData;
mdata->menuIconNormal = -1;
mdata->xoffset=-1;
#ifdef UNICODE
mdata->SetWideString((LPCTSTR)string);//SK: modified for dynamic allocation
#else
mdata->SetAnsiString(string);
#endif
mdata->nFlags = nFlags;
mdata->nID = nID;
// if(nFlags & MF_POPUP)m_AllSubMenus.Add((HMENU)nID);
if (nFlags&MF_OWNERDRAW)
{
ASSERT(!(nFlags&MF_STRING));
ModifyMenu(pos,nFlags,nID,(LPCTSTR)mdata);
}
else if (nFlags&MF_STRING)
{
ASSERT(!(nFlags&MF_OWNERDRAW));
ModifyMenu(pos,nFlags,nID,mdata->GetString());
}
else
{
ASSERT(nFlags&MF_SEPARATOR);
ModifyMenu(pos,nFlags,nID);
}
return(mdata);
};
BOOL COfficeXPMenu::LoadToolbars(const UINT *arID,int n)
{
ASSERT(arID);
BOOL returnflag=TRUE;
for(int i=0;i<n;++i)
{
if(!LoadToolbar(arID[i]))returnflag=FALSE;
}
return(returnflag);
}
BOOL COfficeXPMenu::LoadToolbar(UINT nToolBar)
{
UINT nID,nStyle;
BOOL returnflag=FALSE;
CToolBar bar;
int xoffset=-1,xset;
bar.Create(AfxGetMainWnd());
if(bar.LoadToolBar(nToolBar))
{
CImageList imglist;
imglist.Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
if(AddBitmapToImageList(&imglist,nToolBar))
{
returnflag=TRUE;
for(int i=0;i<bar.GetCount();++i)
{
nID = bar.GetItemID(i);
if(nID && GetMenuState(nID, MF_BYCOMMAND)
!=0xFFFFFFFF)
{
xoffset=bar.CommandToIndex(nID);
if(xoffset>=0)
{
bar.GetButtonInfo(xoffset,nID,nStyle,xset);
if(xset>0)xoffset=xset;
}
ModifyODMenu(NULL,nID,&imglist,xoffset);
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -