動機: std コモン ダイアログによく似た外観と動作をする独自のファイル ダイアログを作成する
問題:現在のフォルダー/シェル コンテナーのビュー プルダウンを取得する方法
明らかな行き止まり:
- IContextMenu < NULL インターフェイス ポインターの IShellFolder をクエリします。
- IContextMenu < NULL インターフェイス ポインターの IShellView をクエリします。
- IShellFolder::CreateViewObject(IID_IContextMenu...) < 非常に限られたコンテキスト メニュー (新規)。
- IShellFolder::GetUIObjectOf(IID_IContextMenu...) < 限定されたコンテキスト メニュー (開く、探索する...)。
- IShellBrowser の InsertMenusSB、RemoveMenusSB、および SetMenuSB を実装する
私は、Folder View の実装とIContextMenu をホストする方法を読むのに時間を費やしました。これは、上記の最終的なアプローチ (InsertMenuSB の実装など) が機能することを示しているようです。IShellView は、View サブメニューを含む IShellBrowser の共有メニューに適切な項目を設定する必要があります。ただし、これまでのところ、そこから得られるのは空のメニューだけです (アイテムを入力しない限り、その場合は、入力したアイテムを取得するだけです)。
確かにこれを行う方法があります。Windows エクスプローラーは、(Vista 以降で Alt キーを押した場合) 表示されるメニューにどこかから到着します。そして、このメニューがエクスプローラー自体によって静的に構築されているとは想像できません。現在表示されている IShellView と連携して何らかの形で動的に作成され、シェル拡張機能がビュー オプション (およびその他のメニュー オプション) の正しいリストを表示できるようになっていることは確かです。
しかし、InsertMenuSB、RemoveMenuSB、およびSetMenuSBに関するドキュメントは紛らわしいです。コンテナー サーバーとして、提供されたOLEMENUGROUPWIDTHSを"ファイル、ビュー、およびウィンドウ メニュー グループで提供されるメニュー要素の数を反映するために、要素 0、2、および 4 に" 設定する必要があることを示しているようです。
この契約を適切に履行するために、次のことを実装しました。
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;
}
現在の IShellView のメニューをエンドユーザーに適切に公開する Explorer のようなプロジェクトを実装した人はいますか?
このあいまいな主題に光を当てる可能性のあるIOLEInPlaceFrame実装に関するドキュメント/例はありますか?
うーん!@ - 近くにいるに違いない気がしますが、まだ十分ではありません!