2

我想我一定遗漏了一些明显的东西,但是经过几个小时的搜索后我无法找到它。有没有办法使用 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 中,他们称之为“画框”,只是一个矩形区域,您可以放置​​在表单上并在其上绘制任何您想要的东西。有它自己的鼠标事件、Bounds 等。如果你没有在其中绘制任何东西,它就好像它甚至不存在(100% 透明),除了它仍然获得鼠标事件,所以可以用作“热点”或“目标”。

4

2 回答 2

7

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

问题是设计师不会让你把第二个图片框变成第一个的孩子。您所需要的只是构造函数中的一小段代码来重新设置它的父级。并给它一个新的位置,因为它是相对于父母的。像这样:

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

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

于 2012-05-04T20:34:36.993 回答
1

抱歉,我刚刚发现了这个......一旦我决定在 Google 上搜索“winforms 透明面板”而不是我之前所做的搜索,TransPictureBox 示例显示似乎完全符合我的需要:

C# 中重叠图片框的透明度问题

看起来它有2个部分:

  1. 为窗口样式设置 WS_EX_TRANSPARENT

  2. 覆盖“绘制背景”方法(或可选地可能使控件样式不透明)。

于 2012-05-04T20:20:38.030 回答