📄 bcmenu.cpp
字号:
if(menusize!=(pBCMenu->m_MenuList.GetUpperBound()+1)) pBCMenu->SynchronizeMenu(); for(int i=0;i<menusize;++i){ if(pBCMenu->GetMenuText(i,menutext)){ menutext.MakeLower(); if(menutext.Find(key)>=0)return(MAKELRESULT(i,2)); } } } return(0);}void BCMenu::DitherBlt (HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HBITMAP hbm, int nXSrc, int nYSrc){ ASSERT(hdcDest && hbm); ASSERT(nWidth > 0 && nHeight > 0); // Create a generic DC for all BitBlts HDC hDC = CreateCompatibleDC(hdcDest); ASSERT(hDC); if (hDC) { // Create a DC for the monochrome DIB section HDC bwDC = CreateCompatibleDC(hDC); ASSERT(bwDC); if (bwDC) { // Create the monochrome DIB section with a black and white palette struct { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[2]; } RGBBWBITMAPINFO = { { // a BITMAPINFOHEADER sizeof(BITMAPINFOHEADER), // biSize nWidth, // biWidth; nHeight, // biHeight; 1, // biPlanes; 1, // biBitCount BI_RGB, // biCompression; 0, // biSizeImage; 0, // biXPelsPerMeter; 0, // biYPelsPerMeter; 0, // biClrUsed; 0 // biClrImportant; }, { { 0x00, 0x00, 0x00, 0x00 }, { 0xFF, 0xFF, 0xFF, 0x00 } } }; VOID *pbitsBW; HBITMAP hbmBW = CreateDIBSection(bwDC, (LPBITMAPINFO)&RGBBWBITMAPINFO, DIB_RGB_COLORS, &pbitsBW, NULL, 0); ASSERT(hbmBW); if (hbmBW) { // Attach the monochrome DIB section and the bitmap to the DCs HBITMAP olddib = (HBITMAP)SelectObject(bwDC, hbmBW); HBITMAP hdcolddib = (HBITMAP)SelectObject(hDC, hbm); // BitBlt the bitmap into the monochrome DIB section BitBlt(bwDC, 0, 0, nWidth, nHeight, hDC, nXSrc, nYSrc, SRCCOPY); // Paint the destination rectangle in gray FillRect(hdcDest, CRect(nXDest, nYDest, nXDest + nWidth, nYDest + nHeight), GetSysColorBrush((IsNewShell())?COLOR_3DFACE:COLOR_MENU)); //SK: looks better on the old shell // BitBlt the black bits in the monochrome bitmap into COLOR_3DHILIGHT // bits in the destination DC // The magic ROP comes from the Charles Petzold's book HBRUSH hb = CreateSolidBrush(GetSysColor(COLOR_3DHILIGHT)); HBRUSH oldBrush = (HBRUSH)SelectObject(hdcDest, hb); BitBlt(hdcDest,nXDest+1,nYDest+1,nWidth,nHeight,bwDC,0,0,0xB8074A); // BitBlt the black bits in the monochrome bitmap into COLOR_3DSHADOW // bits in the destination DC hb = CreateSolidBrush(GetSysColor(COLOR_3DSHADOW)); DeleteObject(SelectObject(hdcDest, hb)); BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight,bwDC,0,0,0xB8074A); DeleteObject(SelectObject(hdcDest, oldBrush)); VERIFY(DeleteObject(SelectObject(bwDC, olddib))); SelectObject(hDC, hdcolddib); } VERIFY(DeleteDC(bwDC)); } VERIFY(DeleteDC(hDC)); }}BOOL BCMenu::AddBitmapToImageList(CImageList *bmplist,UINT nResourceID){// O.S. if (m_bDynIcons){ bmplist->Add((HICON)nResourceID); return TRUE; } BOOL bReturn=TRUE; HBITMAP hbmp=LoadSysColorBitmap(nResourceID); if(hbmp){ CBitmap bmp; bmp.Attach(hbmp); if(m_bitmapBackgroundFlag) bmplist->Add(&bmp,m_bitmapBackground); else bmplist->Add(&bmp,GetSysColor(COLOR_3DFACE)); bmp.Detach(); DeleteObject(hbmp); bReturn=TRUE; } else bReturn = FALSE; return(bReturn);}void BCMenu::SetBitmapBackground(COLORREF color){ m_bitmapBackground=color; m_bitmapBackgroundFlag=TRUE;}void BCMenu::UnSetBitmapBackground(void){ m_bitmapBackgroundFlag=FALSE;}// Given a toolbar, append all the options from it to this menu// Passed a ptr to the toolbar object and the toolbar ID// Author : Robert Edward Caldecottvoid BCMenu::AddFromToolBar(CToolBar* pToolBar, int nResourceID){ for (int i = 0; i < pToolBar->GetCount(); i++) { UINT nID = pToolBar->GetItemID(i); // See if this toolbar option // appears as a command on this // menu or is a separator if (nID == 0 || GetMenuState(nID, MF_BYCOMMAND) == 0xFFFFFFFF) continue; // Item doesn't exist UINT nStyle; int nImage; // Get the toolbar button info pToolBar->GetButtonInfo(i, nID, nStyle, nImage); // OK, we have the command ID of the toolbar // option, and the tollbar bitmap offset int nLoc; BCMenuData* pData; BCMenu *pSubMenu = FindMenuOption(nID, nLoc); if (pSubMenu && nLoc >= 0)pData = pSubMenu->m_MenuList[nLoc]; else { // Create a new BCMenuData structure pData = new BCMenuData; m_MenuList.Add(pData); } // Set some default structure members pData->menuIconNormal = nResourceID; pData->nID = nID; pData->nFlags = MF_BYCOMMAND | MF_OWNERDRAW; pData->xoffset = nImage; if (pData->bitmap)pData->bitmap->DeleteImageList(); else pData->bitmap = new CImageList; pData->bitmap->Create(m_iconX, m_iconY,ILC_COLORDDB|ILC_MASK, 1, 1); if(!AddBitmapToImageList(pData->bitmap, nResourceID)){ pData->bitmap->DeleteImageList(); delete pData->bitmap; pData->bitmap=NULL; pData->menuIconNormal = -1; pData->xoffset = -1; } // Modify our menu ModifyMenu(nID,pData->nFlags,nID,(LPCTSTR)pData); }}BOOL BCMenu::Draw3DCheckmark(CDC *dc, const CRect& rc, BOOL bSelected, HBITMAP hbmCheck){ CRect rcDest = rc; CBrush brush; COLORREF col=GetSysColor((bSelected||!IsNewShell())?COLOR_MENU:COLOR_3DLIGHT);//SK: Looks better on the old shell brush.CreateSolidBrush(col); dc->FillRect(rcDest,&brush); brush.DeleteObject(); if (IsNewShell()) //SK: looks better on the old shell dc->DrawEdge(&rcDest, BDR_SUNKENOUTER, BF_RECT); if (!hbmCheck)DrawCheckMark(dc,rc.left+4,rc.top+4,GetSysColor(COLOR_MENUTEXT)); else DrawRadioDot(dc,rc.left+5,rc.top+4,GetSysColor(COLOR_MENUTEXT)); return TRUE;}void BCMenu::DitherBlt2(CDC *drawdc, int nXDest, int nYDest, int nWidth, int nHeight, CBitmap &bmp, int nXSrc, int nYSrc){ // create a monochrome memory DC CDC ddc; ddc.CreateCompatibleDC(0); CBitmap bwbmp; bwbmp.CreateCompatibleBitmap(&ddc, nWidth, nHeight); CBitmap * pddcOldBmp = ddc.SelectObject(&bwbmp); CDC dc; dc.CreateCompatibleDC(0); CBitmap * pdcOldBmp = dc.SelectObject(&bmp); // build a mask ddc.PatBlt(0, 0, nWidth, nHeight, WHITENESS); dc.SetBkColor(GetSysColor(COLOR_BTNFACE)); ddc.BitBlt(0, 0, nWidth, nHeight, &dc, nXSrc,nYSrc, SRCCOPY); dc.SetBkColor(GetSysColor(COLOR_BTNHILIGHT)); ddc.BitBlt(0, 0, nWidth, nHeight, &dc, nXSrc,nYSrc, SRCPAINT); // Copy the image from the toolbar into the memory DC // and draw it (grayed) back into the toolbar. dc.FillSolidRect(0,0, nWidth, nHeight, GetSysColor((IsNewShell())?COLOR_3DFACE:COLOR_MENU)); //SK: Looks better on the old shell dc.SetBkColor(RGB(0, 0, 0)); dc.SetTextColor(RGB(255, 255, 255)); CBrush brShadow, brHilight; brHilight.CreateSolidBrush(GetSysColor(COLOR_BTNHILIGHT)); brShadow.CreateSolidBrush(GetSysColor(COLOR_BTNSHADOW)); CBrush * pOldBrush = dc.SelectObject(&brHilight); dc.BitBlt(0,0, nWidth, nHeight, &ddc, 0, 0, 0x00E20746L); drawdc->BitBlt(nXDest+1,nYDest+1,nWidth, nHeight, &dc,0,0,SRCCOPY); dc.BitBlt(1,1, nWidth, nHeight, &ddc, 0, 0, 0x00E20746L); dc.SelectObject(&brShadow); dc.BitBlt(0,0, nWidth, nHeight, &ddc, 0, 0, 0x00E20746L); drawdc->BitBlt(nXDest,nYDest,nWidth, nHeight, &dc,0,0,SRCCOPY); // reset DCs ddc.SelectObject(pddcOldBmp); ddc.DeleteDC(); dc.SelectObject(pOldBrush); dc.SelectObject(pdcOldBmp); dc.DeleteDC(); brShadow.DeleteObject(); brHilight.DeleteObject(); bwbmp.DeleteObject();}void BCMenu::SetDisableOldStyle(void){ disable_old_style=TRUE;}void BCMenu::UnSetDisableOldStyle(void){ disable_old_style=FALSE;}BOOL BCMenu::GetDisableOldStyle(void){ return(disable_old_style);}HBITMAP BCMenu::LoadSysColorBitmap(int nResourceId){ HINSTANCE hInst = AfxFindResourceHandle(MAKEINTRESOURCE(nResourceId),RT_BITMAP); HRSRC hRsrc = ::FindResource(hInst,MAKEINTRESOURCE(nResourceId),RT_BITMAP); if (hRsrc == NULL) return NULL; return AfxLoadSysColorBitmap(hInst, hRsrc, FALSE);}BOOL BCMenu::RemoveMenu(UINT uiId,UINT nFlags){ if(MF_BYPOSITION&nFlags){ UINT uint = GetMenuState(uiId,MF_BYPOSITION); if(uint&MF_SEPARATOR && !(uint&MF_POPUP)){ delete m_MenuList.GetAt(uiId); m_MenuList.RemoveAt(uiId); } else{ BCMenu* pSubMenu = (BCMenu*) GetSubMenu(uiId); if(NULL==pSubMenu){ UINT uiCommandId = GetMenuItemID(uiId); for(int i=0;i<m_MenuList.GetSize(); i++){ if(m_MenuList[i]->nID==uiCommandId){ delete m_MenuList.GetAt(i); m_MenuList.RemoveAt(i); break; } } } else{ int numSubMenus = m_SubMenus.GetUpperBound(); for(int m = numSubMenus; m >= 0; m--){ if(m_SubMenus[m]==pSubMenu->m_hMenu){ int numAllSubMenus = m_AllSubMenus.GetUpperBound(); for(int n = numAllSubMenus; n>= 0; n--){ if(m_AllSubMenus[n]==m_SubMenus[m])m_AllSubMenus.RemoveAt(n); } m_SubMenus.RemoveAt(m); } } int num = pSubMenu->GetMenuItemCount(); for(int i=num-1;i>=0;--i)pSubMenu->RemoveMenu(i,MF_BYPOSITION); for(i=m_MenuList.GetUpperBound();i>=0;i--){ if(m_MenuList[i]->nID==(UINT)pSubMenu->m_hMenu){ delete m_MenuList.GetAt(i); m_MenuList.RemoveAt(i); break; } } delete pSubMenu; } } } else{ int iPosition =0; BCMenu* pMenu = FindMenuOption(uiId,iPosition); if(pMenu)pMenu->RemoveMenu(iPosition,MF_BYPOSITION); } return CMenu::RemoveMenu(uiId,nFlags);}BOOL BCMenu::DeleteMenu(UINT uiId,UINT nFlags){ if(MF_BYPOSITION&nFlags){ UINT uint = GetMenuState(uiId,MF_BYPOSITION); if(uint&MF_SEPARATOR && !(uint&MF_POPUP)){ delete m_MenuList.GetAt(uiId); m_MenuList.RemoveAt(uiId); } else{ BCMenu* pSubMenu = (BCMenu*) GetSubMenu(uiId); if(NULL==pSubMenu){ UINT uiCommandId = GetMenuItemID(uiId); for(int i=0;i<m_MenuList.GetSize(); i++){ if(m_MenuList[i]->nID==uiCommandId){ delete m_MenuList.GetAt(i); m_MenuList.RemoveAt(i); break; } } } else{ int numSubMenus = m_SubMenus.GetUpperBound(); for(int m = numSubMenus; m >= 0; m--){ if(m_SubMenus[m]==pSubMenu->m_hMenu){ int numAllSubMenus = m_AllSubMenus.GetUpperBound(); for(int n = numAllSubMenus; n>= 0; n--){ if(m_AllSubMenus[n]==m_SubMenus[m])m_AllSubMenus.RemoveAt(n); } m_SubMenus.RemoveAt(m); } } int num = pSubMenu->GetMenuItemCount(); for(int i=num-1;i>=0;--i)pSubMenu->DeleteMenu(i,MF_BYPOSITION); for(i=m_MenuList.GetUpperBound();i>=0;i--){ if(m_MenuList[i]->nID==(UINT)pSubMenu->m_hMenu){ delete m_MenuList.GetAt(i); m_MenuList.RemoveAt(i); break; } } delete pSubMenu; } } } else{ int iPosition =0; BCMenu* pMenu = FindMenuOption(uiId,iPosition); if(pMenu)pMenu->DeleteMenu(iPosition,MF_BYPOSITION); } return CMenu::DeleteMenu(uiId,nFlags);}BOOL BCMenu::AppendMenuA(UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,int nIconNormal){USES_CONVERSION;return AppendMenuW(nFlags,nIDNewItem,A2W(lpszNewItem),nIconNormal);}BOOL BCMenu::AppendMenuW(UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,int nIconNormal){ return AppendODMenuW(lpszNewItem,nFlags,nIDNewItem,nIconNormal);}BOOL BCMenu::AppendMenuA(UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CImageList *il,int xoffset){USES_CONVERSION;return AppendMenuW(nFlags,nIDNewItem,A2W(lpszNewItem),il,xoffset);}BOOL BCMenu::AppendMenuW(UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CImageList *il,int xoffset){ return AppendODMenuW(lpszNewItem,nFlags,nIDNewItem,il,xoffset);}BOOL BCMenu::AppendMenuA(UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CBitmap *bmp){USES_CONVERSION;return AppendMenuW(nFlags,nIDNewItem,A2W(lpszNewItem),bmp);}BOOL BCMenu::AppendMenuW(UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,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 AppendODMenuW(lpszNewItem,nFlags,nIDNewItem,&temp,0); } return AppendODMenuW(lpszNewItem,nFlags,nIDNewItem,NULL,0);}BOOL BCMenu::InsertMenuA(UINT nPosition,UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,int nIconNormal){USES_CONVERSION;return InsertMenuW(nPosition,nFlags,nIDNewItem,A2W(lpszNewItem),nIconNormal);}BOOL BCMenu::InsertMenuW(UINT nPosition,UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,int nIconNormal){ return InsertODMenuW(nPosition,lpszNewItem,nFlags,nIDNewItem,nIconNormal);}BOOL BCMenu::InsertMenuA(UINT nPosition,UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CImageList *il,int xoffset){USES_CONVERSION;return InsertMenuW(nPosition,nFlags,nIDNewItem,A2W(lpszNewItem),il,xoffset);}BOOL BCMenu::InsertMenuW(UINT nPosition,UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CImageList *il,int xoffset){ return InsertODMenuW(nPosition,lpszNewItem,nFlags,nIDNewItem,il,xoffset);}BOOL BCMenu::InsertMenuA(UINT nPosition,UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CBitmap *bmp){USES_CONVERSION;return InsertMenuW(nPosition,nFlags,nIDNewItem,A2W(lpszNewItem),bmp);}BOOL BCMenu::InsertMenuW(UINT nPosition,UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,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 InsertODMenuW(nPosition,lpszNewItem,nFlags,nIDNewItem,&temp,0); } return InsertODMenuW(nPosition,lpszNewItem,nFlags,nIDNewItem,NULL,0);}//--------------------------------------------------------------------------//[21.06.99 rj]BCMenu* BCMenu::AppendODPopupMenuW(wchar_t *lpstrText){ BCMenu* pSubMenu = new BCMenu; pSubMenu->m_unselectcheck=m_unselectcheck; pSubMenu->m_selectcheck=m_selectcheck; pSubMenu->checkmaps=checkmaps; pSubMenu->checkmapsshare=TRUE; pSubMenu->CreatePopupMenu(); AppendODMenuW(lpstrText,MF_POPUP,(UINT)pSubMenu->m_hMenu, -1); return pSubMenu;}//--------------------------------------------------------------------------//[21.06.99 rj]BCMenu* BCMenu::AppendODPopupMenuA(LPCSTR lpstrText){ USES_CONVERSION; return AppendODPopupMenuW(A2W(lpstrText));}BOOL BCMenu::ImageListDuplicate(CImageList *il,int xoffset,CImageList *newlist){ if (il == NULL||newlist==NULL||xoffset<0) return FALSE; HICON hIcon = il->ExtractIcon(xoffset); int cx, cy; ImageList_GetIconSize(il->m_hImageList, &cx, &cy); newlist->Create(cx,cy,ILC_COLOR32|ILC_MASK,1,1); newlist->Add(hIcon); ::DestroyIcon(hIcon); return TRUE;}//*************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -