2009-11-16 38 views
0

构建文件打开对话框替换。现在它的大部分工作,但我想直接从shell视图对象生成工具栏的视图模式下拉菜单。如何获取IShellView上下文菜单中显示的IContextMenu?

看着IShellView2,我可以看到IShellView2 :: GetView()会给我FOLDERVIEWMODE的支持。然而,这并没有给我这些模式的名称,也没有为我设置这个弹出式菜单的格式,也没有立即给我一种方法来真正设置这些模式之一(它看起来有必要销毁shell视图窗口并创建替换为当前文件夹的一个,并指定所需的新FOLDERVIEWMODE ... yeesh)。无论如何,如果右击一个IShellView窗口,就会得到一个上下文菜单,其中的第一个子菜单正是我想要放在我的下拉工具栏按钮中(即“view”fly - 出菜单(例如小图标,中等图标等))。

似乎应该有办法直接从IShellView获取子菜单,而不是硬编码我的值(并且这样,如果给定的IShellView实例支持额外的视图模式,他们会在那里。同样,那些应该被禁用的将是,因为它全部都在IShellView的控制之下)。

我读过雷蒙德陈的优秀How to host an IContextMenu。不幸的是,这只是给了我一个非常简单的上下文菜单 - 文件夹本身或给定文件夹中的文件,但不是IShellView的shell视图窗口的上下文菜单(我可以从中获取视图飞出)。

我曾尝试以下,根据陈的文章:

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); 

不幸的是,查询m_shell_view(这是一个IShellView *)为其IContextMenu接口的尝试失败。这个“作品”:

// 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"); 

但是,在这里我只在上下文菜单(打开,探索,...)只有很少的选项。不是我得到的详细上下文菜单,如果我只需右键单击shell视图本身。

我对如何继续进行了一些想法。帮帮我?! ;)

回答

1

尝试IShellView :: GetItemObject与SVGIO_BACKGROUND为uItem视图对象上得到IContextMenu:http://msdn.microsoft.com/en-us/library/bb774832%28VS.85%29.aspx

+0

我不认为你有任何想法如何确保我可以得到视图子菜单,无论我在哪个操作系统下运行(包括版本和语言)。 – Mordachai 2009-12-03 16:47:23

+0

对不起。我真的怀疑这是可能的,整个构建win32菜单来枚举选项似乎很低级别。它似乎是建立在建立菜单的目的,而不是在其中戳(但我可能是错的) – 2009-12-14 21:36:04

0

还有就是SHCreateDefaultContextMenu(Vista系统上),可能会有所帮助。 Bjarke Viksoe网站也包含很好的信息。
SVGIO_BACKGROUND将为您提供shell视图的背景上下文菜单。您可能需要重复调​​用pShellView-> SelectItem来获取每个PIDL,然后执行GetUIObjectOf调用(然后执行QI for IContextMenu,创建菜单,调用IContextMenu(3):: QueryContextMenu并最终使用TrackPopupMenu显示它)。