我不是在谈论 vista glass 功能,我已经知道如何实现它。我正在谈论的功能是向标题栏添加控件,就像 Office 2007 对徽标和工具栏所做的那样。
4 回答
你需要做一些 Win32 互操作来达到这个效果。根据您使用的是 Winforms 还是 WPF,您连接到消息处理的方式会有所不同(我不记得 Winforms,所以我将给出 WPF 的所有示例)。但在这两种情况下,您都需要:
拦截窗口的创建,修改窗口样式和扩展样式。在 WPF 中,您需要继承
HwndSource
并修改HwndSourceParameters
以实现此目的。常规样式需要 WS_OVERLAPPEDWINDOW、WS_CLIPSIBLINGS 和 WS_VISIBLE,扩展样式需要 WS_EX_WINDOWEDGE 和 WS_EX_APPWINDOW。通过 HwndSource 参数 HwndSourceHook 添加消息处理程序。
在第二步通过钩子添加的message proc中,需要处理几条消息:
WM_NCACTIVATE
- 在应用程序激活或不激活时更改标题的绘画WM_NCCALCSIZE
- 返回没有非客户区的操作系统WM_NCPAINT
- 通常你只需要在这里使窗口矩形失效,WPF 会处理实际的绘画)WM_NCHITTEST
- 处理窗口的移动,最小化和最大化。
完成上述操作后,WPF 将绘制可视化树的客户区域将跨越窗口的整个区域。您将需要添加“非客户端”视觉效果,以便您的应用程序在用户看来就像一个常规应用程序。
您可能需要更多消息:
WM_THEMECHANGED
如果你想改变你的“非客户”区域绘画与操作系统主题一致WM_DWMCOMPOSITIONCHANGED
如果您想在启用玻璃时扩展玻璃并获得标准 OS NC 玻璃绘画,并在未启用玻璃时切换到您的自定义逻辑。
如果您想获得用于边框、标题、关闭、最小化和最大化按钮的标准 Win32 资产以在“非客户端”区域中使用,您可能需要查看 Win32 主题 API。
如果您想将 Glass 扩展到您的窗口中,您可以查看:
DwmExtendFrameIntoClientArea
- 获得标准玻璃 NC 区域DwmDefWindowProc
- 让桌面管理器绘制 Glass 和标准 NC 控件DwmIsCompositionEnabled
- 确定是否启用了 Glass;只有在 Glass 启用的情况下,您才能使用上述两个 API。如果 Glass 未启用,您需要自己绘制 NC 区域。
您可以在P/Invoke上找到所需的所有消息、样式和相应 Win32 API 的正确 C# 定义。
您也可以通过使用带有WindowStyle=none
. 但是,桌面对您的应用程序和其他应用程序的行为会有一些差异;其中最明显的是,您将无法通过右键单击任务栏来堆叠或平铺窗口。
您还可以查看一些启用此功能的第三方组件。我没有使用过任何(如你所见,我并不害怕 Win32 互操作 :-)),所以我不能特别推荐你。
正如弗朗西提到的,你想要的是 DwmExtendFrameIntoClientArea。这是来自 Codeproject 的一个示例,它展示了如何做到这一点。
http://www.codeproject.com/KB/dialog/AeroNonClientAreaButtons.aspx
WPF 产品团队开发人员 Joe Castro 有一个名为“WPF Chrome”的 MSDN 代码库项目,可用于创建类似 Office 2007 的 UI(即:跨越窗口的客户端和非客户端区域的控件)。
在这里找到它:http: //code.msdn.microsoft.com/chrome
我已经成功使用了 DotNetBar 控制套件。