?? officexpmenu.cpp
字號:
return(returnflag);
}
BOOL COfficeXPMenu::LoadFromToolBar(UINT nID,UINT nToolBar,int& xoffset)
{
int xset,offset;
UINT nStyle;
BOOL returnflag=FALSE;
CToolBar bar;
bar.Create(AfxGetMainWnd());
if(bar.LoadToolBar(nToolBar))
{
offset=bar.CommandToIndex(nID);
if(offset>=0)
{
bar.GetButtonInfo(offset,nID,nStyle,xset);
if(xset>0)xoffset=xset;
returnflag=TRUE;
}
}
return(returnflag);
}
// O.S.
COfficeXPMenuData *COfficeXPMenu::FindMenuItem(UINT nID)
{
COfficeXPMenuData *pData = NULL;
int i;
for(i = 0; i <= m_MenuList.GetUpperBound(); i++)
{
if (m_MenuList[i]->nID == nID)
{
pData = m_MenuList[i];
break;
}
}
if (!pData)
{
int loc;
COfficeXPMenu *pMenu = FindMenuOption(nID, loc);
ASSERT(pMenu != this);
if (loc >= 0)
{
return pMenu->FindMenuItem(nID);
}
}
return pData;
}
COfficeXPMenu *COfficeXPMenu::FindAnotherMenuOption(int nId,int& nLoc,CArray<COfficeXPMenu*,COfficeXPMenu*>&bcsubs,
CArray<int,int&>&bclocs)
{
int i,numsubs,j;
COfficeXPMenu *psubmenu,*pgoodmenu;
BOOL foundflag;
for(i=0;i<(int)(GetMenuItemCount());++i)
{
#ifdef _CPPRTTI
psubmenu=dynamic_cast<COfficeXPMenu *>(GetSubMenu(i));
#else
psubmenu=(COfficeXPMenu *)GetSubMenu(i);
#endif
if(psubmenu)
{
pgoodmenu=psubmenu->FindAnotherMenuOption(nId,nLoc,bcsubs,bclocs);
if(pgoodmenu)return(pgoodmenu);
}
else if(nId==(int)GetMenuItemID(i))
{
numsubs=bcsubs.GetSize();
foundflag=TRUE;
for(j=0;j<numsubs;++j)
{
if(bcsubs[j]==this&&bclocs[j]==i)
{
foundflag=FALSE;
break;
}
}
if(foundflag)
{
nLoc=i;
return(this);
}
}
}
nLoc = -1;
return(NULL);
}
COfficeXPMenu *COfficeXPMenu::FindMenuOption(int nId,int& nLoc)
{
int i;
COfficeXPMenu *psubmenu,*pgoodmenu;
for(i=0;i<(int)(GetMenuItemCount());++i)
{
#ifdef _CPPRTTI
psubmenu=dynamic_cast<COfficeXPMenu *>(GetSubMenu(i));
#else
psubmenu=(COfficeXPMenu *)GetSubMenu(i);
#endif
if(psubmenu)
{
pgoodmenu=psubmenu->FindMenuOption(nId,nLoc);
if(pgoodmenu)return(pgoodmenu);
}
else if(nId==(int)GetMenuItemID(i))
{
nLoc=i;
return(this);
}
}
nLoc = -1;
return(NULL);
}
COfficeXPMenuData *COfficeXPMenu::FindMenuOption(wchar_t *lpstrText)
{
int i,j;
COfficeXPMenu *psubmenu;
COfficeXPMenuData *pmenulist;
for(i=0;i<(int)(GetMenuItemCount());++i)
{
#ifdef _CPPRTTI
psubmenu=dynamic_cast<COfficeXPMenu *>(GetSubMenu(i));
#else
psubmenu=(COfficeXPMenu *)GetSubMenu(i);
#endif
if(psubmenu)
{
pmenulist=psubmenu->FindMenuOption(lpstrText);
if(pmenulist)return(pmenulist);
}
else
{
const wchar_t *szWide;//SK: we use const to prevent misuse of this Ptr
for(j=0;j<=m_MenuList.GetUpperBound();++j)
{
szWide = m_MenuList[j]->GetWideString ();
if(szWide && !wcscmp(lpstrText,szWide))//SK: modified for dynamic allocation
return(m_MenuList[j]);
}
}
}
return(NULL);
}
BOOL COfficeXPMenu::LoadMenu(int nResource)
{
return(COfficeXPMenu::LoadMenu(MAKEINTRESOURCE(nResource)));
};
BOOL COfficeXPMenu::LoadMenu(LPCTSTR lpszResourceName)
{
TRACE(_T(
"IMPORTANT:Use COfficeXPMenu::DestroyMenu to destroy Loaded Menu's\n"));
ASSERT_VALID(this);
ASSERT(lpszResourceName != NULL);
// Find the Menu Resource:
HINSTANCE m_hInst = AfxFindResourceHandle(lpszResourceName,RT_MENU);
HRSRC hRsrc = ::FindResource(m_hInst,lpszResourceName,RT_MENU);
if(hRsrc == NULL)return FALSE;
// Load the Menu Resource:
HGLOBAL hGlobal = LoadResource(m_hInst, hRsrc);
if(hGlobal == NULL)return FALSE;
// Attempt to create us as a menu...
if(!CMenu::CreateMenu())return FALSE;
// Get Item template Header, and calculate offset of MENUITEMTEMPLATES
MENUITEMTEMPLATEHEADER *pTpHdr=
(MENUITEMTEMPLATEHEADER*)LockResource(hGlobal);
BYTE* pTp=(BYTE*)pTpHdr +
(sizeof(MENUITEMTEMPLATEHEADER) + pTpHdr->offset);
// Variables needed during processing of Menu Item Templates:
int j=0;
WORD dwFlags = 0; // Flags of the Menu Item
WORD dwID = 0; // ID of the Menu Item
UINT uFlags; // Actual Flags.
wchar_t *szCaption=NULL;
int nLen = 0; // Length of caption
CTypedPtrArray<CPtrArray, COfficeXPMenu*> m_Stack; // Popup menu stack
CArray<BOOL,BOOL> m_StackEnd; // Popup menu stack
m_Stack.Add(this); // Add it to this...
m_StackEnd.Add(FALSE);
do{
// Obtain Flags and (if necessary), the ID...
memcpy(&dwFlags, pTp, sizeof(WORD));pTp+=sizeof(WORD);// Obtain Flags
if(!(dwFlags & MF_POPUP))
{
memcpy(&dwID, pTp, sizeof(WORD)); // Obtain ID
pTp+=sizeof(WORD);
}
else dwID = 0;
uFlags = (UINT)dwFlags; // Remove MF_END from the flags that will
if(uFlags & MF_END) // be passed to the Append(OD)Menu functions.
uFlags -= MF_END;
// Obtain Caption (and length)
nLen = 0;
szCaption=new wchar_t[wcslen((wchar_t *)pTp)+1];
wcscpy(szCaption,(wchar_t *)pTp);
pTp=&pTp[(wcslen((wchar_t *)pTp)+1)*sizeof(wchar_t)];//modified SK
// Handle popup menus first....
//WideCharToMultiByte
if(dwFlags & MF_POPUP)
{
if(dwFlags & MF_END)m_StackEnd.SetAt(m_Stack.GetUpperBound(),TRUE);
COfficeXPMenu* pSubMenu = new COfficeXPMenu;
pSubMenu->m_unselectcheck=m_unselectcheck;
pSubMenu->m_selectcheck=m_selectcheck;
pSubMenu->checkmaps=checkmaps;
pSubMenu->checkmapsshare=TRUE;
pSubMenu->CreatePopupMenu();
// Append it to the top of the stack:
m_Stack[m_Stack.GetUpperBound()]->AppendODMenuW(szCaption,uFlags,
(UINT)pSubMenu->m_hMenu, -1);
m_Stack.Add(pSubMenu);
m_StackEnd.Add(FALSE);
}
else {
m_Stack[m_Stack.GetUpperBound()]->AppendODMenuW(szCaption, uFlags,
dwID, -1);
if(dwFlags & MF_END)m_StackEnd.SetAt(m_Stack.GetUpperBound(),TRUE);
j = m_Stack.GetUpperBound();
while(j>=0 && m_StackEnd.GetAt(j))
{
m_Stack[m_Stack.GetUpperBound()]->InsertSpaces();
m_Stack.RemoveAt(j);
m_StackEnd.RemoveAt(j);
--j;
}
}
delete[] szCaption;
}while(m_Stack.GetUpperBound() != -1);
for(int i=0;i<(int)GetMenuItemCount();++i)
{
CString str=m_MenuList[i]->GetString();
if(GetSubMenu(i))
{
m_MenuList[i]->nFlags=MF_POPUP|MF_BYPOSITION;
ModifyMenu(i,MF_POPUP|MF_BYPOSITION,
(UINT)GetSubMenu(i)->m_hMenu,str);
}
else
{
m_MenuList[i]->nFlags=MF_STRING|MF_BYPOSITION;
ModifyMenu(i,MF_STRING|MF_BYPOSITION,m_MenuList[i]->nID,str);
}
}
return(TRUE);
}
void COfficeXPMenu::InsertSpaces(void)
{
int i,j,numitems,maxlength;
CString string,newstring;
CSize t;
CFont m_fontMenu;
LOGFONT m_lf;
ZeroMemory ((PVOID) &m_lf,sizeof (LOGFONT));
NONCLIENTMETRICS nm;
nm.cbSize = sizeof (NONCLIENTMETRICS);
VERIFY (SystemParametersInfo (SPI_GETNONCLIENTMETRICS,nm.cbSize,&nm,0));
m_lf = nm.lfMenuFont;
m_fontMenu.CreateFontIndirect (&m_lf);
CWnd *pWnd = AfxGetMainWnd();
CDC *pDC = pWnd->GetDC();
CFont* pFont = pDC->SelectObject (&m_fontMenu);
numitems=GetMenuItemCount();
maxlength = -1;
for(i=0;i<numitems;++i)
{
string=m_MenuList[i]->GetString();
j=string.Find((char)9);
newstring.Empty();
if(j!=-1)newstring=string.Left(j);
else newstring=string;
newstring+=_T(" ");//SK: modified for Unicode correctness.
LPCTSTR lpstrText = (LPCTSTR)newstring;
t=pDC->GetTextExtent(lpstrText,_tcslen(lpstrText));
if(t.cx>maxlength)maxlength = t.cx;
}
for(i=0;i<numitems;++i)
{
string=m_MenuList[i]->GetString();
j=string.Find((char)9);
if(j!=-1)
{
newstring.Empty();
newstring=string.Left(j);
LPCTSTR lpstrText = (LPCTSTR)(newstring);
t=pDC->GetTextExtent(lpstrText,_tcslen(lpstrText));
while(t.cx<maxlength)
{
newstring+=_T(' ');//SK: modified for Unicode correctness
LPCTSTR lpstrText = (LPCTSTR)(newstring);
t=pDC->GetTextExtent(lpstrText,_tcslen(lpstrText));
}
newstring+=string.Mid(j);
#ifdef UNICODE
m_MenuList[i]->SetWideString(newstring);//SK: modified for dynamic allocation
#else
m_MenuList[i]->SetAnsiString(newstring);
#endif
}
}
pDC->SelectObject (pFont); // Select old font in
AfxGetMainWnd()->ReleaseDC(pDC); // Release the DC
m_fontMenu.DeleteObject();
}
void COfficeXPMenu::LoadCheckmarkBitmap(int unselect, int select)
{
if(unselect>0 && select>0)
{
m_selectcheck=select;
m_unselectcheck=unselect;
if(checkmaps)checkmaps->DeleteImageList();
else checkmaps=new(CImageList);
checkmaps->Create(m_iconX,m_iconY,ILC_MASK,2,1);
BOOL flag1=AddBitmapToImageList(checkmaps,unselect);
BOOL flag2=AddBitmapToImageList(checkmaps,select);
if(!flag1||!flag2)
{
checkmaps->DeleteImageList();
delete checkmaps;
checkmaps=NULL;
}
}
}
//--------------------------------------------------------------------------
//[18.06.99 rj]
BOOL COfficeXPMenu::GetMenuText(UINT id, CString& string, UINT nFlags/*= MF_BYPOSITION*/)
{
BOOL returnflag=FALSE;
if(MF_BYPOSITION&nFlags)
{
UINT numMenuItems = m_MenuList.GetUpperBound();
if(id<=numMenuItems)
{
string=m_MenuList[id]->GetString();
returnflag=TRUE;
}
}
else
{
int uiLoc;
COfficeXPMenu* pMenu = FindMenuOption(id,uiLoc);
if(NULL!=pMenu) returnflag = pMenu->GetMenuText(uiLoc,string);
}
return(returnflag);
}
void COfficeXPMenu::DrawRadioDot(CDC *pDC,int x,int y,COLORREF color)
{
CRect rcDot(x,y,x+6,y+6);
CBrush brush;
CPen pen;
brush.CreateSolidBrush(color);
pen.CreatePen(PS_SOLID,0,color);
CBrush *pOldBrush=pDC->SelectObject(&brush);
CPen *pOldPen=pDC->SelectObject(&pen);
pDC->Ellipse(&rcDot);
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
pen.DeleteObject();
brush.DeleteObject();
}
void COfficeXPMenu::DrawCheckMark(CDC* pDC,int x,int y,COLORREF color)
{
CPen m_penBack;
m_penBack.CreatePen (PS_SOLID,0,color);
CPen *pOldPen = pDC->SelectObject (&m_penBack);
pDC->MoveTo(x,y+2);
pDC->LineTo(x,y+5);
pDC->MoveTo(x+1,y+3);
pDC->LineTo(x+1,y+6);
pDC->MoveTo(x+2,y+4);
pDC->LineTo(x+2,y+7);
pDC->MoveTo(x+3,y+3);
pDC->LineTo(x+3,y+6);
pDC->MoveTo(x+4,y+2);
pDC->LineTo(x+4,y+5);
pDC->MoveTo(x+5,y+1);
pDC->LineTo(x+5,y+4);
pDC->MoveTo(x+6,y);
pDC->LineTo(x+6,y+3);
pDC->SelectObject (pOldPen);
m_penBack.DeleteObject();
}
COfficeXPMenuData *COfficeXPMenu::FindMenuList(UINT nID)
{
for(int i=0;i<=m_MenuList.GetUpperBound();++i)
{
if(m_MenuList[i]->nID==nID && !m_MenuList[i]->syncflag)
{
m_MenuList[i]->syncflag=1;
return(m_MenuList[i]);
}
}
return(NULL);
}
void COfficeXPMenu::InitializeMenuList(int value)
{
for(int i=0;i<=m_MenuList.GetUpperBound();++i)
m_MenuList[i]->syncflag=value;
}
void COfficeXPMenu::DeleteMenuList(void)
{
for(int i=0;i<=m_MenuList.GetUpperBound();++i)
{
if(!m_MenuList[i]->syncflag)
{
delete m_MenuList[i];
}
}
}
void COfficeXPMenu::SynchronizeMenu(void)
{
CTypedPtrArray<CPtrArray, COfficeXPMenuData*> temp;
COfficeXPMenuData *mdata;
CString string;
UINT submenu,nID=0,state,j;
InitializeMenuList(0);
for(j=0;j<GetMenuItemCount();++j)
{
mdata=NULL;
state=GetMenuState(j,MF_BYPOSITION);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -