【发布时间】:2010-10-09 02:55:20
【问题描述】:
我不是在谈论 vista glass 功能,我已经知道如何实现它。我所说的功能是向标题栏添加控件,就像 office 2007 对徽标和工具栏所做的那样。
【问题讨论】:
标签: c# windows-vista google-chrome
我不是在谈论 vista glass 功能,我已经知道如何实现它。我所说的功能是向标题栏添加控件,就像 office 2007 对徽标和工具栏所做的那样。
【问题讨论】:
标签: c# windows-vista google-chrome
你需要做一些 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 如果您想扩展 glass 并在 glass 启用时获得标准 OS NC-glass 绘画,并在 glass 未启用时切换到您的自定义逻辑。如果您想获取用于边框、标题、关闭、最小化和最大化按钮的标准 Win32 资源,以便在“非客户端”区域中使用,您可能需要查看 Win32 主题 API。
如果你想将 Glass 扩展到你的窗口,你可以看看:
DwmExtendFrameIntoClientArea - 获取标准玻璃 NC 区域DwmDefWindowProc - 让桌面管理器绘制 Glass 和标准 NC 控件DwmIsCompositionEnabled - 确定 Glass 是否启用;只有在 Glass 启用的情况下,您才能使用上述两个 API。如果 Glass 未启用,您需要自己绘制 NC 区域。您可以在P/Invoke 上找到所需的所有消息、样式和相应 Win32 API 的正确 C# 定义。
您也可以通过使用带有WindowStyle=none 的标准WPF 窗口来实现类似的效果。但是,桌面对您的应用程序和其他应用程序的行为会有一些差异;其中最明显的是,您将无法通过右键单击任务栏来堆叠或平铺窗口。
您还可以查看一些启用此功能的第三方组件。我没有使用过任何(如你所见,我并不害怕 Win32 互操作 :-)),所以我不能特别推荐你。
【讨论】:
正如 Franci 所提到的,您想要的是 DwmExtendFrameIntoClientArea。这是 Codeproject 中的一个示例,展示了如何做到这一点。
http://www.codeproject.com/KB/dialog/AeroNonClientAreaButtons.aspx
【讨论】:
Joe Castro 是 WPF 产品团队开发人员,他有一个名为“WPF Chrome”的 MSDN 代码库项目,可用于创建类似于 Office 2007 的 UI(即:跨越客户端和非客户端区域的控件窗口)。
【讨论】:
我已成功使用 DotNetBar 控件套件。
【讨论】: