王朝网络
分享
 
 
 

在应用程序中集成外壳的上下文菜单(上)

王朝vc·作者佚名  2006-01-09
宽屏版  字体: |||超大  

在应用程序中集成外壳的上下文菜单

作者:_foo(2004.5.11)

关键字:Shell, Namespace, IContextMenu, 外壳, 名字空间, 上下文菜单

文章难度:初级

介绍(What is the shell contextmenu)

随着越来越多的软件对外壳的扩展,资源管理器变得是越来越强大和易用,以前要压缩一个或多个文件,你得老老实实找到压缩软件的快捷方式并打开他,接着进行一系列的选择操作,这对我这种懒人来说绝对是很烦的一件事,而有了外壳的菜单扩展机制,你只需在资源管理器中选好你要操作的文件然后弹出右键菜单选择相应的项就搞定了,多方便啊。

呃,打住,本文并不是要介绍怎么给资源管理器加入一个菜单扩展项(注1),而是介绍怎么在自己的程序中调用那个有着丰富功能的上下文菜单。例如FlashFXP中左边的本地文件窗口(图1):

(图1:假设你在打开FTP软件想把一些文件上传时才发现这些文件尚未打包,怎么办?切换到资源管理器把他们打包再回到FlashFXP吗?No no no,别做这么没效率的事,在FlashFXP左窗口中把相应文件选中后按住shift键后弹出右键菜单看看,简直太美妙了,以后在FTP上down到什么好音乐我直接就可以用喜欢的播放器来欣赏了。)

(注1:基本上认为写一个上下文菜单扩展项是比较容易实现的,有大量的文章和示例代码可从http://www.codeproject.com/shell得到)

原理(How to implement)

我们知道,在win32中是以外壳名字空间(注2)的形式来组织文件系统的,在外壳名字空间里的每一个文件夹都实现了一个IShellFolder的接口,通过这个接口我们可以直接查询或间接得到其他相关的接口。

跟对象(注3)的上下文菜单相关的接口是IContextMenu,通过对象的父文件夹的IShellFolder::GetUIObjectOf方法可得到该接口。得到该接口后,可以用IContextMenu::QueryContextMenu方法来生成上下文菜单的菜单项,用IContextMenu::InvokeCommand调用相应的命令。看起来很简单不是吗?下面就以一个实例来说明具体的实现,包括怎么得到一个对象的父文件夹IShellFolder接口,怎么得到IContextMenu,及怎么调用IContextMenu的各个方法。

(注2:关于外壳名字空间的概念,推荐大家看看姜伟华的Windows外壳名字空间的浏览一文,更多资料可从MSDN中得到)

(注3:这里的对象指的是外壳名字空间中的一个节点,对象有可能是一个文件夹,有可能是一个文件,也有可能是一个虚拟文件夹,例如:我的电脑,网上邻居,控制面板等)

具体实现和示例

为了简单起见,本例以MFC中的基于对话框工程为基础,在一个ListBox控件中列出C盘下的子文件夹和文件,右键单击ListBox中的每一项会弹出对应的外壳上下文菜单。

(一) 枚举C驱动器下的文件夹和文件并添加到ListBox中:

步骤如下:

a) 用SHGetDesktopFolder得到桌面的IShellFolder接口指针,这是我们取得其他对象IShellFolder的一个途径。

b) 用IShellFolder::ParseDisplayName得到驱动器C的PIDL,接着把得到的PIDL做为参数传给IShellFolder::BindToObject便可得到驱动器C的IShellFolder接口指针了。

c) 用刚才得到C盘的IShellFolder::EnumObjects方法可得到一个枚举器,通过该枚举器可以枚举出C盘下的子文件夹和文件的PIDL。通过GetDisplayNameOf可得到一个PIDL所代表的对象的显示名,于是我们把该名字加到ListBox中,同时用CListBox::SetItemData把相应的PIDL保存起来,以后用得着J

示例代码:

LPMALLOC pMalloc;

LPITEMIDLIST pidlC = NULL;

LPITEMIDLIST pidlItems = NULL;

IShellFolder *psfDeskTop = NULL;

IShellFolder *psfFolderC = NULL;

LPENUMIDLIST ppenum = NULL;

ULONG celtFetched;

HRESULT hr;

STRRET strDispName;

TCHAR pszDisplayName[MAX_PATH];

ULONG uAttr;

hr = SHGetMalloc(&pMalloc);

hr = SHGetDesktopFolder(&psfDeskTop);

hr = psfDeskTop->ParseDisplayName(GetSafeHwnd(), NULL, L"C:\\", NULL, &pidlC, NULL);

hr = psfDeskTop->BindToObject(pidlC, NULL, IID_IShellFolder, (void**)&psfFolderC);

psfDeskTop->Release();

hr = psfFolderC->EnumObjects(GetSafeHwnd(), SHCONTF_FOLDERS | SHCONTF_NONFOLDERS , &ppenum);

while (hr = ppenum->Next(1, &pidlItems, &celtFetched) == S_OK && (celtFetched) == 1)

{

psfFolderC->GetDisplayNameOf(pidlItems, SHGDN_INFOLDER, &strDispName);

uAttr = SFGAO_FOLDER;

psfFolderC->GetAttributesOf(1, (LPCITEMIDLIST *) &pidlItems, &uAttr);

StrRetToBuf(&strDispName, pidlItems, pszDisplayName, MAX_PATH);

CString strDisplayName;

if(uAttr & SFGAO_FOLDER)

{

strDisplayName.Format("%s%s%s","[",pszDisplayName,"]");

}

else

{

strDisplayName = pszDisplayName;

}

m_listBox.SetItemData(m_listBox.InsertString(-1, strDisplayName), (DWORD)pidlItems);

}

ppenum->Release();

pMalloc->Free(pidlC);

pMalloc->Release();

m_psfFolderC = psfFolderC;

...

faint,超出64K,待续...

在应用程序中集成外壳的上下文菜单(下)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有