Chrome 风格的 C# 应用程序?

Chrome Style C# Applications?

提问人:Kredns 提问时间:2/22/2009 最后编辑:Kredns 更新时间:5/13/2010 访问量:7617

问:

我不是在谈论远景玻璃功能,我已经知道如何做到这一点。我所说的功能是向标题栏添加控件,就像 Office 2007 对徽标和工具栏所做的那样。

C# Windows-Vista 谷歌 Chrome

评论


答:

2赞 Andrew 2/22/2009 #1

我已使用 DotNetBar 控件套件并取得了很好的成功。

22赞 Franci Penov 2/22/2009 #2

您需要执行一些 Win32 互操作才能实现该效果。根据您使用的是 Winforms 还是 WPF,挂接到消息处理的方式会有所不同(我不记得 Winforms,因此我将给出 WPF 的所有示例)。但在这两种情况下,您都需要:

  1. 截获窗口的创建并修改窗口样式和扩展样式。在 WPF 中,需要从 HwndSource 继承并修改 HwndSourceParameters 才能实现此目的。您需要WS_OVERLAPPEDWINDOW、WS_CLIPSIBLINGS和WS_VISIBLE才能获得常规样式和WS_EX_WINDOWEDGE,并WS_EX_APPWINDOW扩展样式。

  2. 通过 HwndSource 参数 HwndSourceHook 添加消息处理程序。

  3. 在第二步通过钩子添加的消息 proc 中,需要处理几条消息:

    • WM_NCACTIVATE - 在应用程序激活或未激活时更改标题的绘制
    • WM_NCCALCSIZE - 返回到没有非工作区的操作系统
    • WM_NCPAINT - 一般来说,你只需要在这里激活窗口矩形,WPF 将负责实际的绘制)
    • WM_NCHITTEST - 处理窗口的移动,最小化和最大化。
  4. 完成上述操作后,WPF 将绘制可视化树的工作区将跨越窗口的整个区域。需要添加“非cliet”视觉对象,以便应用程序在用户看来像常规应用程序。

  5. 您可能需要更多消息:

    • WM_THEMECHANGED是否要更改“非客户”区域绘制以与操作系统主题保持一致
    • WM_DWMCOMPOSITIONCHANGED是否要扩展 glass 并在启用 glass 时获得标准 OS NC-glass 绘画,并在未启用 glass 时切换到自定义逻辑。
  6. 如果要获取用于“非客户端”区域的边框、标题、关闭、最小化和最大化按钮的标准 Win32 资产,则可能需要查看 Win32 主题 API。

  7. 如果您想将 Glass 延伸到您的窗户中,您可以查看:

可以在 P/Invoke 上找到所需的所有消息、样式和相应 Win32 API 的正确 C# 定义。

您还可以通过使用带有 .但是,桌面对您的应用程序和其他应用程序的行为之间会有一些差异;其中最明显的是,您将无法通过右键单击任务栏来堆叠或平铺窗口。WindowStyle=none

您还可以查看一些启用此功能的第三方组件。我没有使用过任何(正如你所看到的,我不害怕 Win32 互操作 :-)),所以我不能特别推荐你。

评论

0赞 Franci Penov 2/22/2009
没有。我本来打算写一个,但我从来没有写过,家里有 5 个月大的婴儿什么的...... :-)
8赞 Erik Funkenbusch 2/22/2009 #3

正如 Franci 所提到的,您想要的是 DwmExtendFrameIntoClientArea。下面是 Codeproject 中的一个示例,演示了如何执行此操作。

http://www.codeproject.com/KB/dialog/AeroNonClientAreaButtons.aspx

评论

1赞 Franci Penov 2/22/2009
请注意,当 Glass 关闭时(例如在 TS 下或用户切换到 Vista basic 时),DwmExtendFrameIntoClientAre 将不起作用。
8赞 Shuft 3/9/2009 #4

WPF 产品团队开发人员 Joe Castro 有一个名为“WPF Chrome”的 MSDN 代码库项目,可用于创建类似 Office 2007 的 UI(即:跨窗口的客户端和非工作区的控件)。

在这里找到它: http://code.msdn.microsoft.com/chrome