保留功能区状态

Windows Ribon 框架 (功能区) 提供跨应用程序会话保留各种用户设置和首选项的状态的功能。

简介

用户可在运行时自定义功能区的各个方面(包括配置和交互首选项),以提高可用性和工作效率。 功能区框架提供的功能通过 IUIRibbon 接口实现中定义的两种方法跨应用程序会话保留这些设置: IUIRibbon::LoadSettingsFromStreamIUIRibbon::SaveSettingsToStream

可预测的体验

功能区用户体验指南建议,为了尽可能提供最可预测的用户体验,功能区应用程序应保留功能区 (的状态,) 关闭应用程序时,除了最后选择的选项卡之外。 这样,当启动同一应用程序时,可以还原上一个会话中的设置和自定义项,并且用户可以期望继续以与应用程序交互的方式与应用程序交互,就像他们离开应用程序一样。

可在运行时修改并跨应用程序会话保留的功能区设置列在“命令”上下文菜单中。 它们包括:

  • 用户添加到 快速访问工具栏 命令列表的命令。 由 IUICollection 对象通过 UI_PKEY_ItemsSource 属性键指定。

    以下屏幕截图显示了 “添加到快速访问工具栏” 上下文菜单“命令。

    microsoft paint 功能区中命令上下文菜单的屏幕截图。

  • 首选 的快速访问工具栏 停靠状态。 由 UI_PKEY_QuickAccessToolbarDock 属性键的 UI_CONTROLDOCK 值指定。

    此屏幕截图显示“ 快速访问工具栏 ”在其默认应用程序标题栏位置,以及功能区上下文菜单“命令 ”下方的“显示快速访问工具栏 ”。

    microsoft paint 功能区中命令上下文菜单的屏幕截图。

    此屏幕截图显示功能区下方的 “快速访问工具栏 ”。

    停靠在功能区下方的快速访问工具栏的屏幕截图。

  • 功能区最小化状态,由 UI_PKEY_Minimized 属性键的布尔值指定。

    注意

    功能区最小化状态不等效于功能区折叠状态。 处于折叠状态时,功能区将完全隐藏且无法与之交互。 如果应用程序窗口在水平或垂直方向减小到功能区遮盖应用程序工作区时,框架会自动调用此状态。 当应用程序窗口的大小增加时,框架将还原功能区。

     

    此屏幕截图显示 最小化功能区 上下文菜单命令。

    microsoft paint 功能区中命令上下文菜单的屏幕截图。

    此屏幕截图显示了最小化功能区。

    最小化的 Microsoft 画图功能区的屏幕截图。

保存功能区设置

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 方法加载其功能区状态。

快速访问工具栏