代码之家  ›  专栏  ›  技术社区  ›  Javed Akram

画板问题

  •  11
  • Javed Akram  · 技术社区  · 14 年前

    我有3个图片框和3个不同的图片

    我能设定什么 图片框3 所以两张照片看起来都一样。。。。。

    alt text

    我想在pictureBox2上移动pictureBox3,

    所以没有办法把它们合并成一张图片

    5 回复  |  直到 14 年前
        1
  •  7
  •   Albin Sunnanbo    14 年前

    我将添加另一个例子,根据更新的要求,允许移动image3。
    为了让它工作,把一个透明的图像 Resources\transp.png
    这将对所有三个图像使用相同的图像,但您可以简单地将image1和image2的transparentImg替换为适当的图像。

    一旦演示开始,中间的图像就可以被拖到窗体周围。

    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
  •  9
  •   comecme    14 年前

    pictureBox3 是透明的。设置 BackColor 透明的。在代码中,设置 Parent 财产 成为 pictureBox2 . 调整 Location 图片框3 因为它们是相对于 一旦你改变了 起源

        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);
    
        }
    

    在设计器中,您将看不到透明度,但在运行时,您将看到透明度。

    更新

    Left: Designer view, Right: How it looks at runtime

    另一个更新

    我真的不明白这怎么可能对你不起作用。我想我们一定在做些不同的事情。我将描述创建工作示例的确切步骤。如果你遵循同样的步骤,我想知道我们是否会得到同样的结果。接下来的步骤描述该做什么并使用我在网上找到的两张图片。

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

      private void Form1_Load(object sender, EventArgs e)
      {
          pictureBox2.Parent = pictureBox1;
      }
      

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

        3
  •  2
  •   Community CDub    8 年前

    BackColor PictureBox3的属性设置为Transparent。这在几乎所有情况下都应该有效。

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


    更新
    属性 透明是行不通的。在这种情况下,你最好处理 Paint Albin suggested .

        4
  •  2
  •   Shadow Wizard    14 年前

    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();
    }
    

    它将从PICTIONBOX2的图片上绘制图像。

        5
  •  0
  •   Albin Sunnanbo    14 年前

    例如,你可以通过重写paint和stuff来进行一些修改 here .