构建文件打开对话框替换。它现在大部分工作,但我想直接从外壳视图对象生成工具栏的视图模式下拉菜单。
查看 IShellView2,我可以看到 IShellView2::GetView() 会给我 FOLDERVIEWMODE 的支持。但是,这并没有给我这些模式的名称,也没有为我格式化弹出菜单,也没有立即给我一种实际设置其中一种模式的方法(看起来有必要破坏 shell 视图窗口并创建当前文件夹的替换文件夹并指定所需的新 FOLDERVIEWMODE ... 是的)。
无论如何,如果右键单击 IShellView 窗口,则会获得一个上下文菜单,其中的第一个子菜单正是我想要放置在我的下拉工具栏按钮中的内容(即“视图”弹出菜单(例如小图标、中图标等))。
似乎应该有一种方法可以直接从 IShellView 中获取该子菜单,而不必对我的值进行硬编码(这样,如果给定的 IShellView 实例支持额外的视图模式,它们就会在那里。同样,那些应该禁用它,因为它都在 IShellView 的控制之下)。
我已阅读 Raymond Chen 的优秀How to host an IContextMenu。不幸的是,这只是给了我一个非常简单的上下文菜单-文件夹本身或给定文件夹中的文件的上下文菜单,而不是 IShellView 的外壳视图窗口的上下文菜单(我可以从中获得视图飞出)。
根据陈的文章,我尝试了以下方法:
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");
但是在这里,我在上下文菜单中只得到了很少的选项(打开、探索,...)。如果我只是右键单击外壳视图本身,则不是我得到的详细上下文菜单。
我不知道如何进行。帮助?!;)