如何使PictureBox透明?

42

我正在使用C# .NET制作一个应用程序。其中有8个picture box,使用了具有透明背景的PNG图像。但是在我的表单上,当它与另一张图片重叠时,它并不是透明的。

我正在使用Visual Studio 2012。这是我的表单截图:

表单截图


1
请查看https://dev59.com/jW035IYBdhLWcg3wQtyn。 - Binke
有一个解决方案可以使用像面板这样的普通控件...我们可以自己绘制图像,但对于 PictureBox 来说很困难。即使是另一个控件的解决方案,在运行时移动对象也不是很好(因为会出现闪烁)。 - King King
我知道这是一个老问题,但为什么不只使用一个PictureBox,然后获取Graphics对象并使用graphics.DrawImage将所有图像绘制到PictureBox图像上,而不是在窗体上为每个要绘制和移动的图像都有一个PictureBox对象? - nivs1978
7个回答

78

一种实现此操作的方法是将重叠的图片框的父级更改为它搭在上面的 PictureBox。由于 Visual Studio 设计器不允许您向 PictureBox 添加另一个 PictureBox,因此这需要在您的代码(Form1.cs)中并且在初始化函数内完成:

public Form1()
{
    InitializeComponent();
    pictureBox7.Controls.Add(pictureBox8);
    pictureBox8.Location = new Point(0, 0);
    pictureBox8.BackColor = Color.Transparent;
}

只需将图片框的名称更改为您需要的任何内容。这应该返回:

在此输入图像描述


我正在使用两张尺寸不同的图片。当我将其中一张图像设置为另一张图像的父级时,只有重叠部分会显示出来,超出父级边界的任何内容都会被裁剪掉。有什么解决方法吗? - valsidalv
2
@valsidalv 对不起,我有一段时间没有使用Visual Studio了,但是从我记得的来看,是否可以仅扩大父图像(而不拉伸等),以便它也显示所有子项? - SuperPrograman
我也是这么想的...最终我按照这个教程创建了一个包含我的图片的自定义控件 http://www.codeproject.com/Articles/25048/How-to-Use-Transparent-Images-and-Labels-in-Window - valsidalv

7

GameBoard是类型为DataGridView的控件; 图片应该是PNG类型,带有透明的alpha通道背景。

        Image test = Properties.Resources.checker_black;
        PictureBox b = new PictureBox();
        b.Parent = GameBoard;
        b.Image = test;
        b.Width = test.Width*2;
        b.Height = test.Height*2;
        b.Location = new Point(0, 90);
        b.BackColor = Color.Transparent;
        b.BringToFront();

enter image description here


2
尝试使用 ImageList
ImageList imgList = new ImageList;

imgList.TransparentColor = Color.White;

像这样加载图片:

picturebox.Image = imgList.Images[img_index];

1
只需使用Form Paint方法并在其上绘制每个Picturebox,它允许透明度:
    private void frmGame_Paint(object sender, PaintEventArgs e)
    {
        DoubleBuffered = true;
        for (int i = 0; i < Controls.Count; i++)
            if (Controls[i].GetType() == typeof(PictureBox))
            {
                var p = Controls[i] as PictureBox;
                p.Visible = false;
                e.Graphics.DrawImage(p.Image, p.Left, p.Top, p.Width, p.Height);
            }
    }

1
一个快速的解决方案是为image1设置图像属性,并将backgroundimage属性设置为imag2,唯一的不便之处是您必须在picture box中放置两个图像,但是您可以更改背景属性以平铺、拉伸等方式。确保backcolor是透明的。 希望这可以帮助到您。

1

我曾经遇到过类似的问题。 你不能像本页面顶部显示的图片那样轻松地制作透明的picturebox,因为.NET Framework和VS .NET对象是通过继承创建的!(使用Parent属性)。

我通过RectangleShape解决了这个问题,并使用下面的代码删除了背景, 如果PictureBox和RectangleShape之间的差异不重要并且无关紧要,则可以轻松使用RectangleShape。

private void CreateBox(int X, int Y, int ObjectType)
{
    ShapeContainer canvas = new ShapeContainer();
    RectangleShape box = new RectangleShape();
    box.Parent = canvas;
    box.Size = new System.Drawing.Size(100, 90);
    box.Location = new System.Drawing.Point(X, Y);
    box.Name = "Box" + ObjectType.ToString();
    box.BackColor = Color.Transparent;
    box.BorderColor = Color.Transparent;
    box.BackgroundImage = img.Images[ObjectType];// Load from imageBox Or any resource
    box.BackgroundImageLayout = ImageLayout.Stretch;
    box.BorderWidth = 0;
    canvas.Controls.Add(box);   // For feature use 
}

1
然而,我试图做到这一点,但是我无法使RectangleShape出现在其他控件的上方(即它似乎在它们下面,因此不会出现在窗体上)。 - komodosp

-1

您可以将 PictureBoxBackColor 属性设置为 Transparent


3
是的,但那只对表单背景有效。我试过了,但正如您在截图中所看到的,当图片框重叠时它不起作用。 - Belal Khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接