37

Chrome 和 Firefox 4 以及其他应用程序现在将它们的一些用户界面放在标题栏中。在 Windows 中,操作系统通常控制整个标题栏。应用程序可以通过删除 OS 标题栏并改为绘制“假”标题栏(如 WinAmp)来创建自定义标题栏,但只有 OS 知道如何绘制标题栏的非自定义元素(例如关闭/最小化/Maximize),因操作系统版本而异。

Chrome 和 Firefox 等应用程序通过什么机制与操作系统“共享”标题栏(在标题栏中放置自定义元素,同时保持原始操作系统视觉主题)?

在此处输入图像描述

在 Chrome 中,标签占据了标题栏,因此没有足够的空间用于标题文本。

4

4 回答 4

23

微软在Custom Window Frame Using DWM一文中有非常详细的解释。

于 2011-04-07T21:07:59.203 回答
7

标题栏和窗口边框属于窗口的非客户区(NC)。如果您正在编写基于消息泵的应用程序,您可以使用 WM_NCPAINT 和 WM_NCHITTEST 窗口消息提供您自己的逻辑和该区域的外观(就像 Jon 写的那样)。

虽然这个区域在以前的 Windows 版本中使用得相当适度,但微软最近(至少从 Vista 开始)开始使非客户区域更具吸引力和功能丰富。

在现代应用程序中,完全忽略非客户区是很常见的,而是创建一个没有严格窗口边框的窗口,因此只包含一个客户区。使用这种方法,窗口必须提供它自己的实现来绘制窗口标题和窗口按钮(最小化、最大化/修复和关闭)。将这种技术与窗口透明度相结合,可以很容易地创建令人兴奋的用户界面。

如果您使用 WPF,您会发现WindowChrome 类对此非常有用。此类是 .NET 4 框架的一部分,可作为.NET 3.5的单独库使用。

编辑

显然有人不喜欢这个答案。需要明确的是:我并不是说 Chrome 或任何其他应用程序就是这样做的。我是说我所描述的这是一个可行的解决方案,我自己和我工作的公司已经在几个项目中使用过,而且我知道其他几个应用程序使用相同的方法这一事实。它可能不是最好的,但它肯定是一种方法!:-)

于 2011-04-05T21:48:06.863 回答
2

我懒得去查看 chrome 和 firefox 的源代码来了解它们到底做了什么,但它很可能包括对 WM_NCPAINT 和 WM_NCHITTEST 的自定义处理。他们可以允许操作系统进行基本的标题栏绘制,然后将自己的位粘贴在上面。另一种方法是自己完成所有绘制,包括调用 DWM api 来处理所有花哨的位。无论哪种方式,尝试去做都是一件丑陋的事情,如果你做得不好,它的外观和感觉都会很糟糕。

于 2011-04-05T21:12:20.717 回答
1

也许这也值得一看: https ://github.com/lstratman/.NETTitleBarTabs

和另一个链接: http ://www.nuget.org/packages/TitleBarTabs/

我自己还没有尝试过,并将对其进行研究,看看它是如何以及如何运作的。

于 2014-04-04T09:38:26.550 回答