上下文弹出窗口是 Windows 功能区框架的 ContextPopup 视图 中的主体控件。 它是一个丰富的上下文菜单系统,它只由框架作为功能区实现的扩展公开—框架不会将上下文弹出窗口公开为独立控件。
上下文弹出窗口的组件
上下文弹出窗口是上下文菜单和 Mini-Toolbar 子控件的逻辑容器,分别通过 ContextMenu 和 MiniToolbar 标记元素公开:
- ContextMenu 公开命令和库菜单。
- MiniToolbar 公开各种命令、库和复杂控件的浮动工具栏,例如 字体控件 和 组合框。
每个子控件最多可以在上下文弹出窗口中显示一次。
以下屏幕截图演示了上下文弹出窗口及其构成子控件。
上下文弹出窗口纯粹是概念性的,不会公开任何 UI 功能本身,例如定位或调整大小。
注意
上下文弹出窗口通常通过右键单击感兴趣的对象的鼠标(或通过键盘快捷方式 Shift+F10)显示。 但是,显示上下文弹出窗口所需的步骤由应用程序定义。
实现上下文弹出窗口
与其他 Windows 功能区框架控件类似,上下文弹出窗口是通过一个标记组件实现的,该组件指定其演示文稿详细信息和一个控制其功能的代码组件。
下表列出了每个上下文 Popup 子控件支持的控件。
控制 | Mini-Toolbar | 上下文菜单 |
---|---|---|
按钮 | x | x |
复选框 | x | x |
组合框 | x | |
Drop-Down 按钮 | x | x |
Drop-Down 颜色选取器 | x | x |
Drop-Down 库 | x | x |
字体控制 | x | |
帮助按钮 | ||
In-Ribbon 库 | ||
微调器 | ||
拆分按钮 | x | x |
拆分按钮库 | x | x |
切换按钮 | x | x |
标记
每个上下文弹出窗口子控件都必须在标记中单独声明。
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>
尽管上下文弹出窗口最多可以包含每个子控件之一,但功能区标记中的多个 ContextMenu 和 MiniToolbar 元素声明有效。 这样,应用程序就可以根据应用程序定义的条件(如工作区上下文)支持上下文菜单和 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 可能无法按预期呈现。
上下文弹出属性
没有与上下文弹出控件关联的属性键。
相关主题