在半透明PNG上形成半透明PNG

时间:2012-05-04 20:10:17

标签: winforms user-interface png transparency

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

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

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

    1. 将PictureBox放在表单上并将其设置为PNG。

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

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

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

      我读过这个源于所有winform控件的窗口,所以它们本质上并不透明。

      ...但是即使是我正在迁移的15年历史的平台,Borland的VCL也有几个没有窗口的控件,因此很难对winforms进行成像并不至少有一些简单的解决方案吗?

      我上面的第一个例子是一个答案,是的,但是当你只能使用一个大面板并在其中绘制所有“控件”时,这会增加许多工作。如果您可以使用单独的鼠标事件/等单独控件,那就更好了。即使不是图像控制,也是我必须自己绘制的控件,只要我可以在每个控件中放置一个图像,那就没问题了。在VCL中,他们称之为“油漆盒”,只是一个矩形区域,您可以放置​​在一个表格上,并在其上绘制任何您想要的东西。它有自己的鼠标事件,界限等。如果你没有画任何东西,它就像它甚至没有(100%透明),除了它仍然得到鼠标事件,所以可以用作“热”现场“或”目标“。

2 个答案:

答案 0 :(得分:7)

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

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

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

不要犹豫使用OnPaint()btw。

答案 1 :(得分:0)

很抱歉,我刚刚发现这个......一旦我决定使用谷歌“winforms透明面板”而不是之前的搜索,TransPictureBox示例节目似乎完全符合我的需要:

Transparency Problem by Overlapped PictureBox's at C#

看起来有2个部分:

  1. 为窗口样式

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