📄 menubar.cpp
字号:
}
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 + -