【问题标题】:Winforms semi-transparent PNG over semi-transparent PNGWinforms 半透明 PNG 优于半透明 PNG
【发布时间】:2023-04-08 18:40:01
【问题描述】:

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

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

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

这不是:

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

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

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

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

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

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

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

【问题讨论】:

    标签: winforms user-interface png transparency


    【解决方案1】:

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

    Transparency Problem by Overlapped PictureBox's at C#

    看起来它有两个部分:

    1. 为窗口样式设置 WS_EX_TRANSPARENT

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • +1 表示“不要犹豫使用 OnPaint”。重叠 PictureBox 以显示重叠图像会增加质量和复杂性,而您真正需要做的就是自己绘制图像。
      • 比我想出的要好得多,谢谢!就我而言,我有一个漂亮的图像作为背景,上面有 3 或 4 个图像,每个图像都有点击事件......所以更容易为每个图像设置单独的控件,以处理鼠标事件而无需检查位置等。也很高兴使用 IDE 来移动它们与代码。不过不喜欢有额外的窗口句柄,这是 VCL 很好的地方(无窗口控件)。
      • 这是最好的答案!
      猜你喜欢
      • 2011-01-22
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 2012-03-28
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多