动机:创建自己的文件对话框,看起来&行为很像常见的性病对话框当然有一种方法可以获取当前文件夹视图的完整视图下拉菜单吗?
问题:如何获取当前文件夹/壳容器
视图下拉表观死角:
- 查询的IShellFol der为其IContextMenu< NULL接口指针。
- 查询IShellView的IContextMenu< NULL接口指针。
- IShellFolder :: CreateViewObject(IID_IContextMenu ...)<非常有限的上下文菜单(新)。
- 的IShellFolder :: GetUIObjectOf(IID_IContextMenu ...)<有限的上下文菜单(开放,探索,...)。
- 实施IShellBrowser的InsertMenusSB,RemoveMenusSB和SetMenuSB<菜单是从来没有填充超出了我
填充它我花了一些时间阅读Implementing a Folder View和How to host an IContextMenu。这似乎表明上面的最后一种方法(实现InsertMenuSB,...)应该可以工作。 IShellView应该使用相应的项目填充IShellBrowser的共享菜单,包括其View子菜单。然而,到目前为止,我从中得到的只是一个空菜单(除非我用项目填充它 - 在这种情况下,我只是得到我填充的项目)。
当然有一种方法可以做到这一点。 Windows资源管理器会从某处显示它所显示的菜单(如果您在Vista或更高版本上按ALT键)。我无法想象这个菜单是由Explorer本身静态构建的 - 它肯定会以某种方式与当前显示的IShellView一起动态创建,以允许外壳扩展显示正确的视图选项列表(以及其他菜单选项)。
但在InsertMenuSB,RemoveMenuSB,并SetMenuSB的文档是混乱的。这似乎表明,作为容器服务器,我应该在元素0,2和4中填充提供的“OLEMENUGROUPWIDTHS,”,以反映它在“文件”,“视图”和“窗口”菜单组中提供的菜单元素的数量。 “
我已实现了以下尝试正确履行本合同:
HRESULT STDMETHODCALLTYPE ShellBrowserDlgImpl::InsertMenusSB(__RPC__in HMENU hmenuShared, /* [out][in] */ __RPC__inout LPOLEMENUGROUPWIDTHS lpMenuWidths)
{
TRACE("IShellBrowser::InsertMenusSB\n");
// insert our main pull-downs
struct
{
UINT id;
LPCTSTR label;
} pull_downs[] = {
{ FCIDM_MENU_FILE, "File" },
{ FCIDM_MENU_EDIT, "Edit" },
{ FCIDM_MENU_VIEW, "View" },
{ FCIDM_MENU_TOOLS, "Tools" },
{ FCIDM_MENU_HELP, "Help" },
};
for (size_t i = 0; i < countof(pull_downs); ++i)
{
VERIFY(AppendMenu(hmenuShared, MF_POPUP, pull_downs[i].id, pull_downs[i].label));
ASSERT(GetMenuItemID(hmenuShared, i) == pull_downs[i].id);
}
// set the count of menu items we've inserted into each *group*
lpMenuWidths->width[0] = 2; // FILE: File, Edit
lpMenuWidths->width[2] = 2; // VIEW: View, Tools
lpMenuWidths->width[4] = 1; // WINDOW: Help
return S_OK;
}
有没有人实现的资源管理器类似的项目,适当地暴露了当前IShellView的菜单给最终用户?
是否有文档/关于的示例IOLEInPlaceFrame实现可能会对这个晦涩的主题有所了解?
呃!@ - 我觉得我一定要接近 - 但还不够接近!
我不认为你有任何关于如何确保我可以获得视图子菜单的想法,无论我在哪个操作系统下运行(包括版本和语言)。 – Mordachai 2009-12-03 16:48:14
在Windows的英文版中,您可以搜索其文本为“查看”的子菜单,并希望Microsoft以后不会将其更改为其他内容。我怀疑微软会很快改变它,但这仍然是无证的行为。 – 2009-12-03 19:42:03