Мотивация: Создание нашего собственного файлового диалога, который выглядит и действует как стандартный диалог * std
Проблема: Как получить раскрывающийся список для текущей папки / контейнера оболочки
Видимые Мертвые концы:
- Запросите IShellFolder для его IContextMenu
- Запросите IShellView для его IContextMenu
- IShellFolder :: CreateViewObject (IID_IContextMenu ...) <очень ограниченное контекстное меню (новое). </em>
- IShellFolder :: GetUIObjectOf (IID_IContextMenu ...) <ограниченное контекстное меню (открыть, исследовать, ...). </em>
- Реализация IShellBrowser InsertMenusSB, RemoveMenusSB и SetMenuSB <Меню никогда не заполняется сверх того, что я заполняю с помощью </em>
Я потратил некоторое время на чтение Реализация представления папок и Как разместить IContextMenu . Кажется, это указывает на то, что последний подход (реализация InsertMenuSB, ...) должен работать. IShellView должен заполнять общее меню для IShellBrowser, включая его подменю View, соответствующими элементами. Однако, пока все, что я получаю от этого, - пустое меню (если я не заполняю его элементами - в этом случае, я просто получаю элементы, которые заполняю его).
Конечно, есть способ сделать это. Проводник Windows появляется в меню, которое он отображает (если вы нажмете ALT в Vista или выше) откуда-то. И я не могу себе представить, что это меню статически создается самим проводником - оно, безусловно, динамически каким-то образом создается вместе с отображаемым в настоящее время IShellView, чтобы расширения оболочки отображали правильный список параметров просмотра (и других параметров меню).
Но документация по InsertMenuSB , RemoveMenuSB и SetMenuSB сбивает с толку. Кажется, это указывает на то, что, как сервер-контейнер, я должен заполнить предоставленные OLEMENUGROUPWIDTHS , "в элементах 0, 2 и 4, чтобы отразить количество элементов меню, предоставленных в File, View и группы меню Window. "
Я реализовал следующее, чтобы попытаться правильно выполнить этот контракт:
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 реализациям, которые могут пролить свет на эту мутную тему?
Тьфу! @ - Я чувствую, что должен быть близко - но недостаточно близко!