构建文件打开对话框替换。其中大部分都可以使用,但我想直接从shell视图对象生成工具栏的视图模式下拉列表。
看看IShellView2,我可以看到IShellView2 :: GetView()会给我支持FOLDERVIEWMODE。但是,这并没有给我这些模式的名称,也没有为我提供弹出菜单的格式,也没有立即给我一种方法来实际设置其中一种模式(看起来有必要销毁shell视图窗口并创建当前文件夹的替换文件,并指定所需的新FOLDERVIEWMODE ... yeesh)。
无论如何,如果右键单击IShellView窗口,就会得到一个上下文菜单,其第一个子菜单正是我想要放在我的下拉工具栏按钮中(即“视图”飞 - 出菜单(例如小图标,中等图标等))。
似乎应该有一种直接从IShellView获取子菜单的方法,而不是必须对我的值进行硬编码(这样,如果给定的IShellView实例支持额外的视图模式,它们就会存在。同样,应该被禁用的那些,因为它将全部在IShellView的控制下。)
我读过Raymond Chen的优秀How to host an IContextMenu。不幸的是,这只是给了我一个非常简单的上下文菜单 - 文件夹本身,或给定文件夹中的文件,但不是IShellView的shell视图窗口的上下文菜单(我可以从中获取视图飞出)。
我根据Chen的文章尝试了以下内容:
CComQIPtr<IContextMenu> pcm(m_shell_view); // <<-- FAIL resulting pointer is NULL <<<
// create a blank menu
CMenu menu;
if (!menu.CreatePopupMenu())
throw CContextException("Unable to create an empty menu in which to store the context menu: ");
// obtain the full popup menu we need
if (FAILED(m_hresult = pcm->QueryContextMenu(menu, 0, SCRATCH_QCM_FIRST, SCRATCH_QCM_LAST, CMF_NORMAL)))
throw CLabeledException("Unable to query the context menu for the current folder");
// display the menu to the user
// menu.getsubmenu
::TrackPopupMenu(menu, ::GetSystemMetrics(SM_MENUDROPALIGNMENT)|TPM_TOPALIGN|TPM_LEFTBUTTON, pt.x, pt.y, 0, m_shell_view_hwnd, NULL);
不幸的是,尝试查询其IContextMenu接口的m_shell_view(它是一个IShellView *)失败了。这“有效”:
// retrieve our current folder's PIDL
PidlUtils::Pidl pidl(m_folder);
// get the context menu for the current folder
CComPtr<IContextMenu> pcm;
if (FAILED(m_hresult = GetUIObjectOf(m_owner->m_hWnd, pidl, IID_PPV_ARGS(&pcm))))
throw CLabeledException("Unable to obtain the PIDL for the current folder");
但是在这里我只在上下文菜单中选择了很少的选项(Open,Explore,...)。如果我只是右键单击shell视图本身,就不会得到详细的上下文菜单。
我没有关于如何继续的想法。救命?! ;)
答案 0 :(得分:1)
尝试使用SVGIO_BACKGROUND的IShellView :: GetItemObject作为uItem来获取视图对象上的IContextMenu:http://msdn.microsoft.com/en-us/library/bb774832%28VS.85%29.aspx
答案 1 :(得分:0)
SHCreateDefaultContextMenu(Vista起来)可能会有所帮助。 Bjarke Viksoe网站也包含很多信息 SVGIO_BACKGROUND将为您提供shell视图的背景上下文菜单。您可能需要为您可能拥有的每个PIDL重复调用pShellView-&gt; SelectItem,然后执行GetUIObjectOf调用(然后执行IContextMenu的QI,创建菜单,调用IContextMenu(3):: QueryContextMenu,最后使用TrackPopupMenu显示它。)< / p>