PictureBox问题

时间:2010-11-10 12:20:19

标签: c# .net winforms picturebox

我遇到了问题:

我有3个图片框,其中包含3张不同的图像,如图像

我可以设置为 pictureBox3 ,这样两个图像看起来都相同.....

alt text

编辑: 我想在pictureBox2上移动pictureBox3,

因此没有选项将它们合并到单个图像

5 个答案:

答案 0 :(得分:9)

确保pictureBox3中的图片是透明的。将BackColor设置为透明。在代码中,将Parent的{​​{1}}属性设置为pictureBox3。调整pictureBox2 Location坐标,因为一旦您更改pictureBox3,它们将相对于pictureBox2的坐标。

Parent

在设计师中你不会看到透明度,但在运行时你会看到。

<强>更新

在图像中,左侧显示设计器视图,右侧是运行时版本。 Left: Designer view, Right: How it looks at runtime

另一次更新

我真的不明白这对你有什么用。我想必须有一些我们正在做的事情。我将描述创建工作样本的确切步骤。如果你按照完全相同的步骤,我想知道我们是否会得到相同的结果。接下来的步骤描述了我要做什么,并使用我在网上找到的两张图片。

  • 使用Visual Studio 2008,使用模板Windows窗体应用程序创建一个新项目。确保项目针对.NET Framework 3.5。
  • 将表单大小设置为457; 483。
  • 将PictureBox控件拖到窗体上。将其位置设置为0; 0并将其大小设置为449; 449。
  • 单击图像属性旁边的省略号,单击导入...按钮并导入http://a.dryicons.com/files/graphics_previews/retro_blue_background.jpg处的图像(只需在文件名文本框中键入URL,然后单击打开)。然后单击“确定”以使用该图像。
  • 将另一个PictureBox拖到窗体上,将其Location设置为0; 0并将其Size设置为256; 256。同时将其BackColor属性设置为Transparent。
  • 使用与上述相同的方法,导入图像http://www.axdn.com/redist/axiw_i.png,这是一个透明图像。
  • 现在将以下代码放在表单的OnLoad事件处理程序中:

        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox3.Parent = pictureBox2;
            pictureBox3.Location =
                new Point(
                    pictureBox3.Location.X
                    - pictureBox2.Location.X,
                    pictureBox3.Location.Y
                    - pictureBox2.Location.Y);
    
        }
    

就是这样!如果我运行这个程序,我会在另一个图像上面得到一个透明图像。

答案 1 :(得分:7)

我将添加另一个例子,根据更新的要求允许移动图像3 要使其正常工作,请在Resources\transp.png中添加透明图像 这对所有三个图像使用相同的图像,但您可以简单地将transparentImg替换为image1,将image2替换为合适的图像。

启动演示后,可以在表单周围拖放中间图像。

public partial class Form1 : Form
{
    private readonly Image transparentImg; // The transparent image
    private bool isMoving = false;         // true while dragging the image
    private Point movingPicturePosition = new Point(80, 20);   // the position of the moving image
    private Point offset;   // mouse position inside the moving image while dragging
    public Form1()
    {
        InitializeComponent();

        // 
        // pictureBox1
        // 
        this.pictureBox1.Location = new System.Drawing.Point(0, 0);
        this.pictureBox1.Name = "pictureBox1";
        this.pictureBox1.Size = new System.Drawing.Size(231, 235);
        this.pictureBox1.TabIndex = 0;
        this.pictureBox1.TabStop = false;
        this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
        this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown);
        this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove);
        this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseUp);
        this.Controls.Add(this.pictureBox1);
        transparentImg = Image.FromFile("..\\..\\Resources\\transp.png");
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        var g = e.Graphics;
        g.DrawImageUnscaled(transparentImg, new Point(20, 20));      // image1
        g.DrawImageUnscaled(transparentImg, new Point(140, 20));     // image2
        g.DrawImageUnscaled(transparentImg, movingPicturePosition);  // image3
    }

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        var r = new Rectangle(movingPicturePosition, transparentImg.Size);
        if (r.Contains(e.Location))
        {
            isMoving = true;
            offset = new Point(movingPicturePosition.X - e.X, movingPicturePosition.Y - e.Y);
        }
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isMoving)
        {
            movingPicturePosition = e.Location;
            movingPicturePosition.Offset(offset);
            pictureBox1.Invalidate();
        }
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        isMoving = false;
    }
}

答案 2 :(得分:2)

首先,将PictureBox3的BackColor属性设置为Transparent。这几乎适用于所有情况。

您还应该使用透明背景而不是白色的图像,这样您的紫色圆圈周围就没有白色边框。 (推荐图像格式:PNG)


<强>更新
在我收到的回复之后,似乎将BackColor设置为Transparent不起作用。在这种情况下,最好处理PictureBox的Paint事件,并自己绘制新图像为Albin suggested

答案 3 :(得分:2)

这段代码可以解决问题:

using (Graphics g = Graphics.FromImage(pictureBox1.Image))
{
    g.DrawImage(pictureBox2.Image, 
        (int)((pictureBox1.Image.Width - pictureBox2.Image.Width) / 2),
        (int)((pictureBox1.Image.Height - pictureBox2.Image.Height) / 2));
    g.Save();
    pictureBox1.Refresh();
}

它将从pictureBox2在pictureBox1的现有图像上绘制图像。

答案 4 :(得分:0)

您可以通过覆盖OnPaint和其他内容来做一些黑客攻击,例如here

但我建议将pictureBox2和3中的图片合并为一张图片,然后再将它们显示在一个图片框中。