Как мне получить IContextMenu, которое отображается в контекстном меню IShellView?

Создание замены диалога открытия файла. Сейчас многое из этого работает, но я хотел бы создать раскрывающийся список режима просмотра для панели инструментов непосредственно из объекта представления оболочки.

Глядя на IShellView2, я вижу, что IShellView2 :: GetView () предоставит мне поддерживаемый FOLDERVIEWMODE. Однако это не дает мне ни названий этих режимов, ни форматирования этого всплывающего меню для меня, ни сразу дает мне способ фактически установить один из этих режимов (казалось бы, необходимо уничтожить окно просмотра оболочки и создать замену для текущей папки и укажите новый желаемый режим FOLDERVIEWMODE ... да).

В любом случае, если щелкнуть правой кнопкой мыши окно IShellView, появится контекстное меню, первое подменю которого - именно то, что я хочу разместить на моей кнопке раскрывающейся панели инструментов (т. Е. Всплывающее меню просмотра (например, Small Иконки, Средние Иконки и тд)).

Похоже, что должен быть способ получить это подменю непосредственно из IShellView, вместо того, чтобы жестко кодировать мои значения (и таким образом, если данный экземпляр IShellView поддерживает дополнительные режимы просмотра, они будут там. который должен быть отключен, так как все это будет под контролем IShellView).

Я прочитал превосходный Как разместить 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");

Но здесь у меня очень мало опций в контекстном меню («Открыть», «Изучить», ...). Не то подробное контекстное меню, которое я получаю, если просто щелкаю правой кнопкой мыши по самому представлению оболочки.

У меня нет идей, как действовать дальше. Помощь?! ;)


person Mordachai    schedule 16.11.2009    source источник


Ответы (2)


Попробуйте IShellView :: GetItemObject с SVGIO_BACKGROUND в качестве uItem, чтобы получить IContextMenu для объекта представления: http://msdn.microsoft.com/en-us/library/bb774832%28VS.85%29.aspx

person Emmanuel Caradec    schedule 03.12.2009
comment
Я не думаю, что у вас есть идеи, как убедиться, что я могу получить подменю просмотра независимо от ОС, в которой я работаю (как версии, так и языка). - person Mordachai; 03.12.2009
comment
Прости. Я действительно сомневаюсь, что это возможно, вся сборка меню win32 для перечисления опций кажется очень низкоуровневой. Похоже, он построен для построения меню, а не для того, чтобы ковыряться в них (но я могу ошибаться) - person Emmanuel Caradec; 15.12.2009

Есть SHCreateDefaultContextMenu (Vista и выше), которые могут помочь. Веб-сайт Bjarke Viksoe также содержит отличную информацию.
SVGIO_BACKGROUND предоставит вам фоновое контекстное меню оболочки Посмотреть. Вам может потребоваться несколько раз вызвать pShellView-> SelectItem для каждого PIDL, который у вас может быть, затем выполнить вызов GetUIObjectOf (затем QI для IContextMenu, создать меню, вызвать IContextMenu (3) :: QueryContextMenu и, наконец, отобразить его с помощью TrackPopupMenu).

person Cristian Amarie    schedule 15.05.2015