Chrome和Firefox 4以及其他应用程序现在将其部分用户界面放在标题栏中。在Windows中,操作系统通常控制整个标题栏。应用程序可以通过删除操作系统标题栏并绘制“假”标题栏(如WinAmp)来创建自定义标题栏,但只有操作系统知道如何绘制标题栏的非自定义元素(例如,关闭/最小化/ Maximize),因操作系统版本而异。
Chrome和Firefox等应用程序通过什么机制与操作系统“共享”标题栏(在保留原始操作系统视觉主题的同时在标题栏中放置自定义元素)?
在Chrome中,标签会侵占标题栏,因此标题文字空间不足。
答案 0 :(得分:21)
Microsoft在文章Custom Window Frame Using DWM中有一个非常详细的解释。
答案 1 :(得分:5)
标题栏和窗口边框属于窗口的非客户区(NC)。如果您正在编写基于消息泵的应用程序,则可以使用WM_NCPAINT和WM_NCHITTEST窗口消息提供您自己的逻辑和该区域的外观(就像Jon写的那样)。
虽然此区域在之前的Windows版本中使用得非常适度,但微软最近(至少从Vista开始)开始使非客户区域更具吸引力且功能更丰富。
在现代应用程序中,完全忽略非客户区域而不是创建一个没有严格窗口边界的窗口是很常见的,因此只包含一个客户区域。使用此方法,窗口必须提供它自己的实现,用于绘制窗口标题和窗口按钮(最小化,最大化/恢复和关闭)。将此技术与窗口透明度相结合,可以轻松创建令人兴奋的用户界面。
如果您使用WPF,您会发现WindowChrome class对此非常有用。此类是.NET 4框架的一部分,可用作.NET 3.5的separate library。
修改强>
显然有人不喜欢这个答案。需要明确的是:我并不是说Chrome或任何其他应用程序正在这样做。我说我如何描述它是一个可行的解决方案,我自己和我工作的公司已经在几个项目中使用,我知道其他几个应用程序使用相同的方法。它可能不是最好的,但它肯定是一种方法! : - )
答案 2 :(得分:1)
我太懒了,不敢去查看chrome和firefox的来源,以确切了解他们做了什么,但它很可能包括WM_NCPAINT和WM_NCHITTEST的自定义处理。他们可以让操作系统进行基本的标题栏绘画,然后将自己的位置放在顶部。另一种方法是自己完成所有绘画,包括调用DWM api来处理所有奇特的位。无论哪种方式,这都是一件难以尝试的事情,如果你做得不对,它看起来会很糟糕。
答案 3 :(得分:0)
也许值得一看: https://github.com/lstratman/.NETTitleBarTabs
和另一个链接: http://www.nuget.org/packages/TitleBarTabs/
我自己没有尝试过,并会研究它是如何以及如何运作的。