Visual Studio 2012如何绘制其窗口边框?

3
如何在使用 Windows 窗体时实现与新版 Visual Studio 2012 主窗口相同的透明边框效果?它的窗口似乎会发光。
4个回答

10

所以我不确定这是否是最佳方法,但如果您使用Spy++(32位),并查看窗口,则可以看到在Visual Studio的主窗口下方,可以看到4个“VisualStudioGlowWindow”对象。

我在Spy++中挂钩了消息,正如您所想象的那样,这4个窗口表示表单周围的4个发光边框。进一步检查显示,这4个“发光窗口”实现了WS_EX_LAYERED扩展窗口样式,因此发光本身并没有在WPF中完成(至少据我所知)!

希望这能解决一些问题。

输入图像描述


1
据我所知,您可以使用WPF结合自定义WPF边框和这个Chrome来完成它。不确定在WinForms上能否实现,因为其样式选项相对有限(与WPF相比)。无论如何,他们正在使用WPF

@FilipeScur - 如果您不使用WPF,将很难复制Visual Studio中存在的内容,甚至微软也已经转向了WPF窗口,这是有原因的。没有理由不转移到支持WPF应用程序的当前版本的.NET Framework。 - Security Hound
嗯,就像我说的...现在不是一个选择,但我确实有计划很快使用它...只是现在我不能做...谢谢。 - Filipe Scur
我找到了一个类似于我的问题的问题,我可能会尝试一下,看看它的表现如何...https://dev59.com/0moy5IYBdhLWcg3wEJ9n无论如何,迁移到WPF有多麻烦?我的意思是...我们已经使用winforms工作了很长时间了... - Filipe Scur
1
@FilipeScur 相信我,你不会后悔的,甚至一秒钟都不会。WPF 是自个人电脑以来最好的发明!它并不难,我鼓励你从这些步骤开始,我也是从 Winforms 世界来的,这对我帮助很大 http://msdn.microsoft.com/en-us/library/ee649089.aspx - Erre Efe
谢谢,@RandolfR-F!我会试一试!=) - Filipe Scur
你可以在WinForms中完成这个任务,需要进行一些消息处理,使用C语言风格。 - weaknespase

0

Visual Studio 2012使用本地Win32函数绘制其窗口边框。它与WPF或WindowsForms无关--您可以同时使用两者。

发光效果是在主窗口上方的透明窗口上呈现的。主窗口调用DWM API将玻璃区域设置为0。这样,您就可以在原始边框和系统按钮上绘制。这是正确的方法。

您可以查看WPF Shell(http://archive.msdn.microsoft.com/WPFShell)的代码,以了解如何调用DWM以删除玻璃。它被编写为与WPF兼容并不重要,因为您只需要一个句柄(IntPtr)即可。

如果您有一个WindowsForms代码库,请不要迁移到WPF。WPF在最新的.NET框架发布中没有得到改进,并且没有改进或新功能的路线图,因为其团队已经整合到Windows 8团队中。


1
如果你最小化Visual Studio 2012主窗口并使用任务栏预览查看它(将鼠标放在任务栏图标上,然后将鼠标放在窗口缩略图上),窗口上没有发光,因为它是在另一个窗口上渲染的。 - Diego Frata

0

除非你想自己处理整个表单的绘制,否则你无法这样做。因为Visual Studio 2010和Visual Studio 2012是基于WPF编写的,并使用Windows而不是Forms。


假设我想在WinForms上自己处理所有的绘图,有什么方法吗? - Filipe Scur
创建一个 alpha blendet 表单用于阴影,并将其与不是 alpha blendet 的普通窗口一起移动/调整大小,该窗口包含边框和内部内容。 - Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接