ファイルを開くダイアログの置換を構築しています。現在はそのほとんどが機能していますが、シェル ビュー オブジェクトから直接、ツールバーのビュー モード ドロップダウンを生成したいと考えています。
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");
しかし、ここでは、コンテキスト メニューにごく少数のオプションしか表示されません ([開く]、[探索] など)。シェル ビュー自体を右クリックするだけで表示される詳細なコンテキスト メニューではありません。
どのように進めるかについてのアイデアがありません。ヘルプ?!;)