由于需要,想找一个能弹出文件菜单的函数..结果在网上找到的没一个能用的,于是就产生了我自己写的函数....
//
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// 功能:弹出文件的系统菜单
// ParentFolder 文件的父层目录
// Name 文件名
// pt 弹出菜单的坐标
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void CLocalDlg::PopIContextMenu(CString ParentFolder,CString Name, CPoint pt)
... {
CoInitialize(NULL); //初始化COM库
LPSHELLFOLDER pDesktop; //桌面IShellFolder接口
LPSHELLFOLDER pParent; //父目录的IShellFolder接口
LPITEMIDLIST pid; //目标文件PIDL
LPITEMIDLIST pidEnum; //枚举文件用的
WCHAR wchParent[MAX_PATH]; //父目录的宽字符路径
WCHAR wchName[MAX_PATH]; //文件的宽字符路径
if(ParentFolder[ParentFolder.GetLength() - 1] != '/') //如果目录名不包括"/"则加上
...{
ParentFolder += "/";
}
MultiByteToWideChar (CP_ACP, 0, ParentFolder, -1, wchParent, sizeof (wchParent) / sizeof (WCHAR)); //把父目录转成宽字节路径
MultiByteToWideChar (CP_ACP, 0, Name, -1, wchName, sizeof (wchName) / sizeof (WCHAR)); //把文件转成宽字节路径
if(!SUCCEEDED(::SHGetDesktopFolder(&pDesktop))) //获取桌面的IShellFolder接口
...{
return;
}
if(!(SUCCEEDED(pDesktop->ParseDisplayName(GetSafeHwnd(),NULL,wchParent,0,&pid,0)) && pid != NULL)) //获取父目录的LPITEMIDLIST
...{
pDesktop->Release();
return;
}
if(!SUCCEEDED(pDesktop->BindToObject(pid,NULL,IID_IShellFolder,(LPVOID*)&pParent))) //获取父目录的IShellFolder接口
...{
pDesktop->Release();
return;
}
IEnumIDList* pEnum = NULL; //枚举文件夹用的
BOOL bFind = NULL; //是否找到文件
SHFILEINFO sfi; //获取文件信息的结构体
pParent->EnumObjects(GetSafeHwnd(),SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN,&pEnum);
while(!bFind && (S_OK == pEnum->Next(1,&pidEnum,0))) //枚举文件(因为直接调用ParseDisplayName获得LPITEMIDLIST的话,后面是不会成功的
...{
::SHGetFileInfo(LPCTSTR(pidEnum),0,&sfi,sizeof(SHFILEINFO),SHGFI_PIDL | SHGFI_DISPLAYNAME);
// if(Name == sfi.szDisplayName)
if(Name.Find(sfi.szDisplayName) != -1)
bFind = TRUE; //找到了就为真
}
if(!bFind) //没找到就返回
...{
pDesktop->Release();
pParent->Release();
return;
}
IContextMenu* pContextMenu = NULL;
if(!SUCCEEDED(pParent->GetUIObjectOf(GetSafeHwnd(),1,(LPCITEMIDLIST*)&pidEnum,
IID_IContextMenu,NULL,(LPVOID*)&pContextMenu))) //获取文件的IContextMenu接口
...{
pDesktop->Release();
pParent->Release();
return;
}
CMenu menu;
menu.CreatePopupMenu();
if(!SUCCEEDED(pContextMenu->QueryContextMenu(menu.m_hMenu,menu.GetMenuItemCount(),
1,0x7ff,CMF_NORMAL | CMF_EXPLORE)))
...{
pDesktop->Release();
pParent->Release();
pContextMenu->Release();
return;
}
UINT icmd;
icmd = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON,pt.x,pt.y,AfxGetMainWnd());
if(icmd)
...{
CMINVOKECOMMANDINFO ici;
ici.cbSize = sizeof (CMINVOKECOMMANDINFO);
ici.fMask = 0;
ici.hwnd = GetSafeHwnd();
ici.lpVerb = MAKEINTRESOURCE (icmd - 1);
ici.lpParameters = NULL;
ici.lpDirectory = NULL;
ici.nShow = SW_SHOWNORMAL;
ici.dwHotKey = 0;
ici.hIcon = NULL;
pContextMenu->InvokeCommand(&ici);
}
menu.DestroyMenu();
pContextMenu->Release();
pDesktop->Release();
pParent->Release();
}
// 功能:弹出文件的系统菜单
// ParentFolder 文件的父层目录
// Name 文件名
// pt 弹出菜单的坐标
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void CLocalDlg::PopIContextMenu(CString ParentFolder,CString Name, CPoint pt)
... {
CoInitialize(NULL); //初始化COM库
LPSHELLFOLDER pDesktop; //桌面IShellFolder接口
LPSHELLFOLDER pParent; //父目录的IShellFolder接口
LPITEMIDLIST pid; //目标文件PIDL
LPITEMIDLIST pidEnum; //枚举文件用的
WCHAR wchParent[MAX_PATH]; //父目录的宽字符路径
WCHAR wchName[MAX_PATH]; //文件的宽字符路径
if(ParentFolder[ParentFolder.GetLength() - 1] != '/') //如果目录名不包括"/"则加上
...{
ParentFolder += "/";
}
MultiByteToWideChar (CP_ACP, 0, ParentFolder, -1, wchParent, sizeof (wchParent) / sizeof (WCHAR)); //把父目录转成宽字节路径
MultiByteToWideChar (CP_ACP, 0, Name, -1, wchName, sizeof (wchName) / sizeof (WCHAR)); //把文件转成宽字节路径
if(!SUCCEEDED(::SHGetDesktopFolder(&pDesktop))) //获取桌面的IShellFolder接口
...{
return;
}
if(!(SUCCEEDED(pDesktop->ParseDisplayName(GetSafeHwnd(),NULL,wchParent,0,&pid,0)) && pid != NULL)) //获取父目录的LPITEMIDLIST
...{
pDesktop->Release();
return;
}
if(!SUCCEEDED(pDesktop->BindToObject(pid,NULL,IID_IShellFolder,(LPVOID*)&pParent))) //获取父目录的IShellFolder接口
...{
pDesktop->Release();
return;
}
IEnumIDList* pEnum = NULL; //枚举文件夹用的
BOOL bFind = NULL; //是否找到文件
SHFILEINFO sfi; //获取文件信息的结构体
pParent->EnumObjects(GetSafeHwnd(),SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN,&pEnum);
while(!bFind && (S_OK == pEnum->Next(1,&pidEnum,0))) //枚举文件(因为直接调用ParseDisplayName获得LPITEMIDLIST的话,后面是不会成功的
...{
::SHGetFileInfo(LPCTSTR(pidEnum),0,&sfi,sizeof(SHFILEINFO),SHGFI_PIDL | SHGFI_DISPLAYNAME);
// if(Name == sfi.szDisplayName)
if(Name.Find(sfi.szDisplayName) != -1)
bFind = TRUE; //找到了就为真
}
if(!bFind) //没找到就返回
...{
pDesktop->Release();
pParent->Release();
return;
}
IContextMenu* pContextMenu = NULL;
if(!SUCCEEDED(pParent->GetUIObjectOf(GetSafeHwnd(),1,(LPCITEMIDLIST*)&pidEnum,
IID_IContextMenu,NULL,(LPVOID*)&pContextMenu))) //获取文件的IContextMenu接口
...{
pDesktop->Release();
pParent->Release();
return;
}
CMenu menu;
menu.CreatePopupMenu();
if(!SUCCEEDED(pContextMenu->QueryContextMenu(menu.m_hMenu,menu.GetMenuItemCount(),
1,0x7ff,CMF_NORMAL | CMF_EXPLORE)))
...{
pDesktop->Release();
pParent->Release();
pContextMenu->Release();
return;
}
UINT icmd;
icmd = menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON,pt.x,pt.y,AfxGetMainWnd());
if(icmd)
...{
CMINVOKECOMMANDINFO ici;
ici.cbSize = sizeof (CMINVOKECOMMANDINFO);
ici.fMask = 0;
ici.hwnd = GetSafeHwnd();
ici.lpVerb = MAKEINTRESOURCE (icmd - 1);
ici.lpParameters = NULL;
ici.lpDirectory = NULL;
ici.nShow = SW_SHOWNORMAL;
ici.dwHotKey = 0;
ici.hIcon = NULL;
pContextMenu->InvokeCommand(&ici);
}
menu.DestroyMenu();
pContextMenu->Release();
pDesktop->Release();
pParent->Release();
}