使图片框透明,每个框都与一个角重叠?
Make Picture boxes transparent, each overlapping the other with a corner?
TL;DR: 看下图
所以我想拍一张小照片,我和我周围的人有点没主意。
我中间有一个table(坐+吃)(从上面看),周围坐着人。那些人是圆的,table。
每个人都有自己的图片框,我就用一张图片,旋转一下,设置为下一个框中的图片。
现在的问题是:角上的人的PictureBox与table空角重合,图像中那里是透明的。它应该在其下方显示 table,但它显示的是表格的背景 :(
编辑:所有背景设置为透明,表格以大理石为背景,白色("Window")为背景色。
我把一个人放在后面,一个人放在前面,这样很容易看出来:
编辑 2(与 ocmment 相同):
在过去的两天里,我阅读了这个问题大约 10 次,但没有一个描述这个确切问题的人有一个实际的答案。在尝试推动其中一个问题时,我被告知我应该 post 一个新问题。
示例:How to make picturebox transparent?
winforms 中的透明度有点误导,因为它不是真正的透明度。
Winforms 控件通过绘制它们将隐藏的父控件部分而不是它们自己的背景来模拟透明度。
但是,它们不会绘制可能被它们部分覆盖的其他控件。
这就是为什么你最上面的图片框隐藏了你的大图片框。
您可以通过创建一个继承自 PictureBox
并覆盖其 OnPaintBackground
method (taken, with slight adjustments, from 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
方法中。
TL;DR: 看下图
所以我想拍一张小照片,我和我周围的人有点没主意。
我中间有一个table(坐+吃)(从上面看),周围坐着人。那些人是圆的,table。
每个人都有自己的图片框,我就用一张图片,旋转一下,设置为下一个框中的图片。
现在的问题是:角上的人的PictureBox与table空角重合,图像中那里是透明的。它应该在其下方显示 table,但它显示的是表格的背景 :(
编辑:所有背景设置为透明,表格以大理石为背景,白色("Window")为背景色。
我把一个人放在后面,一个人放在前面,这样很容易看出来:
编辑 2(与 ocmment 相同):
在过去的两天里,我阅读了这个问题大约 10 次,但没有一个描述这个确切问题的人有一个实际的答案。在尝试推动其中一个问题时,我被告知我应该 post 一个新问题。
示例:How to make picturebox transparent?
winforms 中的透明度有点误导,因为它不是真正的透明度。
Winforms 控件通过绘制它们将隐藏的父控件部分而不是它们自己的背景来模拟透明度。
但是,它们不会绘制可能被它们部分覆盖的其他控件。
这就是为什么你最上面的图片框隐藏了你的大图片框。
您可以通过创建一个继承自 PictureBox
并覆盖其 OnPaintBackground
method (taken, with slight adjustments, from 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
方法中。