gpt4 book ai didi

c# - 如何处理重叠但透明的图片框?

转载 作者:太空狗 更新时间:2023-10-30 01:17:10 29 4
gpt4 key购买 nike

目前我想为我的 friend 制作一个小工具。这样做的目的是从互联网资源中加载他最喜欢的电脑游戏之一的角色,并创建一个查看器,为此我从互联网上下载图像图标等。

到目前为止它工作得很好,但是,我在这里遇到了一个问题:

enter image description here

如您所见 - 我绘制了 PictureBoxes 的边框 - 它们重叠,并阻止显示其他项目(在第二个带边框的框中部分可见的项目)。

两者都存储为 .png 文件。

这是创建它们的代码:

PictureBox picture = new PictureBox
{
Name = "pictureBox"+item.Key,
Size = new Size(pictureBoxWidth, pictureBoxHeight),
Location = new Point(pictureBoxLocationX, pictureBoxLocationY),
Visible = true,
Image = itemIcon,
BackColor = Color.Transparent,
BorderStyle = BorderStyle.FixedSingle
};

坐标没问题,图像也很好。然而,它非常大,即使像完全可见的图标甚至不需要大框。

盒子有这些属性:

64px 宽度128px 高度

我怎样才能显示这两个项目,而不是让一个项目与另一个项目重叠?它必须是某种只应用于下一层的透明度,在这种情况下,下一层是带有其他项目的框或背景。

我已经尝试过 Parent-solution,但每当我这样做时,parent 的框太小而无法将 child icon 移回其原始点。

最佳答案

这是永恒的 PictureBox 问题,是时候做点什么了。它很好地支持透明度,但它在所有 Winforms 控件中都是模拟的。它要求其 Parent 绘制自己以提供背景像素。工作正常,但它不检查它是否与任何其他图片框重叠。

这是可以修复的,您只需要重写它的 OnPaintBackground() 方法并包含重叠的方法。向您的项目添加一个新类并粘贴如下所示的代码。编译。将工具箱顶部的新控件拖放到窗体上,替换现有的图片框。

using System;
using System.Drawing;
using System.Windows.Forms;

class PictureBoxEx : PictureBox {
protected override void OnPaintBackground(PaintEventArgs e) {
base.OnPaintBackground(e);
for (int index = this.Parent.Controls.Count - 1; index > this.Parent.Controls.GetChildIndex(this); --index) {
var ctl = this.Parent.Controls[index] as PictureBox;
if (ctl == null) continue;
var clip = ctl.RectangleToClient(this.RectangleToScreen(this.DisplayRectangle));
clip.Intersect(ctl.DisplayRectangle);
if (clip.Width == 0 || clip.Height == 0) continue;
var save = e.Graphics.Save();
e.Graphics.TranslateTransform(ctl.Left - this.Left, ctl.Top - this.Top);
using (var rgn = new Region(clip)) {
e.Graphics.Clip = rgn;
InvokePaintBackground(ctl, e);
InvokePaint(ctl, e);
}
e.Graphics.Restore(save);
}
}

protected override CreateParams CreateParams {
get {
const int WS_EX_TRANSPARENT = 0x20;
var cp = base.CreateParams;
cp.ExStyle |= WS_EX_TRANSPARENT;
return cp;
}
}
}

关于c# - 如何处理重叠但透明的图片框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32672007/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com