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

📄 menubar.cpp

📁 一个IE的辅助菜单插件。附全部的源代码文件。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}

	m_hMenu = CreateMenu();
	HMENU hOthersMenu = CreateMenu();//未分类
	do
	{
		if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		{
			if(strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..")) 
			{	
				lstrcpy(lpszChildFolder, FavoritesPath);
				lstrcat(lpszChildFolder, "\\");
				lstrcat(lpszChildFolder, fd.cFileName); 
			    HMENU hSubMenu = CreateMenuForFolder(lpszChildFolder);
				InsertMenu(m_hMenu, -1, MF_BYPOSITION|MF_STRING|MF_POPUP, (UINT)hSubMenu, fd.cFileName);
			}
		}
		else//URL文件链接
		{	
			if(IsURLFile(fd.cFileName))
			{
				MenuItemData* pData = new MenuItemData;
				pData->lpszMenuText = _tcsdup(fd.cFileName);
				pData->bIsFolder = FALSE;
				
				TCHAR strURL[MAX_PATH];
				TCHAR lpszUncateFile[MAX_PATH];
				lstrcpy(lpszUncateFile, FavoritesPath);
				lstrcat(lpszUncateFile, "\\");
				lstrcat(lpszUncateFile, fd.cFileName); 
				
				SHFILEINFO sfi;
				DWORD hTmp;
				if(hTmp = SHGetFileInfo(lpszUncateFile, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX|SHGFI_SMALLICON))
				{
					m_hImgList = (HIMAGELIST)hTmp;
					pData->nMenuIndex = sfi.iIcon; 
				}
				else
				{
					pData->nMenuIndex = NOICONFOUND;
				}
				
				GetURLFromURLShortcutFile(lpszUncateFile, strURL, MAX_PATH);
							
				InsertMenu(hOthersMenu, -1, MF_BYPOSITION|MF_OWNERDRAW, m_uMenuIDOrder, (LPCTSTR)pData);
				m_URLStringArray.Add (strURL);
				m_uMenuIDOrder++;
			}
		}
	}while(FindNextFile(hFindFile, &fd));
	FindClose(hFindFile);
	
	InsertMenu(m_hMenu, -1, MF_BYPOSITION|MF_STRING|MF_POPUP, (UINT)hOthersMenu, "未分类");
	
	MENUINFO mif;
	mif.cbSize = sizeof(mif);
	mif.fMask = MIM_BACKGROUND|MIM_APPLYTOSUBMENUS;
	//mif.dwStyle = MNS_NOTIFYBYPOS;
	//mif.cyMax = 200;
	//SetMenuInfo(m_hMenu, &mif);
	return TRUE;
}

void CMenuBar::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	if(nIDCtl)//非菜单
	{
		CToolBar::OnDrawItem(nIDCtl, lpDrawItemStruct);
		return;
	}
	
	RECT BoundRect = lpDrawItemStruct->rcItem;
	COLORREF FaceClr, TextClr;
	MenuItemData* pData = (MenuItemData*)(lpDrawItemStruct->itemData);

	if(lpDrawItemStruct->itemState & ODS_SELECTED)
	{
		FaceClr = GetSysColor(COLOR_HIGHLIGHT);
		TextClr = GetSysColor(COLOR_HIGHLIGHTTEXT);
	}
	else
	{
		FaceClr = GetSysColor(COLOR_MENU);
		TextClr = GetSysColor(COLOR_MENUTEXT);
	}
	
	HBRUSH br = CreateSolidBrush(FaceClr);
	FillRect(lpDrawItemStruct->hDC, &BoundRect, br);
	
	//3d图标突起
	if(lpDrawItemStruct->itemState & ODS_SELECTED)
	{
		HBRUSH iconbr = CreateSolidBrush(GetSysColor(COLOR_MENU));
		RECT IconRc = BoundRect;
		IconRc.right = 22; 
		FillRect(lpDrawItemStruct->hDC, &IconRc, iconbr);
		Draw3DRect(lpDrawItemStruct->hDC, IconRc.left+1, IconRc.top+1, 20, 19); 
		DeleteObject(iconbr);
	}
	
	if(pData->nMenuIndex < 0)
	{
		HICON hIconToDraw; 
		if(pData->nMenuIndex == FOLDERICONINDEX)
			hIconToDraw = m_hFolderIcon;
		else
			if(pData->nMenuIndex == NOICONFOUND)
				hIconToDraw = m_hIeIcon;
		DrawIconEx(lpDrawItemStruct->hDC, BoundRect.left+3, BoundRect.top+2, hIconToDraw, 16, 16, 0, NULL, DI_NORMAL);
	}
	else
	{
		ImageList_Draw(m_hImgList, pData->nMenuIndex, lpDrawItemStruct->hDC, BoundRect.left+3, BoundRect.top+2, ILD_TRANSPARENT);   
	}
		
	COLORREF crOldText = SetTextColor(lpDrawItemStruct->hDC, TextClr);
	
	CString MenuText = pData->lpszMenuText;
	MenuText.TrimRight (".url");
			
	if(MenuText.GetLength () > 43)
	{
		MenuText = MenuText.Left (40);
		MenuText += "...";
	}
	
	BoundRect.left += 26;
	int nOldMode = SetBkMode(lpDrawItemStruct->hDC, TRANSPARENT); 
	DrawText(lpDrawItemStruct->hDC, MenuText, MenuText.GetLength(), &BoundRect, DT_SINGLELINE|DT_LEFT|DT_VCENTER);

	DeleteObject(br);
	SetBkMode(lpDrawItemStruct->hDC, nOldMode);
	SetTextColor(lpDrawItemStruct->hDC, crOldText);
}

void CMenuBar::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
	if(lpMeasureItemStruct->CtlType != ODT_MENU)
	{
		CToolBar::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
		return;
	}
	
	RECT rect;
	rect.left = rect.top = 0;
	
	MenuItemData* pData = (MenuItemData*)(lpMeasureItemStruct->itemData);
	CString MenuText = pData->lpszMenuText;
	MenuText.TrimRight (".url");
			
	if(MenuText.GetLength () > 43)
	{
		MenuText = MenuText.Left (40);
		MenuText += "...";
	}

	HDC hOwnerDC = ::GetDC(m_hWnd);
	HGDIOBJ hOldFnt = SelectObject(hOwnerDC, GetStockObject(DEFAULT_GUI_FONT));
	DrawText(hOwnerDC, MenuText, MenuText.GetLength(), &rect, DT_LEFT|DT_CALCRECT|DT_SINGLELINE);
	SelectObject(hOwnerDC, hOldFnt);
	::ReleaseDC(m_hWnd, hOwnerDC);
	
	lpMeasureItemStruct->itemWidth =  rect.right - rect.left + 35;

	if(pData->bIsFolder)
		lpMeasureItemStruct->itemWidth+=10;
		
	lpMeasureItemStruct->itemHeight = SM_CYMENU + 5;
}

void CMenuBar::Draw3DRect(HDC hdc, int x, int y, int cx, int cy)
{
	HBRUSH  brTopLeft = CreateSolidBrush(GetSysColor(COLOR_3DHIGHLIGHT));
	HBRUSH  brBottomRight = CreateSolidBrush(GetSysColor(COLOR_3DSHADOW));
	
	RECT rc;
	SetRect(&rc, x, y, x + cx - 1, y+1);
	FillRect(hdc, &rc, brTopLeft);
	SetRect(&rc, x, y, x+1, y + cy - 1);
	FillRect(hdc, &rc, brTopLeft);
	SetRect(&rc, x + cx - 1, y, x+cx, y+cy);
	FillRect(hdc, &rc, brBottomRight);
	SetRect(&rc, x, y + cy -1 , x+cx, y+cy);
	FillRect(hdc, &rc, brBottomRight);
	DeleteObject(brTopLeft);
	DeleteObject(brBottomRight);
}

BOOL CMenuBar::IsURLFile(LPCTSTR lpszFileName)
{
	return ((strstr(lpszFileName, ".url") - lpszFileName) == ((int)strlen(lpszFileName)-4));
}

HMENU CMenuBar::CreateMenuForFolder(LPCTSTR lpszFolderName)
{
	HMENU hMenu = CreateMenu();
	if(!hMenu)
		return NULL;

	WIN32_FIND_DATA fd;
	TCHAR lpszChildFolder[MAX_PATH];
	lstrcpy(lpszChildFolder, lpszFolderName);
	lstrcat(lpszChildFolder, "\\*.*");
	HANDLE hFindFile = FindFirstFile(lpszChildFolder, &fd);
	
	if(hFindFile == INVALID_HANDLE_VALUE)//没找到任何文件夹,一般不可能发生.
	{
		FindClose(hFindFile);
		DestroyMenu(m_hMenu);
		return NULL;
	}

	BOOL bFindAnyFile = FALSE;
	do
	{
		if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		{
			if(strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..")) 
			{	
				bFindAnyFile = TRUE;
				lstrcpy(lpszChildFolder, lpszFolderName);
				lstrcat(lpszChildFolder, "\\");
				lstrcat(lpszChildFolder, fd.cFileName);
				HMENU hSubMenu;
				if((hSubMenu = CreateMenuForFolder(lpszChildFolder)) != NULL)
				{
					MenuItemData* pData = new MenuItemData;
					pData->lpszMenuText = _tcsdup(fd.cFileName);
					pData->bIsFolder = TRUE;
					pData->nMenuIndex = FOLDERICONINDEX;
					InsertMenu(hMenu, -1, MF_BYPOSITION|MF_OWNERDRAW|MF_POPUP, (UINT)hSubMenu, (LPCTSTR)pData);
				}
			}
		}
		else//URL Internet Shortcut
		{	
			if(IsURLFile(fd.cFileName))
			{
				bFindAnyFile = TRUE;
				MenuItemData* pData = new MenuItemData;
				pData->lpszMenuText = _tcsdup(fd.cFileName);
				pData->bIsFolder = FALSE;
				
				SHFILEINFO sfi;
				DWORD hTmp;
				lstrcpy(lpszChildFolder, lpszFolderName);
				lstrcat(lpszChildFolder, "\\");
				lstrcat(lpszChildFolder, fd.cFileName);

				TCHAR strURL[MAX_PATH];
				GetURLFromURLShortcutFile(lpszChildFolder, strURL, MAX_PATH);
				
			    if(hTmp = SHGetFileInfo(lpszChildFolder, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX|SHGFI_SMALLICON))
				{
					m_hImgList = (HIMAGELIST)hTmp;
					pData->nMenuIndex = sfi.iIcon; 
				}
				else
				{
					pData->nMenuIndex = NOICONFOUND;
				}
				InsertMenu(hMenu, -1, MF_BYPOSITION|MF_OWNERDRAW, m_uMenuIDOrder, (LPCTSTR)pData);
				m_URLStringArray.Add (strURL);
				m_uMenuIDOrder++;
			}
		}
	}while(FindNextFile(hFindFile, &fd));
	FindClose(hFindFile);
	
	if(!bFindAnyFile)
		InsertMenu(hMenu, -1, MF_BYPOSITION|MF_STRING|MF_DISABLED|MF_GRAYED, 0, "(空)");

	return hMenu;
}

void CMenuBar::FreeMenuResource(HMENU hMenu)
{
	int nMenuItemCount = GetMenuItemCount(hMenu);
	MENUITEMINFO mii;
	mii.cbSize = sizeof(MENUITEMINFO);
	
	for(int i = 0; i < nMenuItemCount;i++)
	{
		mii.fMask = MIIM_DATA;
		if(GetMenuItemInfo(hMenu, i, TRUE, &mii))
		{
			MenuItemData* pData = (MenuItemData*)(mii.dwItemData);
			if(pData)
			{
				free(pData->lpszMenuText);
				delete pData;
			}
		}
		
		mii.fMask = MIIM_SUBMENU;
		if(GetMenuItemInfo(hMenu, i, TRUE, &mii))
		{
			if(mii.hSubMenu)
				FreeMenuResource(mii.hSubMenu); 
		}
	}
	DestroyMenu(hMenu);
}

void CMenuBar::OnMenuCommand(WPARAM wParam, LPARAM lParam)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	BOOL f = IsMenu(HMENU(lParam));
}

void CMenuBar::GetURLFromURLShortcutFile(LPCTSTR lpszURLFileName, LPTSTR lpszURL, UINT cch)
{
	GetPrivateProfileString("InternetShortcut", "URL", NULL, lpszURL, cch, lpszURLFileName);
}

BOOL CMenuBar::OnCommand(WPARAM wParam, LPARAM lParam )
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	if(HIWORD(wParam) != 0)
		return CWnd::OnCommand (wParam, lParam);

	ShellExecute(NULL, "open", m_URLStringArray[LOWORD(wParam) - (ID_FIRSTMENU)], NULL, NULL, SW_SHOWDEFAULT);
	return TRUE;
}


⌨️ 快捷键说明

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