Winforms半透明PNG覆盖半透明PNG

Winforms半透明PNG覆盖半透明PNG,winforms,user-interface,png,transparency,Winforms,User Interface,Png,Transparency,我想我一定是遗漏了一些明显的东西,但经过几个小时的搜索,我还是找不到。是否无法使用PictureBox或其他控件包含具有部分透明/alpha混合像素的图像,并将其放置在另一个图像上,并使混合基于其下的图像 例如,这将生成我想要的结果: 在窗体上放置一个面板 添加一个OnPaint处理程序 在OnPaint处理程序中,绘制1个PNG,然后在其上绘制另一个PNG,同时使用Graphics.DrawImage 这并不是: 在窗体上放置一个PictureBox并将其设置为PNG 在表单上放置另一个Pic

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

例如,这将生成我想要的结果:

  • 在窗体上放置一个面板
  • 添加一个OnPaint处理程序
  • 在OnPaint处理程序中,绘制1个PNG,然后在其上绘制另一个PNG,同时使用Graphics.DrawImage
  • 这并不是:

  • 在窗体上放置一个PictureBox并将其设置为PNG

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

  • 将第二个图片框放在第一个图片框上

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

    我读过这篇文章,因为所有winform控件都是windows,所以本质上它们是不透明的

    …但即使是我正在迁移的有15年历史的平台Borland的VCL也有几个无窗口控件,所以很难想象winforms至少没有简单的解决方案


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

    抱歉,我刚刚发现了这个。。。一旦我决定用谷歌搜索“winforms transparent panel”而不是我之前所做的搜索,TransPictureBox示例显示似乎正是我所需要的:

    看起来有两个部分:

  • 为窗口样式设置WS_EX_透明

  • 重写“绘制背景”方法(或者可能使控件样式不透明)


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

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

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

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

    +1表示“不要犹豫使用OnPaint”。重叠图片框显示重叠图像增加了质量和复杂性,您真正需要做的就是自己绘制图像。比我想到的要好得多,谢谢!在我的例子中,我有一张漂亮的图片作为背景,上面有3到4张图片,每一张都有点击事件。。。因此更容易为每个控件单独设置控件,无需检查位置/等即可处理鼠标事件。使用IDE在vs代码中移动它们也很好。不过,我不喜欢有额外的窗口句柄,这正是VCL的优点(无窗口控件)。这是最好的答案!