c# - 使图片框透明,每个框与另一个角重叠?

标签 c# winforms transparency picturebox

TL;DR:看下面的图片

所以我正在尝试制作一张小照片,但我和我周围的人都有点没有想法。

我在中间(从上面看)有一张 table (坐着+吃饭的 table ),人们坐在它周围。那些人是圆的, table 也是圆的。

每个人都有自己的图片框,我只是使用一张图片,旋转它,然后将其设置为下一个框中的图像。

现在的问题是:角落里的人的图片框与空角的 table 重叠,图像中存在透明度。它应该显示其下方的表格,但它显示的是表单的背景:(

编辑:所有背景均设置为透明,表单以大理石为背景,白色(“窗口”)为背景色。

我把一个人放在后面,一个人放在前面,所以很容易看到:

Here's what's going on

编辑2(与ocmment相同):

在过去的两天里,我大约读了这个问题 10 次,但没有一个描述这个确切问题的人有实际的答案。当我试图插入其中一个问题时,我被告知我应该发布一个新问题。

示例:How to make picturebox transparent?

最佳答案

winforms 中的透明度有点误导,因为它并不是真正的透明度。
Winforms 控件通过绘制它们将隐藏的父控件部分而不是它们自己的背景来模仿透明度。
但是,它们不会绘制可能被它们部分覆盖的其他控件。
这就是最上面的图片框隐藏大图片框的原因。

您可以通过创建继承自 PictureBox 的自定义控件并覆盖其 OnPaintBackground 来克服此问题。方法(略有调整,取自 this code project article ):

protected override void OnPaintBackground(PaintEventArgs e)
{
    base.OnPaintBackground(e);
    Graphics g = e.Graphics;

    if (this.Parent != null)
    {
        var index = Parent.Controls.GetChildIndex(this);
        for (var i = Parent.Controls.Count - 1; i > index; i--)
        {
            var c = Parent.Controls[i];
            if (c.Bounds.IntersectsWith(Bounds) && c.Visible)
            {
                using (var bmp = new Bitmap(c.Width, c.Height, g))
                {
                    c.DrawToBitmap(bmp, c.ClientRectangle);
                    g.TranslateTransform(c.Left - Left, c.Top - Top);
                    g.DrawImageUnscaled(bmp, Point.Empty);
                    g.TranslateTransform(Left - c.Left, Top - c.Top);
                }
            }
        }
    }
}

Microsoft 发布了 Knowledge base article很久以前就解决了这个问题,但是有点过时了,它的代码示例是VB.Net中的。

另一种选择是自己绘制图像,无需使用图片框来保存它们,方法是使用 Graphics.DrawImage方法。
最好的位置可能是 OnPaint表单的方法。

关于c# - 使图片框透明,每个框与另一个角重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36710701/

相关文章:

c# - WNetAddConnection2 和错误 1219 - 自动断开连接?

c# - 使用 XML 中的列填充数据集

c# - 使用picturebox作为 Canvas 并绘制文本

transparency - RMagick:将 CMYK EPS 转换为 RGB PNG 保持透明背景

c++ - 在 OpenGl 和 OpenFrameworks 中使 3d 模型透明

c# - 验证 JWT 出现奇怪的 “Unable to match key kid” 错误

c# - 合并网格列

C#/LINQ(?) - 加入两个数据表(没有 SQL!)

C# 需要在多行文本框中使用回车键向下移动一行,不能离开文本框

java - 如何在没有窗口管理器的情况下在 SWT 中制作透明外壳?