gpt4 book ai didi

c++ - 肯定有办法获得当前文件夹 View 的完整 View 下拉列表吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:23:12 25 4
gpt4 key购买 nike

动机:创建我们自己的文件对话框,其外观和行为与标准通用对话框非常相似

问题:如何获取当前文件夹/shell容器的 View 下拉

明显的死胡同:

  • 查询 IShellFolder 的 IContextMenu
  • 查询 IShellView 的 IContextMenu
  • IShellFolder::CreateViewObject(IID_IContextMenu...) 非常有限的上下文菜单(新)。
  • IShellFolder::GetUIObjectOf(IID_IContextMenu...)<有限的上下文菜单(打开、浏览...)。
  • 实现 IShellBrowser 的 InsertMenusSB、RemoveMenusSB 和 SetMenuSB <菜单永远不会超出我填充的内容

我花了一些时间阅读 Implementing a Folder ViewHow to host an IContextMenu .这似乎表明上面的 final方法(实现 InsertMenuSB,...)应该有效。 IShellView 应该使用适当的项目填充 IShellBrowser 的共享菜单,包括其 View 子菜单。然而,到目前为止,我从中得到的只是一个空菜单(除非我用项目填充它 - 在这种情况下,我只得到我填充它的项目)。

当然有办法做到这一点。 Windows 资源管理器从某处到达它显示的菜单(如果您在 Vista 或更高版本上按下 ALT)。而且我无法想象这个菜单是由 Explorer 本身静态构建的 - 它肯定是以某种方式动态创建的,与当前显示的 IShellView 一致,以允许 shell 扩展显示正确的 View 选项列表(和其他菜单选项)。

但是关于InsertMenuSBRemoveMenuSBSetMenuSB 的文档令人困惑。这似乎表明,作为容器服务器,我应该在元素 0、2 和 4 中填充提供的 OLEMENUGROUPWIDTHS“以反射(reflect)它在文件中提供的菜单元素的数量, View 和窗口菜单组。”

我已实现以下措施以尝试正确履行此契约(Contract):

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

有没有人实现了类似 Explorer 的项目,可以正确地将当前 IShellView 的菜单暴露给最终用户?

是否有关于 IOLEInPlaceFrame 实现的文档/示例可以阐明这个模糊的主题?

呃!@ - 我觉得我必须接近 - 但还不够接近!

最佳答案

使用 SVGIO_BACKGROUND 获取文件夹的背景菜单,其中应该有一个 View 子菜单。 “查看”菜单项的索引、名称和命令 ID 可能因 Windows 版本和本地语言而异,因此这是一种 hack。

关于c++ - 肯定有办法获得当前文件夹 View 的完整 View 下拉列表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1836622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com