Chrome和Firefox 4,以及其他应用程序,现在把它们的一些用户界面放在标题栏中。在Windows中,操作系统通常控制整个标题栏。应用程序可以通过删除OS标题栏并绘制一个“假”标题栏来创建自定义标题栏(如WinAmp),但只有OS知道如何绘制标题栏的非自定义元素(例如,关闭/最小化/最大化),这些元素随操作系统版本的不同而有所不同。
像Chrome和Firefox这样的应用程序通过什么机制与操作系统“共享”标题栏(在标题栏中放置自定义元素,同时保留原始操作系统的可视主题)?

在Chrome中,制表符会侵占标题栏,因此没有足够的空间用于标题栏文本。
发布于 2011-04-07 21:07:59
微软在文章使用DWM的自定义窗口帧中有一个非常详细的解释。
发布于 2011-04-05 21:48:06
标题栏和窗口边框属于该窗口的非工作区(NC)。如果您正在编写基于消息泵的应用程序,您可以使用WM_NCPAINT和WM_NCHITTEST窗口消息提供自己的逻辑和外观(就像Jon编写的那样)。
虽然这一领域在以前的Windows版本中被适度使用,但微软最近(至少在Vista之后)开始使非客户端区域更具吸引力和功能丰富。
在现代应用程序中,很常见的做法是完全忽略非客户端区域,而是创建一个没有严格窗口边界的窗口,因此只包含一个客户端区域。使用这种方法,窗口必须为绘制窗口标题和窗口按钮提供自己的实现(最小化、最大化/重新分配和关闭)。将这种技术与窗口透明性相结合,可以很容易地创建令人兴奋的用户界面。
如果您正在使用WPF,您会发现WindowChrome类对此非常有用。该类是.NET 4框架的一部分,可作为.NET 3.5的独立图书馆使用。
编辑
显然有人不喜欢这个答案。我要澄清的是:我并不是说Chrome或其他应用程序就是这样做的。我要说的是,我所描述的这是一个可行的解决方案,我本人和我所在的公司已经在几个项目中使用过,而且我知道其他几个应用程序使用了相同的方法。这可能不是最好的,但这肯定是一种方法!:)
发布于 2011-04-05 21:12:20
我懒得去查看chrome和firefox的源代码,找不出它们到底做了什么,但它很可能包括WM_NCPAINT和WM_NCHITTEST的自定义处理。他们可以允许操作系统做基本的标题栏绘画,然后把自己的部分贴在上面。另一种方法是自己完成所有的绘制,包括调用DWM api来处理所有花哨的比特。不管是哪种方式,尝试和做都是一件丑陋的事情,如果你做得不对,它会看起来很糟糕,感觉也很糟糕。
https://stackoverflow.com/questions/5558118
复制相似问题