2009-11-16 87 views
0

構建文件打開對話框替換。現在它的大部分工作,但我想直接從shell視圖對象生成工具欄的視圖模式下拉菜單。如何獲取IShellView上下文菜單中顯示的IContextMenu?

看着IShellView2,我可以看到IShellView2 :: GetView()會給我FOLDERVIEWMODE的支持。然而,這並沒有給我這些模式的名稱,也沒有爲我設置這個彈出式菜單的格式,也沒有立即給我一種方法來真正設置這些模式之一(它看起來有必要銷燬shell視圖窗口並創建替換爲當前文件夾的一個,並指定所需的新FOLDERVIEWMODE ... yeesh)。無論如何,如果右擊一個IShellView窗口,就會得到一個上下文菜單,其中的第一個子菜單正是我想要放在我的下拉工具欄按鈕中(即「view」fly - 出菜單(例如小圖標,中等圖標等))。

似乎應該有辦法直接從IShellView獲取子菜單,而不是硬編碼我的值(並且這樣,如果給定的IShellView實例支持額外的視圖模式,他們會在那裏。同樣,那些應該被禁用的將是,因爲它全部都在IShellView的控制之下)。

我讀過雷蒙德陳的優秀How to host an IContextMenu。不幸的是,這只是給了我一個非常簡單的上下文菜單 - 文件夾本身或給定文件夾中的文件,但不是IShellView的shell視圖窗口的上下文菜單(我可以從中獲取視圖飛出)。

我曾嘗試以下,根據陳的文章:

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

但是,在這裏我只在上下文菜單(打開,探索,...)只有很少的選項。不是我得到的詳細上下文菜單,如果我只需右鍵單擊shell視圖本身。

我對如何繼續進行了一些想法。幫幫我?! ;)

回答

1

嘗試IShellView :: GetItemObject與SVGIO_BACKGROUND爲uItem視圖對象上得到IContextMenu:http://msdn.microsoft.com/en-us/library/bb774832%28VS.85%29.aspx

+0

我不認爲你有任何想法如何確保我可以得到視圖子菜單,無論我在哪個操作系統下運行(包括版本和語言)。 – Mordachai 2009-12-03 16:47:23

+0

對不起。我真的懷疑這是可能的,整個構建win32菜單來枚舉選項似乎很低級別。它似乎是建立在建立菜單的目的,而不是在其中戳(但我可能是錯的) – 2009-12-14 21:36:04

0

還有就是SHCreateDefaultContextMenu(Vista系統上),可能會有所幫助。 Bjarke Viksoe網站也包含很好的信息。
SVGIO_BACKGROUND將爲您提供shell視圖的背景上下文菜單。您可能需要重複調​​用pShellView-> SelectItem來獲取每個PIDL,然後執行GetUIObjectOf調用(然後執行QI for IContextMenu,創建菜單,調用IContextMenu(3):: QueryContextMenu並最終使用TrackPopupMenu顯示它)。

相關問題