航空玻璃窗上的非客户绘画
Posted
技术标签:
【中文标题】航空玻璃窗上的非客户绘画【英文标题】:Non client painting on aero glass window 【发布时间】:2011-08-03 19:59:57 【问题描述】:现在我正在自定义我的应用程序的标题栏。我的目标是在标题栏上添加一个额外的按钮。我是我的previous question,人们建议我如何自定义非客户区。除了一件小事 - 发光,这一切都很好!我可以在非客户区绘制发光,但我不能让它扩散到窗口外。我也找不到关于这个主题的任何资源。
我查看了this 示例并制作了自己的测试应用程序来调查非客户绘图设施。我的应用程序窗口的屏幕截图:
所以您可以看到当 my 被边框剪裁时,系统按钮会从窗口中发光。
例如,Skype 的窗口在标题栏中有四个自定义按钮,它们可以“发光”出窗口框架:
任何人都可以建议我找出将按钮的发光绘制到窗外的方法吗? 提前致谢!
[编辑] 谢谢大家的解答!
【问题讨论】:
对于所有令人作呕的 UI,Skype 窗口的非客户区给我留下了异常积极的印象。 @BoltClock:我受到 Skype 的启发,完全自定义了我的应用程序窗口 @Anton:我也应该在我的应用程序中使用 NC 区域 :) 有些事情比看起来更难。例如,很久以前,我必须阅读大量文章和代码才能在玻璃上绘制具有发光效果的字符串(如在标题栏中)。我确信有办法做到这一点,但我认为这不会那么容易,因为它必须与 WDM 一起使用——也许联系 Skype 团队会更好地帮助你。 Btw Chromium 现在可以做到这一点(它添加了一个“登录”按钮) 【参考方案1】:Skype 欺骗了它,并且在他们的窗口顶部有一个小条子;他们可以在哪里画。
您可以使用 Process Explorer to SpyXX 查看它:
另见
MSDN:Custom Window Frame Using DWM
【讨论】:
是的,我对这种方法有一些假设,但我一直怀疑到现在。谢谢! 嗯,我今天注意到 Chrome 有全尺寸的实际主题按钮。另一方面,Skype 有一些与主题不完全相同的自定义按钮。并且 Spyxx 没有在 Chrome(或 Office 2007,也绘制在 NC 区域)上方显示边框。所以有一个解决方案。我尝试浏览 Chromium 源,但我无法使用 WM_NCPAINT 处理程序。 @Ian:这些按钮是系统绘制的。这样的界面是通过自定义窗口的框架创建的。你可以在这里阅读更多关于它的信息msdn.microsoft.com/en-us/library/bb688195.aspx @Anton Semenov 这很……无证。 DWM 只是发生 绘制系统按钮——即使我从未要求它这样做?难怪这毫无意义——这毫无意义! @Ian:"even though i never asked it to"
这不是绝对正确的。您已经通过窗口样式msdn.microsoft.com/en-us/library/ms632600%28VS.85%29.aspx 向系统询问有关绘制系统按钮的问题。【参考方案2】:
我认为不可能在您的 NC 区域之外绘制,我有点怀疑他们绘制整个 UI 以完全匹配 DWM Aero 效果。
考虑到它的外观,我想知道他们是否使用 CustomBorderForm 的帮助或恢复按钮做了一些技巧,然后“免费”获得 DWM 模糊高亮效果。
这是我能找到的最相关的文章:http://geekswithblogs.net/kobush/articles/CustomBorderForms3.aspx
跟进 - 我认为这个自定义 chrome 线程有更多指向相同技术的指针(尽管目标不同):Custom titlebars/chrome in a WinForms app
【讨论】:
感谢您的回答!我会根据您的建议尝试使用系统按钮 没问题 - 更多来源可以在这里挖掘:customerborderform.codeplex.com【参考方案3】:AFAIK,这是不可能,因为您窗口边框之外的区域根本不属于您。
Skype 屏幕截图来自一个自定义绘制的框架,该框架很可能超出了可见边界,不是来自 Aero Glass 框架。仔细看就能分辨出来。
【讨论】:
其实可以的。这是一种先进的技术,由于该区域在 Windows 8、Windows 9、Windows 10 等中的绘制方式会有所不同......它正在打开一罐蠕虫,并要求未来有很多很多的痛苦。虽然您可以在非客户区进行绘制,但并不总是能够准确地确定那里有什么,以及随着时间的推移以及 Windows 操作系统的变化,您自定义绘制的组合外观会是什么样子。 这是完全可能的,但非常困难。 @DavidHeffernan:你愿意分享一下方法吗? 我的回答在这里:***.com/questions/8056846/… 链接到一些提供示例 Delphi 代码的帖子。 “窗口边框外的区域根本不属于你” - 这并不准确。窗口外的区域属于支持窗口的同一个 DirectX 表面。就所有权而言,它可能无法(轻松)访问,并且不属于您。但它仍然存在,是您窗户不可分割的一部分。以上是关于航空玻璃窗上的非客户绘画的主要内容,如果未能解决你的问题,请参考以下文章