Как я могу получить IContextMenu, который отображается в контекстном меню IShellView? - PullRequest
0 голосов
/ 17 ноября 2009

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

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

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

Похоже, что должен быть способ получить это подменю непосредственно из 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");

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

У меня нет идей, как поступить. Помогите?! ;)

Ответы [ 2 ]

1 голос
/ 03 декабря 2009

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

0 голосов
/ 15 мая 2015

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

...