上下文弹出窗口
上下文弹出窗口是 Windows 功能区框架的 ContextPopup 视图中 的主体控件。 它是一个丰富的上下文菜单系统,仅由框架作为功能区实现的扩展公开 ,框架不会将上下文弹出窗口公开为独立控件。
上下文弹出窗口的组件
上下文弹出窗口是上下文菜单和分别通过 ContextMenu 和 MiniToolbar 标记元素公开的Mini-Toolbar子控件的逻辑容器:
- ContextMenu 公开命令和库菜单。
- MiniToolbar 公开各种命令、库和复杂控件(如字体控件和组合框)的浮动工具栏。
每个子控件最多可以在上下文弹出窗口中出现一次。
以下屏幕截图演示了上下文弹出窗口及其构成子控件。
上下文弹出窗口纯粹是概念性的,不公开任何 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>
尽管上下文弹出窗口最多可以包含每个子控件之一,但功能区标记中的多个 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可能无法按预期呈现。
上下文弹出属性
没有与上下文弹出控件关联的属性键。
相关主题