15

我不是在谈论 vista glass 功能,我已经知道如何实现它。我正在谈论的功能是向标题栏添加控件,就像 Office 2007 对徽标和工具栏所做的那样。

4

4 回答 4

22

你需要做一些 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. 在第二步通过钩子添加的message proc中,需要处理几条消息:

    • WM_NCACTIVATE- 在应用程序激活或不激活时更改标题的绘画
    • WM_NCCALCSIZE- 返回没有非客户区的操作系统
    • WM_NCPAINT- 通常你只需要在这里使窗口矩形失效,WPF 会处理实际的绘画)
    • WM_NCHITTEST- 处理窗口的移动,最小化和最大化。
  4. 完成上述操作后,WPF 将绘制可视化树的客户区域将跨越窗口的整个区域。您将需要添加“非客户端”视觉效果,以便您的应用程序在用户看来就像一个常规应用程序。

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

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

  7. 如果您想将 Glass 扩展到您的窗口中,您可以查看:

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

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

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

于 2009-02-22T03:26:51.307 回答
8

正如弗朗西提到的,你想要的是 DwmExtendFrameIntoClientArea。这是来自 Codeproject 的一个示例,它展示了如何做到这一点。

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

于 2009-02-22T03:48:38.570 回答
8

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

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

于 2009-03-08T21:35:31.043 回答
2

我已经成功使用了 DotNetBar 控制套件。

于 2009-02-22T03:13:03.803 回答