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