一个能弹出文件系统菜单的函数~~(原创)

由于需要,想找一个能弹出文件菜单的函数..结果在网上找到的没一个能用的,于是就产生了我自己写的函数....

 

 

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// 功能:弹出文件的系统菜单
// 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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值