TL; DR:请看下面的图片
所以我想拍一张照片,我和周围的人都有点想法。
我在中间(从上面看)有一张桌子(坐着吃饭),周围有人坐着。那些人是圆的,就像桌子一样。
每个人都有自己的图片框,我只使用一张图片,旋转图片,并在下一个框中将其设置为图片。
Thep roblem现在是:角落里人们的PictureBoxes与空角重叠,在图像中有透明度。它应该显示在它下面的表格,而是显示表格的背景:(
编辑:所有背景都设置为透明,表单将大理石作为背景,白色(“窗口”)作为背景颜色。
我把一个人放在后面,一个放在前面,所以很容易看到:
编辑2(与ocmment相同):
在过去的两天里,我读了大约10次这个问题,并没有一个描述这个确切问题的人得到了实际答案。当试图推动其中一个,我被告知我应该发一个新问题。
答案 0 :(得分:4)
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);
}
}
}
}
}
微软很久以前已经发布了一个Knowledge base article来解决这个问题,但它有点过时了,而且它的代码示例是在VB.Net中。
另一种选择是使用Graphics.DrawImage
方法自己绘制图像,不使用图片框来保存它们
最好的地方可能是表格的OnPaint
方法。