Winforms半透明PNG超过半透明PNG

标签 winforms user-interface png transparency

我想我一定遗漏了一些明显的东西,但经过几个小时的搜索我还是找不到它。有没有办法使用 PictureBox 或其他控件来包含具有部分透明/alpha 混合像素的图像,并将其放置在另一个图像上并让混合基于它下面的图像?

例如,这会产生我想要的结果:

  1. 在表单上放置一个面板。
  2. 添加 OnPaint 处理程序。
  3. 在 OnPaint 处理程序中绘制 1 个 PNG,然后在其上绘制另一个 PNG,两者都使用 Graphics.DrawImage。

这不是:

  1. 在窗体上放置一个 PictureBox 并将其设置为 PNG。

  2. 在窗体上放置另一个 PictureBox 并将其设置为 PNG。

  3. 将第二个图片框放在第一个图片框上。

...即使第二个图片框是空的并且背景颜色为透明,它仍然会覆盖下面的图片。

我读到这源于所有 winform 控件都是窗口,因此它们本质上不是透明的。

...但即使是我从 15 年前迁移过来的平台,Borland 的 VCL,也有几个无窗口控件,所以很难想象 winforms 至少没有一些简单的解决方案?

我上面的第一个例子是一个答案,没错,但是当您只能使用一个大面板并在其中绘制所有“控件”时,这会增加很多工作。如果您可以使用单独的鼠标事件/等进行单独的控制,那就更好了。就算不是图片控件,自己画的控件也行,只要每个控件放一张图片就可以了。在 VCL 中,他们将其称为“绘画框”,它只是一个矩形区域,您可以将其放置在窗体上并在其上绘制您想要的任何内容。它有自己的鼠标事件、边界等。如果你不在其中绘制任何东西,就像它甚至不存在(100% 透明)除了它仍然有鼠标事件,所以可以用作“热点”或“目标”。

最佳答案

PictureBox 控件对透明度的支持很好,只需将其BackColor 属性设置为Transparent 即可。这将使它的父级的像素作为背景可见。

问题是设计者不会让您将第二个图片框作为第一个图片框的子图片框。您所需要的只是构造函数中的一小部分代码来重新设置它的父级。并给它一个新的位置,因为它是相对于父级的。像这样:

    public Form1() {
        InitializeComponent();
        pictureBox1.Controls.Add(pictureBox2);
        pictureBox2.Location = new Point(0, 0);
        pictureBox2.BackColor = Color.Transparent;
    }

顺便说一下,不要犹豫使用 OnPaint()。

关于Winforms半透明PNG超过半透明PNG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10455484/

相关文章:

r - knitr:以 pdf 和 png 格式保存图形,但在最终文档中使用 pdf 文件

c# - 连接数据库中的 Crystal Reports

c# - 从选择中排除 DataGridView 的最后一列

.net - 在单独的线程中运行 Windows 窗体

c# - 如何为整个winform应用程序中使用的数据表设置日期时间格式?

Java GUI 设置颜色

javascript - 关闭选项卡以专注于上一个选项卡而不是第一个选项卡时如何更改 dojo 内容选项卡焦点?

java - 如何使用 GridLayout 设置组件大小?有没有更好的办法?

php - 将 .jpg、.jpeg 或 .gif 转换为 .png 而不将它们保存在机器上

python - 读取 PNG 像素的 Alpha。通过纯Python 的快速方法?