⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bcmenu.cpp

📁 eCos1.31版
💻 CPP
📖 第 1 页 / 共 4 页
字号:
          if(tablocr!=-1) pDC->DrawText (rightStr,&offset,nFormatr);          pDC->SetTextColor(GetSysColor(COLOR_GRAYTEXT));          pDC->DrawText(leftStr,rectt, nFormat);          if(tablocr!=-1) pDC->DrawText (rightStr,rectt,nFormatr);        }        else{        // And the standard Grey text:          pDC->SetTextColor(m_clrBack);          pDC->DrawText(leftStr,rectt, nFormat);          if(tablocr!=-1) pDC->DrawText (rightStr,rectt,nFormatr);        }      }      pFont = pDC->SelectObject (&dispFont);      pDC->SetBkMode( iOldMode );      pDC->SelectObject (pFont); //set it to the old font    }    m_penBack.DeleteObject();    m_brBackground.DeleteObject();    m_fontMenu.DeleteObject();    m_brSelect.DeleteObject();    dispFont.DeleteObject ();  }}BOOL BCMenu::GetBitmapFromImageList(CDC* pDC,CImageList *imglist,int nIndex,CBitmap &bmp){	HICON hIcon = imglist->ExtractIcon(nIndex);	CDC dc;	dc.CreateCompatibleDC(pDC);	bmp.CreateCompatibleBitmap(pDC,m_iconX,m_iconY);	CBitmap* pOldBmp = dc.SelectObject(&bmp);	CBrush brush ;	brush.CreateSolidBrush(GetSysColor(COLOR_MENU));	::DrawIconEx(			dc.GetSafeHdc(),			0,			0,			hIcon,			m_iconX,			m_iconY,			0,			(HBRUSH)brush,			DI_NORMAL	);	dc.SelectObject( pOldBmp );	dc.DeleteDC();	// the icon is not longer needed	DestroyIcon(hIcon);	return(TRUE);}/*==========================================================================void BCMenu::MeasureItem(LPMEASUREITEMSTRUCT)---------------------------------------------Called by the framework when it wants to know what the width and heightof our item will be.  To accomplish this we provide the width of theicon plus the width of the menu text, and then the height of the icon. ==========================================================================*/void BCMenu::MeasureItem( LPMEASUREITEMSTRUCT lpMIS ){  UINT state = (((BCMenuData*)(lpMIS->itemData))->nFlags);  if(state & MF_SEPARATOR){    lpMIS->itemWidth = 0;    lpMIS->itemHeight = GetSystemMetrics(SM_CYMENU)>>1;  }  else{    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);    // Obtain the width of the text:    CWnd *pWnd = AfxGetMainWnd();            // Get main window    CDC *pDC = pWnd->GetDC();              // Get device context    CFont* pFont=NULL;    // Select menu font in...        if (IsNewShell())        pFont = pDC->SelectObject (&m_fontMenu);// Select menu font in...            //Get pointer to text SK    const wchar_t *lpstrText = ((BCMenuData*)(lpMIS->itemData))->GetWideString();//SK: we use const to prevent misuse                SIZE size;    if (Win32s!=g_Shell)      VERIFY(::GetTextExtentPoint32W(pDC->m_hDC,lpstrText,             wcslen(lpstrText),&size)); //SK should also work on 95#ifndef UNICODE //can't be UNICODE for Win32s    else{//it's Win32suckx      RECT rect;      rect.left=rect.top=0;      size.cy=DrawText(pDC->m_hDC,(LPCTSTR)lpstrText,                       wcslen(lpstrText),&rect,                       DT_SINGLELINE|DT_LEFT|DT_VCENTER|DT_CALCRECT);      //+3 makes at least three pixels space to the menu border      size.cx=rect.right-rect.left+3;      size.cx += 3*(size.cx/wcslen(lpstrText));    }#endif        CSize t = CSize(size);    if(IsNewShell())      pDC->SelectObject (pFont);  // Select old font in    AfxGetMainWnd()->ReleaseDC(pDC);  // Release the DC    // Set width and height:    lpMIS->itemWidth = m_iconX + t.cx + m_iconX + GAP;    int temp = GetSystemMetrics(SM_CYMENU);    lpMIS->itemHeight = temp>m_iconY+4 ? temp : m_iconY+4;    m_fontMenu.DeleteObject();  }}void BCMenu::SetIconSize (int width, int height){  m_iconX = width;  m_iconY = height;}BOOL BCMenu::AppendODMenuA(LPCSTR lpstrText,UINT nFlags,UINT nID,                           int nIconNormal){USES_CONVERSION;return AppendODMenuW(A2W(lpstrText),nFlags,nID,nIconNormal);//SK: See MFC Tech Note 059}BOOL BCMenu::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);	}  BCMenuData *mdata = new BCMenuData;  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 BCMenu::AppendODMenuA(LPCSTR lpstrText,UINT nFlags,UINT nID,                           CImageList *il,int xoffset){USES_CONVERSION;return AppendODMenuW(A2W(lpstrText),nFlags,nID,il,xoffset);}BOOL BCMenu::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);	}  BCMenuData *mdata = new BCMenuData;  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 BCMenu::InsertODMenuA(UINT nPosition,LPCSTR lpstrText,UINT nFlags,UINT nID,                           int nIconNormal){USES_CONVERSION;return InsertODMenuW(nPosition,A2W(lpstrText),nFlags,nID,nIconNormal);}BOOL BCMenu::InsertODMenuW(UINT nPosition,wchar_t *lpstrText,UINT nFlags,UINT nID,                           int nIconNormal){  if(!(nFlags & MF_BYPOSITION)){		int iPosition =0;		BCMenu* 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);	}  BCMenuData *mdata = new BCMenuData;  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 BCMenu::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 BCMenu::InsertODMenuW(UINT nPosition,wchar_t *lpstrText,UINT nFlags,UINT nID,                           CImageList *il,int xoffset){  if(!(nFlags & MF_BYPOSITION)){		int iPosition =0;		BCMenu* 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);	}  BCMenuData *mdata = new BCMenuData;  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 BCMenu::ModifyODMenuA(const char * lpstrText,UINT nID,int nIconNormal){USES_CONVERSION;return ModifyODMenuW(A2W(lpstrText),nID,nIconNormal);//SK: see MFC Tech Note 059}BOOL BCMenu::ModifyODMenuW(wchar_t *lpstrText,UINT nID,int nIconNormal){  int nLoc;  BCMenuData *mdata;  // Find the old BCMenuData structure:  BCMenu *psubmenu = FindMenuOption(nID,nLoc);  if(psubmenu && nLoc>=0)mdata = psubmenu->m_MenuList[nLoc];  else{  // Create a new BCMenuData structure:    mdata = new BCMenuData;    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_BYCOMMAND | MF_OWNERDRAW;  mdata->nID = nID;  return (CMenu::ModifyMenu(nID,mdata->nFlags,nID,(LPCTSTR)mdata));}BOOL BCMenu::ModifyODMenuA(const char * lpstrText,UINT nID,CImageList *il,int xoffset){USES_CONVERSION;return ModifyODMenuW(A2W(lpstrText),nID,il,xoffset);}BOOL BCMenu::ModifyODMenuW(wchar_t *lpstrText,UINT nID,CImageList *il,int xoffset){  int nLoc;  BCMenuData *mdata;  // Find the old BCMenuData structure:  BCMenu *psubmenu = FindMenuOption(nID,nLoc);  if(psubmenu && nLoc>=0)mdata = psubmenu->m_MenuList[nLoc];  else{  // Create a new BCMenuData structure:    mdata = new BCMenuData;    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_BYCOMMAND | MF_OWNERDRAW;  mdata->nID = nID;  return (CMenu::ModifyMenu(nID,mdata->nFlags,nID,(LPCTSTR)mdata));}BOOL BCMenu::ModifyODMenuA(const char * lpstrText,UINT nID,CBitmap *bmp){USES_CONVERSION;return ModifyODMenuW(A2W(lpstrText),nID,bmp);}BOOL BCMenu::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);}BOOL BCMenu::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 BCMenu::ModifyODMenuW(wchar_t *lpstrText,wchar_t *OptionText,                           int nIconNormal){  BCMenuData *mdata;  // Find the old BCMenuData 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);}BCMenuData *BCMenu::NewODMenu(UINT pos,UINT nFlags,UINT nID,CString string){  BCMenuData *mdata;  mdata = new BCMenuData;  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);};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -