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

📄 newmenu.cpp

📁 一个很好用的串口侦听源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    {
      // Make the font bold
      m_lf.lfWeight = FW_BOLD;
    }

    m_fontMenu.CreateFontIndirect (&m_lf);
    
    // DC of the desktop
    CClientDC myDC(NULL);
    
    // Select menu font in...    
    CFont* pOldFont = myDC.SelectObject (&m_fontMenu);
    //Get pointer to text SK
    const LPCTSTR lpstrText = pMenuData->GetString();
    SIZE size;
    VERIFY(::GetTextExtentPoint32(myDC.m_hDC,lpstrText,(int)_tcslen(lpstrText),&size));
    // Select old font in
    myDC.SelectObject(pOldFont);  
  
    // Set width and height:
    if(bIsMenuBar)
    {
      lpMIS->itemWidth = size.cx ;
    }
    else
    {
      lpMIS->itemWidth = m_iconX + size.cx + m_iconX + GAP;
    }

    // Check the Key-Shortcut
    if(_tcsstr(lpstrText, _T("\t")) != NULL)
      lpMIS->itemWidth += 15;

    int temp = GetSystemMetrics(SM_CYMENU);
    lpMIS->itemHeight = temp>m_iconY+8 ? temp : m_iconY+8;
    
    m_fontMenu.DeleteObject();

    // set status bar as appropriate
    UINT nItemID = (lpMIS->itemID & 0xFFF0);
    // Special case for system menu
    if (nItemID>=SC_SIZE && nItemID<=SC_HOTKEY) 
    {
      BOOL bGetNext = FALSE;
      // search the actual menu item
      for (int j=0;j<m_MenuList.GetUpperBound();++j)
      {
        CNewMenuItemData* pTemp = m_MenuList[j];
        if(pTemp==pMenuData || bGetNext==TRUE)
        {
          bGetNext = TRUE;
          pTemp = m_MenuList[j+1];
          if(pTemp->m_nID)
          {
            lpMIS->itemData = (ULONG_PTR)pTemp;
            lpMIS->itemID = pTemp->m_nID; 
            UINT nOrgWidth = lpMIS->itemWidth;
            MeasureItem_WinXP(lpMIS,bIsMenuBar);
            // Restore old values
            lpMIS->itemData = (ULONG_PTR)pMenuData;
            lpMIS->itemID = pMenuData->m_nID;
            lpMIS->itemWidth = max(lpMIS->itemWidth,nOrgWidth);
            break;
          }
        }
      }
      lpMIS->itemHeight = temp;
    } 
  }
}

void CNewMenu::SetIconSize (int width, int height)
{
  m_iconX = width;
  m_iconY = height;
}

BOOL CNewMenu::AppendODMenu(LPCTSTR 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(UIntToHMenu(nID));
    m_SubMenus.Add(UIntToHMenu(nID));
  }
  
  CNewMenuItemData *mdata = new CNewMenuItemData;
  m_MenuList.Add(mdata);
  mdata->SetString(lpstrText);
  
  mdata->m_nMenuIconNormal = nIconNormal;
  mdata->m_nxOffset=-1;
  if(nIconNormal>=0)
  {
    mdata->m_nxOffset=0;
    LoadFromToolBar(nID,nIconNormal,mdata->m_nxOffset);
    if(mdata->m_pBitmap)
      mdata->m_pBitmap->DeleteImageList();
    else
      mdata->m_pBitmap=new(CImageList);
    mdata->m_pBitmap->Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
    if(!AddBitmapToImageList(mdata->m_pBitmap,nIconNormal))
    {
      mdata->m_pBitmap->DeleteImageList();
      delete mdata->m_pBitmap;
      mdata->m_pBitmap=NULL;
      mdata->m_nMenuIconNormal = nIconNormal = -1;
      mdata->m_nxOffset = -1;
    }
  }
  mdata->m_nFlags = nFlags;
  mdata->m_nID = nID;
  return(CMenu::AppendMenu(nFlags, nID, (LPCTSTR)mdata));
}

BOOL CNewMenu::AppendODMenu(LPCTSTR 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(UIntToHMenu(nID));
    m_SubMenus.Add(UIntToHMenu(nID));
  }

  CNewMenuItemData* mdata = new CNewMenuItemData;
  m_MenuList.Add(mdata);
  mdata->SetString(lpstrText);

  if(il)
  {
    mdata->m_nMenuIconNormal = 0;
    mdata->m_nxOffset=0;
    if(mdata->m_pBitmap)
      mdata->m_pBitmap->DeleteImageList();
    else 
      mdata->m_pBitmap=new(CImageList);
    
    ImageListDuplicate(il,xoffset,mdata->m_pBitmap);
  }
  else
  {
    mdata->m_nMenuIconNormal = -1;
    mdata->m_nxOffset = -1;
  }
  mdata->m_nFlags = nFlags;
  mdata->m_nID = nID;
  return(CMenu::AppendMenu(nFlags, nID, (LPCTSTR)mdata));
}

BOOL CNewMenu::InsertODMenu(UINT nPosition,LPCTSTR lpstrText,UINT nFlags,UINT nID,
                           int nIconNormal)
{
  if(!(nFlags & MF_BYPOSITION))
  {
    int iPosition =0;
    CNewMenu* pMenu = FindMenuOption(nPosition,iPosition);
    if(pMenu)
    {
      return(pMenu->InsertODMenu(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(UIntToHMenu(nID));
    m_SubMenus.InsertAt(nPosition,UIntToHMenu(nID));
  }

  //Stephane Clog suggested adding this, believe it or not it's in the help 
  if(nPosition==(UINT)-1)
    nPosition=GetMenuItemCount();

  CNewMenuItemData *mdata = new CNewMenuItemData;
  m_MenuList.InsertAt(nPosition,mdata);
  mdata->SetString(lpstrText);
  
  mdata->m_nMenuIconNormal = nIconNormal;
  mdata->m_nxOffset=-1;
  if(nIconNormal>=0)
  {
    mdata->m_nxOffset=0;
    LoadFromToolBar(nID,nIconNormal,mdata->m_nxOffset);
    if(mdata->m_pBitmap)
      mdata->m_pBitmap->DeleteImageList();
    else
      mdata->m_pBitmap=new(CImageList);

    mdata->m_pBitmap->Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
    if(!AddBitmapToImageList(mdata->m_pBitmap,nIconNormal))
    {
      mdata->m_pBitmap->DeleteImageList();
      delete mdata->m_pBitmap;
      mdata->m_pBitmap=NULL;
      mdata->m_nMenuIconNormal = nIconNormal = -1;
      mdata->m_nxOffset = -1;
    }
  }
  mdata->m_nFlags = nFlags;
  mdata->m_nID = nID;
  return(CMenu::InsertMenu(nPosition,nFlags,nID,(LPCTSTR)mdata));
}

BOOL CNewMenu::InsertODMenu(UINT nPosition,LPCTSTR lpstrText,UINT nFlags,UINT nID,
                           CImageList *il,int xoffset)
{
  if(!(nFlags & MF_BYPOSITION))
  {
    int iPosition =0;
    CNewMenu* pMenu = FindMenuOption(nPosition,iPosition);
    if(pMenu)
    {
      return(pMenu->InsertODMenu(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(UIntToHMenu(nID));
    m_SubMenus.InsertAt(nPosition,UIntToHMenu(nID));
  }
  
  //Stephane Clog suggested adding this, believe it or not it's in the help 
  if(nPosition==(UINT)-1)
    nPosition=GetMenuItemCount();
  
  CNewMenuItemData *mdata = new CNewMenuItemData;
  m_MenuList.InsertAt(nPosition,mdata);
  mdata->SetString(lpstrText);

  if(il)
  {
    mdata->m_nMenuIconNormal = 0;
    mdata->m_nxOffset=0;
    if(mdata->m_pBitmap)
      mdata->m_pBitmap->DeleteImageList();
    else
      mdata->m_pBitmap=new(CImageList);
    ImageListDuplicate(il,xoffset,mdata->m_pBitmap);
  }
  else
  {
    mdata->m_nMenuIconNormal = -1;
    mdata->m_nxOffset = -1;
  }
  mdata->m_nFlags = nFlags;
  mdata->m_nID = nID;
  return(CMenu::InsertMenu(nPosition,nFlags,nID,(LPCTSTR)mdata));
}

BOOL CNewMenu::ModifyODMenu(LPCTSTR lpstrText,UINT nID,int nIconNormal)
{
  int nLoc;
  CNewMenuItemData *mdata;
  CArray<CNewMenu*,CNewMenu*>newSubs;
  CArray<int,int&>newLocs;

  // Find the old CNewMenuItemData structure:
  CNewMenu *psubmenu = FindMenuOption(nID,nLoc);
  do {
    if(psubmenu && nLoc>=0)
      mdata = psubmenu->m_MenuList[nLoc];
    else
    {
      // Create a new CNewMenuItemData structure:
      mdata = new CNewMenuItemData;
      m_MenuList.Add(mdata);
    }

    ASSERT(mdata);
    if(lpstrText)
      mdata->SetString(lpstrText);
    mdata->m_nMenuIconNormal = nIconNormal;
    mdata->m_nxOffset=-1;
    if(nIconNormal>=0)
    {
      mdata->m_nxOffset=0;
      LoadFromToolBar(nID,nIconNormal,mdata->m_nxOffset);
      if(mdata->m_pBitmap)
        mdata->m_pBitmap->DeleteImageList();
      else
        mdata->m_pBitmap=new CImageList;

      mdata->m_pBitmap->Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
      if(!AddBitmapToImageList(mdata->m_pBitmap,nIconNormal))
      {
        mdata->m_pBitmap->DeleteImageList();
        delete mdata->m_pBitmap;
        mdata->m_pBitmap=NULL;
        mdata->m_nMenuIconNormal = nIconNormal = -1;
        mdata->m_nxOffset = -1;
      }
    }
    mdata->m_nFlags &= ~(MF_BYPOSITION);
    mdata->m_nFlags |= MF_OWNERDRAW;
    mdata->m_nID = nID;
    newSubs.Add(psubmenu);
    newLocs.Add(nLoc);
    if(psubmenu && nLoc>=0)
      psubmenu = FindAnotherMenuOption(nID,nLoc,newSubs,newLocs);
    else 
      psubmenu=NULL;
  
  }while(psubmenu);

  return (CMenu::ModifyMenu(nID,mdata->m_nFlags,nID,(LPCTSTR)mdata));
}

BOOL CNewMenu::ModifyODMenu(LPCTSTR lpstrText,UINT nID,CImageList *pil,int xoffset)
{
  int nLoc;
  CNewMenuItemData *mdata;
  CArray<CNewMenu*,CNewMenu*>newSubs;
  CArray<int,int&>newLocs;
  
  // Find the old CNewMenuItemData structure:
  CNewMenu *psubmenu = FindMenuOption(nID,nLoc);
  do {
    if(psubmenu && nLoc>=0)
    {
      mdata = psubmenu->m_MenuList[nLoc];
    }
    else
    {
      // Create a new CNewMenuItemData structure:
      mdata = new CNewMenuItemData;
      m_MenuList.Add(mdata);
    }

    ASSERT(mdata);
    if(lpstrText)
    {
      mdata->SetString(lpstrText);
    }

    if(pil)
    {
      mdata->m_nMenuIconNormal = 0;
      mdata->m_nxOffset=0;
      if(mdata->m_pBitmap)
        mdata->m_pBitmap->DeleteImageList();
      else 
        mdata->m_pBitmap=new(CImageList);

      ImageListDuplicate(pil,xoffset,mdata->m_pBitmap);
      int x=0;
      int y=0;
      if(psubmenu && ImageList_GetIconSize(pil->m_hImageList,&x,&y))
      {
        // Correct the size of the menuitem
        psubmenu->m_iconX = max(psubmenu->m_iconX,x);
        psubmenu->m_iconY = max(psubmenu->m_iconY,y);
      }
    }
    else
    {
      mdata->m_nMenuIconNormal = -1;
      mdata->m_nxOffset = -1;
    }
    mdata->m_nFlags &= ~(MF_BYPOSITION);
    mdata->m_nFlags |= MF_OWNERDRAW;
    mdata->m_nID = nID;
    newSubs.Add(psubmenu);
    newLocs.Add(nLoc);
    if(psubmenu && nLoc>=0)
      psubmenu = FindAnotherMenuOption(nID,nLoc,newSubs,newLocs);
    else 
      psubmenu=NULL;
  } while(psubmenu);

  return (CMenu::ModifyMenu(nID,mdata->m_nFlags,nID,(LPCTSTR)mdata));
}

BOOL CNewMenu::ModifyODMenu(LPCTSTR lpstrText,UINT nID,CBitmap *bmp)
{
  if (bmp)
  {
    CImageList temp;
    temp.Create(m_iconX,m_iconY,ILC_COLORDDB|ILC_MASK,1,1);
    
    temp.Add(bmp,GetBitmapBackground());

    return ModifyODMenu(lpstrText,nID,&temp,0);
  }
  return ModifyODMenu(lpstrText,nID,NULL,0);
}

BOOL CNewMenu::ModifyODMenu(LPCTSTR lpstrText,UINT nID,COLORREF fill,COLORREF border,int hatchstyle)
{
  // Get device context
  CClientDC DC(0);
  CSize bitmap_size(m_iconX,m_iconY);
  CBitmap bmp;
  ColorBitmap(&DC,bmp,bitmap_size,fill,border,hatchstyle);  
  return ModifyODMenu(lpstrText,nID,&bmp);
}

BOOL CNewMenu::ModifyODMenu(LPCTSTR lpstrText,LPCTSTR OptionText, int nIconNormal)
{
  int nIndex = 0;
  CNewMenu* pOptionMenu = FindMenuOption(OptionText,nIndex);

  if(pOptionMenu!=NULL && nIndex>=0)
  {
    CNewMenuItemData* pmdata = pOptionMenu->m_MenuList[nIndex];
    if(lpstrText)
    {
      pmdata->SetString(lpstrText);
    }
    pmdata->m_nMenuIconNormal = nIconNormal;
    pmdata->m_nxOffset=-1;
    if(nIconNormal>=0)
    {
      pmdata->m_nxOffset=0;
      if(pmdata->m_pBitmap)
        pmdata->m_pBitmap->DeleteImageList();
      else
        pmdata->m_pBitmap=new(CImageList);

      if (!m_bDynIcons)
      {
        CBitmap temp;
        // Try to load the bitmap for getting dimension
        if(temp.LoadBitmap(nIconNormal))
        {
          BITMAP bitmap;
          ZeroMemory(&bitmap,sizeof(bitmap));
          if(temp.GetBitmap(&bitmap))
          {
            pOptionMenu->m_iconX = max(pOptionMenu->m_iconX,bitmap.bmWidth);
            pOptionMenu->m_iconY = max(pOptionMenu->m_iconY,bitmap.bmHeight);
          }
        }
      }

      pmdata->m_pBitmap->Create(pOptionMenu->m_iconX,pOptionMenu->m_iconY,ILC_COLORDDB|ILC_MASK,1,1);

      if(!AddBitmapToImageList(pmdata->m_pBitmap,nIconNormal))
      {
        pmdata->m_pBitmap->DeleteImageList();
        delete pmdata->m_pBitmap;
        pmdata->m_pBitmap=NULL;
        pmdata->m_nMenuIconNormal = nIconNormal = -1;
        pmdata->m_nxOffset = -1;
      }
    }

⌨️ 快捷键说明

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