Chrome和Firefox 4等应用程序现在将其用户界面的一部分放在标题栏中。 在Windows中,操作系统通常控制整个标题栏。 应用程序可以创build一个自定义标题栏,通过删除操作系统标题栏,并绘制一个“假”的标题栏(如WinAmp),但只有操作系统知道如何绘制标题栏的非定制元素(例如closures/最小化/最大化),根据操作系统版本不同。
Chrome和Firefox等应用程序通过什么机制与操作系统“共享”标题栏(在标题栏中放置自定义元素,同时保持原始的操作系统视觉主题)?
在Chrome中,这些标签会侵犯标题栏,因此标题文本没有足够的空间。
微软在使用DWM的自定义窗口框架文章中有一个非常详细的解释。
标题栏和窗口边框属于窗口的非客户区(NC)。 如果您正在编写基于消息泵的应用程序,则可以使用WM_NCPAINT和WM_NCHITTEST窗口消息(就像Jon写的)一样提供您自己的逻辑和该区域的外观。
虽然这个领域在以前的Windows版本中已经相当适用,但是微软最近(至少从Vista开始)开始使非客户端区域更具吸引力和功能丰富。
在现代应用程序中,完全忽略非客户区域是相当常见的,而是创建一个没有严格窗口边界的窗口,因此只由一个客户区组成。 使用这种方法,窗口必须提供自己的实现来绘制窗口标题和窗口按钮(最小化,最大化/重新生成和关闭)。 将这种技术与窗口透明度相结合,可以很容易地创建令人兴奋的用户界面。
如果您使用的是WPF,您会发现WindowChrome类对此非常有用。 这个类是.NET 4框架的一部分,可以作为.NET 3.5的单独库使用。
编辑
显然有人不喜欢这个答案。 只是要清楚:我不是说这是如何Chrome或任何其他应用程序正在这样做。 我说的是,我如何描述这是一个可行的解决方案,我和我所在的公司已经在几个项目中使用过,我知道其他几个应用程序使用相同的方法。 这可能不是最好的,但它肯定是一个方法去做! 🙂
我懒得去查看chrome和firefox的源代码来确切地知道他们做了什么,但它很可能包括WM_NCPAINT和WM_NCHITTEST的自定义处理。 他们可以允许操作系统做基本的标题栏绘画,然后将自己的位置放在顶部。 另一种方法是自己做所有的绘画,包括调用DWM API来处理所有的花式点。 无论哪种方式,尝试做这件事都是一件丑事,如果做得不对,就会感觉很糟糕。
也许这是值得一看的: https : //github.com/lstratman/.NETTitleBarTabs
和另一个链接: http : //www.nuget.org/packages/TitleBarTabs/
我没有自己尝试过,并且会研究它是如何以及如何运作的。