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

ese*_*elk 2 user-interface png transparency winforms

我想我必须遗漏一些明显的东西,但经过几个小时的搜索后我无法找到它.是否无法使用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%透明),除了它仍然得到鼠标事件,所以可以用作"热"现场"或"目标"也是如此.

Han*_*ant 7

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

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

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

不要犹豫使用OnPaint()btw.

  • +1"不要犹豫使用OnPaint".重叠的PictureBoxes显示重叠的图像增加了质量和复杂性,你真正需要做的就是自己绘制图像. (3认同)