使图片框透明,每个与角落重叠?

TL; DR:请看下面的图片

所以我想拍一张照片,我和周围的人都有点想法。

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

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

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

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

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

这是正在发生的事情

编辑2(与ocmment相同):

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

示例: 如何使图片框透明?

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

您可以通过创建从PictureBoxinheritance并覆盖其OnPaintBackground方法的自定义控件来克服此问题(从此代码项目文章中稍作调整):

 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); } } } } } 

很久以前,微软已经发布了一篇知识库文章来解决这个问题,但它有点过时,它的代码示例是在VB.Net中。

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