保存功能區狀態

Windows (Framework (功能區) 可讓您在應用程式會話之間保留各種使用者設定和喜好設定的狀態。

簡介

功能區的各個層面,包括設定和互動喜好設定,都可以在執行時間由使用者自訂,以改善可用性和生產力。 功能區架構提供透過 IUIRibbon 介面實作中定義的兩種方法,跨應用程式會話保留這些設定的功能: IUIRibbon::LoadSettingsFromStreamIUIRibbon::SaveSettingsToStream

可預測的體驗

功能區使用者體驗指導方針建議,若要盡可能提供最可預測的使用者體驗,功能區應用程式應該保留功能區的狀態, (除了最後選取的索引標籤之外,) 關閉應用程式時保留功能區的狀態。 如此一來,當相同的應用程式啟動時,就可以還原上一個會話中的設定和自訂專案,而且使用者可以預期會以與離開應用程式相同的方式繼續與應用程式互動。

功能區設定可在執行時間修改,並在應用程式會話之間保留,會列在 [命令] 操作功能表中。 包括:

  • 使用者新增至 [快速存取工具列 命令] 清單的命令。 透過UI_PKEY_ItemsSource屬性索引鍵,由IUICollection物件指定。

    下列螢幕擷取畫面顯示 [ 新增至快速存取工具列] 操作功能表命令。

    microsoft paint 功能區中命令操作功能表的螢幕擷取畫面。

  • 慣用的 快速存取工具列 停駐狀態。 由 UI_PKEY_QuickAccessToolbarDock 屬性索引鍵 的UI_CONTROLDOCK 值指定。

    此螢幕擷取畫面會顯示其預設應用程式標題列位置中的 快速存取工具列 ,以及功能區操作功能表命令 下方的 [顯示快速存取工具列 ]。

    microsoft paint 功能區中命令操作功能表的螢幕擷取畫面。

    此螢幕擷取畫面顯示功能區下方的 [快速存取工具列 ]。

    快速存取工具列的螢幕擷取畫面,停駐在功能區下方。

  • 功能區最小化狀態,如 UI_PKEY_Minimized 屬性索引鍵的布林值所指定。

    注意

    功能區最小化狀態不等於功能區折迭狀態。 處於折迭狀態時,功能區會完全隱藏且無法與其互動。 架構會自動叫用此狀態,如果應用程式視窗的大小會水準或垂直減少到功能區遮蔽應用程式工作區的點。 當應用程式視窗的大小增加時,架構會還原功能區。

     

    此螢幕擷取畫面顯示 [ 最小化功能區 ] 操作功能表 [命令]。

    microsoft paint 功能區中命令操作功能表的螢幕擷取畫面。

    此螢幕擷取畫面顯示最小化的功能區。

    最小化 microsoft paint 功能區的螢幕擷取畫面。

儲存功能區設定

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_ACTI加值稅E 通知。 停用的最上層視窗會使用 IUIRibbon::SaveSettingsToStream 方法儲存其功能區狀態,而啟動的最上層視窗會使用 IUIRibbon::LoadSettingsFromStream 方法載入其功能區狀態。

快速 Access 工具列