【问题标题】:TransparencyKey leaves pixels on rounded corner background imagesTransparencyKey 在圆角背景图像上留下像素
【发布时间】:2016-07-21 18:07:22
【问题描述】:

我正在尝试使用带有圆角的背景图像来对抗“石灰”背景颜色,并将透明度键设置为“石灰”,它主要具有仅在背景图像上显示所有表单控件的预期效果,但是圆角边缘周围 1px 的透明度键不会移除石灰背景:

有谁知道我可以如何防止这种情况发生?

【问题讨论】:

  • 嗯,是的,那不是石灰。抗锯齿需要知道真实的背景颜色才能正常工作,而TransparencyKey只适用于单一颜色。
  • 您的图形编辑器使用像素中的 Alpha 通道使图像在 任何 背景颜色下看起来不错。否则,只有当背景已知时,抗锯齿才能很好地工作,因此它可以平滑地从前景色插入到背景色。但是当你使用透明键时它当然不能工作,当应用 alpha 时它不再是 Lime。每像素 alpha 混合在 Winforms 中不起作用,没有更多的绘制事件 = 死控件。你必须修复图像。并且想知道当您没有已知的背景颜色时,它如何永远正常工作。它不能..

标签: c# winforms


【解决方案1】:

TransparencyKey 使用单一颜色。当您使用抗锯齿绘制圆角时,线条颜色将与背景颜色混合,因此您看到的颜色不完全是Lime,它是LimeGray 的混合,使圆角更光滑。因此,当您将 TransparencyKey 设置为 Lime 时,该颜色将不会被删除。

要获得高质量的 Alpha 混合圆角,请考虑使用 Layered Windows。创建一个具有透明背景的位图,其中包含圆角矩形的平滑绘制,然后使用您可以在下面的帖子中找到的技术,制作您的形状:

使用分层窗口可以显着提高性能和 具有复杂形状的窗口的视觉效果,为其设置动画 形状,或希望使用 alpha 混合效果。系统 自动组合和重新绘制分层窗口和窗口 底层应用。结果,渲染了分层窗口 平滑,没有复杂窗口区域的典型闪烁。在 此外,分层窗口可以是部分半透明的,也就是说, 阿尔法混合。

重要提示

上面描述的技术对于创建一个简单的启动屏幕很有用,但是当你想在你的表单上放置一些控件时,你需要使用一种解决方法。

除了您的主窗体,您还可以创建另一个具有WS_EX_LAYERED 样式的窗口,并使用它来显示 alpha 混合背景图像。然后我们只需要确保这个窗口位于主窗体的后面。是的,这并不容易,但这里有一个库,它使任务变得非常简单。感谢 Anthony Mushrow 的想法和实施:

【讨论】:

  • 感谢 Reza,我已经尝试使用 PerPixelAlphaForm.cs 类,我的主表单及其所有表单元素(文本框等)继承了该类,然后使用背景调用 SelectBitmap 方法图像作为参数 (MyMainForm.SelectBitmap(Properties.Resources.rounded1);)。不幸的是,它使整个表单完全变白,但尽管如此,仍然可以使用所有控件,知道为什么会这样吗?
  • 是的,我知道,这就是我发布 Note 部分的原因。 PerPixelAlphaForm 对于创建启动画面非常有用。但是,如果您想对表单进行一些控制,请遵循将透明背景主表单放置在 alpha 混合表单上的想法。
  • 啊哈,谢谢,没看到更新……我试试看。
  • 不客气。当然,该问题的解决方案不会是完美的,因为 Windows 窗体不支持 @HansPassant 在 cmets 中提到的这种要求。但这个想法对于链接文章中描述的某些情况很有用。
  • 一切正常,满足我的需要,要求更新 C# 项目但不能使用 WPF,需要一个弹出窗口来添加一些带有漂亮边框样式的用户数据,这非常适合我在这里需要什么。再次感谢。
猜你喜欢
  • 2012-06-16
  • 1970-01-01
  • 2011-03-22
  • 2014-05-11
  • 2020-05-11
  • 2017-01-14
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多