保持功能區狀態
Windows Ribbon 架構功能區可讓您在應用程式會話之間保留各種使用者設定與偏好的狀態。
介紹
功能區的各個層面,包括設定和互動喜好設定,都可以在執行期間由使用者自訂,以提升可用性和生產力。 功能區架構提供的功能,可透過實作 IUIRibbon 介面中定義的兩種方法來跨應用程式會話保留這些設定: IUIRibbon::LoadSettingsFromStream 和 IUIRibbon::SaveSettingsToStream。
可預測的體驗
功能區用戶體驗指導方針 建議,為了盡可能提供最可預測的用戶體驗,功能區應用程式應該在關閉應用程式時保留功能區的狀態(除了最後一個選取的索引卷標之外)。 如此一來,當相同的應用程式啟動時,可以還原先前會話中的設定和自定義,而且用戶預期會以與應用程式離開時相同的方式繼續與應用程式互動。
您可以運行時修改並保留跨應用程式工作階段的功能區設定,這些設定會列在 [命令內容]功能表中。 其中包括:
使用者新增至 快速存取工具列 命令清單的命令。 由 IUICollection 物件透過 UI_PKEY_ItemsSource 屬性索引鍵指定。
下列螢幕快照顯示 [新增至快速存取工具列]作菜单 [命令]。
慣用 快速存取工具列 停駐狀態。 由 UI_PKEY_QuickAccessToolbarDock 屬性索引鍵的 UI_CONTROLDOCK 值指定。
此螢幕快照顯示 快速存取工具列 在其預設的應用程式標題欄位置,以及功能區下方的 [顯示快速存取工具列] 的 快顯功能表命令。
此螢幕快照顯示功能區下方 快速存取工具列。
功能區的最小化狀態由布爾值指定,如 UI_PKEY_Minimized 屬性鍵所示。
註記
功能區最小化狀態不等於功能區摺疊狀態。 處於折疊狀態時,功能區會完全隱藏,無法被操作。 框架會在應用程式視窗以水準或垂直方式縮小到導致功能區遮蔽了應用程式工作區時,自動調用此狀態。 當應用程式視窗的大小增加時,架構會還原功能區。
此螢幕快照顯示 最小化功能區 的內容菜单命令。
此螢幕快照顯示最小化的功能區。
儲存功能區設定
IUIRibbon::SaveSettingsToStream 方法會將持久功能區狀態以二進位形式(如上一節所述)寫入 IStream 物件。 然後,應用程式會將 IStream 物件的內容儲存至檔案或 Windows 登錄。
下列範例示範使用 IUIRibbon::SaveSettingsToStream 方法將功能區狀態寫入 IStream 物件所需的基本程式碼。
// pRibbon - Pointer to the IUIRibbon interface
// ppStatusStream - Pointer to the location of a newly created IStream object
HRESULT CApplication::SaveRibbonStatusToStream(
__in IUIRibbon *pRibbon,
__out IStream **ppStatusStream)
{
HRESULT hr = E_FAIL;
*ppStatusStream = NULL;
IStream* pStream;
if (SUCCEEDED(hr = CreateStreamOnHGlobal(
NULL, // Internally allocate a new shared memory.
FALSE, // Free hGlobal after IStream object released.
&pStream)))
{
if (SUCCEEDED(hr = pRibbon->SaveSettingsToStream(*ppStatusStream)))
{
pStream->AddRef();
*ppStatusStream = pStream;
}
pStream->Release();
}
return hr;
}
載入功能區設定
IUIRibbon::LoadSettingsFromStream 方法用來擷取由 IUIRibbon::SaveSettingsToStream 方法儲存為 IStream 物件的持久性功能區狀態資訊。 當應用程式初始化時,IStream 物件中的資訊會套用至功能區 UI。
下列範例示範使用 IUIRibbon::LoadSettingsFromStream 方法,從 IStream 物件載入功能區狀態所需的基本程序代碼。
// pRibbon - Pointer to the IUIRibbon interface
// pStatusStream - Pointer to the IStream object that contains the Ribbon state information
HRESULT CApplication::LoadRibbonStatusFromStream(
__in IUIRibbon *pRibbon,
__in IStream *pStatusStream)
{
HRESULT hr = E_FAIL;
if (pStatusStream)
{
// Set the stream position to the beginning first.
LARGE_INTEGER liStart = {0, 0};
ULARGE_INTEGER ulActual;
pStatusStream->Seek(liStart, STREAM_SEEK_SET, &ulActual);
hr = pRibbon->LoadSettingsFromStream(pStatusStream);
}
return hr;
}
為了獲得最佳效能,應該從架構初始化階段的 IUIApplication::OnViewChanged 回呼函式呼叫 IUIRibbon::LoadSettingsFromStream 方法,如下列範例所示。
IFACEMETHODIMP CMyRibbonApplication::OnViewChanged(
UINT nViewID,
__in UI_VIEWTYPE typeID,
__in IUnknown* pView,
UI_VIEWVERB verb,
INT iReasonCode)
{
HRESULT hr = E_NOTIMPL;
if (UI_VIEWVERB_CREATE == verb)
{
IUIRibbon* pRibbon = NULL;
hr = pView->QueryInterface(IID_PPV_ARGS(&pRibbon));
if (SUCCEEDED(hr))
{
hr = _LoadRibbonSettings(pRibbon);
pRibbon->Release();
}
}
return hr;
}
HRESULT CMyRibbonApplication::_LoadRibbonSettings(IUIRibbon* pRibbon)
{
...
pRibbon->LoadSettingsFromStream(pStream);
...
}
相同功能區架構應用程式的多個實例可以將每個功能區狀態作為獨立的 IStream 物件來管理,或透過單一 IStream 物件作為群組來管理。
跨應用程式實例群組同步處理功能區狀態時,每個最上層視窗都必須接聽 WM_ACTIVATE 通知。 停用的最上層視窗會使用 IUIRibbon::SaveSettingsToStream 方法儲存其功能區狀態,而最上層視窗會使用 IUIRibbon::LoadSettingsFromStream 方法載入其功能區狀態。
相關主題