Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使图片框透明,每个都有一个角重叠?_C#_Winforms_Transparency_Picturebox - Fatal编程技术网

C# 使图片框透明,每个都有一个角重叠?

C# 使图片框透明,每个都有一个角重叠?,c#,winforms,transparency,picturebox,C#,Winforms,Transparency,Picturebox,TL;医生:看下面的图片 所以我想画一幅小图画,我和我周围的人都有点不知所措 我有一张桌子(坐着+吃一个)在中间(从上面看),人们坐在它周围。那些人是圆的,桌子也是圆的 每个人都有自己的picturebox,我只需使用一张图片,旋转它,然后将其设置为下一个框中的图像 现在的问题是:角落里的人的图片框与桌子的空白角落重叠,在图像中有透明度。它应该显示它下面的表格,但是它显示了表单的背景:( 编辑:所有背景设置为透明,窗体以大理石为背景,白色(“窗口”)为背景色 我把一个人放在后面,一个人放在前面,

TL;医生:看下面的图片

所以我想画一幅小图画,我和我周围的人都有点不知所措

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

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

现在的问题是:角落里的人的图片框与桌子的空白角落重叠,在图像中有透明度。它应该显示它下面的表格,但是它显示了表单的背景:(

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

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

编辑2(与ocmment相同):


在过去的两天里,我把这个问题读了大约10遍,没有一个描述这个确切问题的人有一个真正的答案。当我试图提出其中一个问题时,有人告诉我应该发布一个新问题


示例:

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

您可以通过创建一个自定义控件来克服这一问题,该控件继承自
PictureBox
,并重写其方法(只需稍加调整,即可从以下位置执行):

微软很久以前就发布了一个解决这个问题的方法,但是它有点过时了,它的代码示例在VB.Net中

另一种选择是使用方法自己绘制图像,而不使用图片框来保存图像。

最好的方法可能是表格法。

否决理由:这个问题已经在互联网上被反复询问和回答,特别是在中。请参阅中的搜索和研究部分。在过去两天里,我读了大约10次这个问题,没有一个描述这个确切问题的人有过类似的回答实际答案。当我试图推出其中一个问题时,有人告诉我应该发布一个新问题。这是一个如此普遍的问题,以至于微软在10年前写了一篇文章。最好剪断鼠标脐带并编写代码,使用Graphics.DrawImage()作为一名刚刚学习c#的实习生,我将在一个小时后坐在这里,还没有完全理解代码。可能甚至没有转换到c#,也没有理解它。现在尝试Zohars的解决方案。哇,谢谢老兄。这不仅是最好的工作,而且是最简单的答案。有那篇文章之前也是,只是使用了整个TranspControl类。没有你的解决方案那么好:)。是
TransparentLabel
TransparentPictureBox
的一个实现,您可能会发现它们很有用。
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);
                }
            }
        }
    }
}