上下文弹出窗口

上下文弹出窗口是 Windows 功能区框架的 ContextPopup 视图中 的主体控件。 它是一个丰富的上下文菜单系统,仅由框架作为功能区实现的扩展公开 ,框架不会将上下文弹出窗口公开为独立控件。

上下文弹出窗口的组件

上下文弹出窗口是上下文菜单和分别通过 ContextMenuMiniToolbar 标记元素公开的Mini-Toolbar子控件的逻辑容器:

每个子控件最多可以在上下文弹出窗口中出现一次。

以下屏幕截图演示了上下文弹出窗口及其构成子控件。

带有标注的屏幕截图,其中显示了功能区上下文 ui 组件。

上下文弹出窗口纯粹是概念性的,不公开任何 UI 功能本身,例如定位或大小调整。

注意

上下文弹出窗口通常通过右键单击鼠标 (或通过键盘快捷方式 SHIFT+F10) 感兴趣的对象来显示。 但是,显示上下文弹出窗口所需的步骤由应用程序定义。

 

实现上下文弹出窗口

与其他 Windows 功能区框架控件类似,上下文弹出窗口是通过标记组件实现的,该组件指定其呈现详细信息,以及控制其功能的代码组件。

下表列出了每个上下文弹出窗口子控件支持的控件。

控制 Mini-Toolbar 上下文菜单
Button x x
复选框 x x
组合框 x
下拉按钮 x x
下拉颜色选取器 x x
下拉库 x x
字体控件 x
“帮助”按钮
功能区内库
Spinner
拆分按钮 x x
拆分按钮库 x x
切换按钮 x x

 

标记

每个上下文 Popup 子控件都必须在标记中单独声明。

Mini-Toolbar

将控件添加到上下文弹出迷你工具栏时,应考虑以下两项建议:

  • 控件应高度可识别,并提供明显的功能。 熟悉是关键,因为不会为Mini-Toolbar控件公开标签和工具提示。
  • 控件公开的每个命令都应显示在功能区 UI 中的其他位置。 Mini-Toolbar不支持键盘导航。

以下示例演示包含三个 Button 控件的 MiniToolbar 元素的基本标记。

注意

为微型工具栏中的每一行控件指定一个 MenuGroup 元素。

 

<MiniToolbar Name="MiniToolbar">
  <MenuGroup>
    <Button CommandName="cmdButton1" />
    <Button CommandName="cmdButton2" />
    <Button CommandName="cmdButton3" />
  </MenuGroup>
</MiniToolbar>

上下文菜单

以下示例演示包含三个 Button 控件的 ContextMenu 元素的基本标记。

注意

MenuGroup 元素中的每个控件集都由上下文菜单中的水平条分隔。

 

<ContextMenu Name="ContextMenu">
  <MenuGroup>
    <Button CommandName="cmdCut" />
    <Button CommandName="cmdCopy" />
    <Button CommandName="cmdPaste" />
  </MenuGroup>
</ContextMenu>

尽管上下文弹出窗口最多可以包含每个子控件之一,但功能区标记中的多个 ContextMenuMiniToolbar 元素声明是有效的。 这样,应用程序就可以根据应用程序定义的条件(例如工作区上下文)支持上下文菜单和Mini-Toolbar控件的各种组合。

有关详细信息,请参阅 ContextMap 元素。

以下示例演示 ContextPopup 元素的基本标记。

<ContextPopup>
  <ContextPopup.MiniToolbars>
    <MiniToolbar Name="MiniToolbar">
      <MenuGroup>
        <Button CommandName="cmdButton1" />
        <Button CommandName="cmdButton2" />
        <Button CommandName="cmdButton3" />
      </MenuGroup>
    </MiniToolbar>
  </ContextPopup.MiniToolbars>
  <ContextPopup.ContextMenus>
    <ContextMenu Name="ContextMenu">
      <MenuGroup>
        <Button CommandName="cmdCut" />
        <Button CommandName="cmdCopy" />
        <Button CommandName="cmdPaste" />
      </MenuGroup>
    </ContextMenu>
  </ContextPopup.ContextMenus>
  <ContextPopup.ContextMaps>
    <ContextMap CommandName="cmdContextMap" ContextMenu="ContextMenu" MiniToolbar="MiniToolbar"/>
  </ContextPopup.ContextMaps>
</ContextPopup>

代码

若要调用上下文弹出窗口,当功能区应用程序的顶级窗口收到WM_CONTEXTMENU通知时,将调用 IUIContextualUI::ShowAtLocation 方法。

此示例演示如何在功能区应用程序的 WndProc () 方法中处理WM_CONTEXTMENU通知。

case WM_CONTEXTMENU:
  POINT pt;
  POINTSTOPOINT(pt, lParam);

  // ShowContextualUI method defined by the application.
  ShowContextualUI (pt, hWnd);
  break;

以下示例演示功能区应用程序如何使用 IUIContextualUI::ShowAtLocation 方法在特定屏幕位置显示上下文弹出窗口。

GetCurrentContext () 的值 cmdContextMap 在前面的标记示例中定义。

g_pApplication是对 IUIFramework 接口的引用。

HRESULT ShowContextualUI(POINT& ptLocation, HWND hWnd)
{
  GetDisplayLocation(ptLocation, hWnd);

  HRESULT hr = E_FAIL;

  IUIContextualUI* pContextualUI = NULL;
 
  if (SUCCEEDED(g_pFramework->GetView(
                                g_pApplication->GetCurrentContext(), 
                                IID_PPV_ARGS(&pContextualUI))))
  {
    hr = pContextualUI->ShowAtLocation(ptLocation.x, ptLocation.y);
    pContextualUI->Release();
  }

  return hr;
}

在关闭上下文弹出窗口之前,可以释放对 IUIContextualUI 的引用,如前面的示例所示。 但是,必须在某些时候释放引用,以避免内存泄漏。

注意

Mini-Toolbar具有基于鼠标指针邻近度的内置淡出效果。 出于此原因,建议显示Mini-Toolbar尽可能靠近鼠标指针。 否则,由于显示机制冲突,Mini-Toolbar可能无法按预期呈现。

 

上下文弹出属性

没有与上下文弹出控件关联的属性键。

Windows 功能区框架控件库

ContextPopup 示例