【问题标题】:C# PNG image with transparent zones as Button具有透明区域的 C# PNG 图像作为按钮
【发布时间】:2013-06-05 14:07:59
【问题描述】:

我正在尝试在我的表单顶部添加一个按钮来传播网络内容。该按钮应该是一个带有一些透明区域的圆形 PNG 图像(因为这些区域我不能只使用 GraphicPath 圆圈来管理它)。

当然,我的 PNG 以透明背景保存得很好。在设计器中,我将前色和背景色都设置为透明。这样,如果我从按钮中删除图像,按钮是完全透明的。但是对于 PNG 图像分配它不是。

我找到了这段代码: C# transparent PNG for buttons, panels...how?

我的问题是我无法使用它。如果我只是将它复制到我的应用程序的命名空间中,MainForm 设计器会给我一个错误:

     this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));

“无法找到指定文化的适当来源”。

我这样做是好方法吗?仅仅创建这个类的一个实例来让它工作就足够了吗?

谢谢

【问题讨论】:

  • 我对你的确切问题有点困惑。您是否遇到了透明度问题(如果有,请阅读 GDI 和 GDI+ 中的透明度)...您是否正在创建自己的控件来充当按钮?按钮是否根本找不到您要查找的资源或其他?
  • 另外,“散布网页内容”是什么意思?
  • 我必须放下一个带有透明区域的PNG图像,作为按钮。在我找到的代码中,人们说我们可以通过创建一个“自定义”控件来获得这个结果。
  • “网页内容”是一个网页,内容可以随时间变化,这就是为什么我需要真正的透明度,因为我无法将背景调整为页面的颜色,所以它充当“透明”。
  • 我认为您将很难使用 Windows 窗体执行此操作。为此,您可能需要考虑迁移到 WPF。

标签: c# transparency


【解决方案1】:

Windows 窗体是使用 GDI 和 GDI+ 绘制的,它们在正确处理透明度方面的能力受到限制,因为在首次创建 GDI 时,透明度并不是一个考虑因素。话虽如此,但有一些函数可以在某种程度上处理透明度,例如AlphaBlend 函数。

所以您可能想知道“如何在 Windows 窗体中实现透明度?” - 嗯,这不是“真正的”透明度,更多的是事后考虑(或破解)为 GDI(以及因此 Windows 窗体控件)提供“透明度”。

这个技巧是作为 UXTheme 一部分的函数,称为 DrawThemeParentBackground,它主要查看控件下方的内容,并在绘制子控件之前将其绘制到表面。

尝试子类化一个控件并用 Color.Transparent 填充其客户区:

public class TestControl : Control
{
    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.Clear(System.Drawing.Color.Transparent);
    }

    protected override void OnPaintBackground(PaintEventArgs pevent)
    {
        pevent.Graphics.Clear(System.Drawing.Color.Transparent);
    }
}

控件完全绘制黑色,对吗?那是因为 GDI 并不真正知道什么是“透明”。

因此,您需要覆盖 OnPaintBackground 事件并在其中执行对 DrawThemeParentBackground 的调用。

另外,试试这个:

  1. 创建一个表单并设置它的背景图片(使用壁纸或其他东西)
  2. 向表单添加一个面板,并将其背景设置为透明(它使用 DrawThemeParentBackground 来执行此操作!)
  3. 将透明 PNG 添加到面板...PNG 将与背景融合。

现在,由于 GDI 缺乏 UI 开发人员想要的许多功能,他们都转向 WPF,这是一个完全不同的野兽,但会按照您的要求做,没有太多麻烦!

【讨论】:

  • 谢谢。我想我会以一种“受限”的方式来做——我会放弃内部的透明度,只使用一些图形路径类来使用一个透明的形式,它只会出现一个圆圈,我把按钮放在里面。
  • @GrigoryKornilov,没问题。实际上,我花了很多时间研究 Windows 窗体、GDI、GDI+、Windows Glass 等有什么是/不可能的。所以如果你可以更新你的问题并包括一些你想要达到的目标的图片(理想情况下),它现在的样子等等。如果我能直观地看到问题,我可能会提供更多帮助。
猜你喜欢
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2012-03-06
  • 2010-12-14
  • 2022-01-07
  • 1970-01-01
相关资源
最近更新 更多