0

ファイルを開くダイアログの置換を構築しています。現在はそのほとんどが機能していますが、シェル ビュー オブジェクトから直接、ツールバーのビュー モード ドロップダウンを生成したいと考えています。

IShellView2 を見ると、IShellView2::GetView() によって FOLDERVIEWMODE がサポートされていることがわかります。ただし、これらのモードの名前も、そのポップアップ メニューのフォーマットも、それらのモードの 1 つを実際に設定する方法もすぐにはわかりません (シェル ビュー ウィンドウを破棄して作成する必要があるようです)。現在のフォルダーの代替フォルダーを作成し、必要な新しい FOLDERVIEWMODE を指定します...はい)。

とにかく、IShellView ウィンドウを右クリックすると、コンテキスト メニューが表示されます。その最初のサブメニューは、まさにドロップダウン ツールバー ボタンに配置したいものです (つまり、「表示」フライアウト メニュー (例: 小さいアイコン、中程度のアイコンなど))。

私の値をハードコードするのではなく、IShellView から直接そのサブメニューを取得する方法が必要なようです (その方法で、IShellView の特定のインスタンスが追加のビュー モードをサポートしている場合、それらはそこにあります。同様に、それらはすべて IShellView の制御下にあるため、無効にする必要があります)。

Raymond Chen の優れたHow to host an IContextMenu を読みました。残念ながら、それは私に非常に単純なコンテキスト メニューを与えるだけです - フォルダー自体、または特定のフォルダー内のファイルのためのものですが、IShellView のシェル ビュー ウィンドウ (そこからビュー フライアウトを取得する可能性があります) のコンテキスト メニューではありません。 )。

Chenの記事に基づいて、次のことを試しました。

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");

しかし、ここでは、コンテキスト メニューにごく少数のオプションしか表示されません ([開く]、[探索] など)。シェル ビュー自体を右クリックするだけで表示される詳細なコンテキスト メニューではありません。

どのように進めるかについてのアイデアがありません。ヘルプ?!;)

4

2 に答える 2

1

SVGIO_BACKGROUND を uItem として IShellView::GetItemObject を試して、ビュー オブジェクトで IContextMenu を取得します

于 2009-12-03T12:36:31.817 に答える
0

役立つ可能性のあるSHCreateDefaultContextMenu (Vista 以降) があります。Bjarke Viksoe のWeb サイトにも素晴らしい情報が含まれています。
SVGIO_BACKGROUND は、シェル ビューのバックグラウンド コンテキスト メニューを取得します。PIDL ごとに pShellView->SelectItem を繰り返し呼び出す必要がある場合があります。次に、GetUIObjectOf 呼び出しを実行します (次に、IContextMenu の QI、メニューを作成し、IContextMenu(3)::QueryContextMenu を呼び出し、最後に TrackPopupMenu で表示します)。

于 2015-05-15T13:30:11.723 に答える