2010-11-10 20 views
9

Tengo un problema:Un cuadro de imagen Problema

tengo 3 cuadros de imagen con 3 imágenes diferentes como en la imagen

qué puedo fijar a pictureBox3 por lo que ambas imágenes se vean misma .... .

alt text

editado: quiero mover pictur eBox3 en pictureBox2,

Así que no hay opción de fusionar a sola imagen

Respuesta

6

Agregaré otro ejemplo que de acuerdo con el requisito actualizado permite el movimiento de la imagen3.
Para que funcione, coloque una imagen con transparencia en Resources\transp.png
Esto usa la misma imagen para las tres imágenes, pero simplemente puede reemplazar transparentImg para image1 e image2 a las imágenes adecuadas.

Una vez que se inicia la demostración, la imagen del medio se puede arrastrar y soltar alrededor del formulario.

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; 
    } 
} 
+0

Gracias, mucho Albin por su respuesta, está funcionando mejor de lo que esperaba, ¡Gran trabajo! –

+0

Deberá capturar el mouse en MouseDown y lanzar la captura en MouseUp. Esto asegura que los mensajes de movimiento se envíen incluso cuando el usuario se mueve fuera de su ventana. – Tergiver

+0

Gracias cargas ... ¡esta es una gran respuesta! –

2

Para empezar, establezca la propiedad de BackColor PictureBox3 a transparente. Esto debería funcionar en casi todos los casos.

También debe utilizar una imagen con un fondo transparente en lugar de blanco, por lo que no tiene los bordes blancos alrededor de su círculo púrpura. (Formato recomendado imagen: PNG)


actualización
Tras las respuestas que obtuve, aparece la configuración del BackColor a transparente no funciona. En ese caso, es mejor que maneje el evento Paint del PictureBox y haga la pintura de la nueva imagen usted mismo como Albin suggested.

+0

intenté volver a ColorColor transparente pero no funciona, da el color de la forma .. –

+0

Javed está en lo cierto, establecer BackColor en transparente no hace que el control real sea transparente –

+2

Es transparente, pero ve * el formulario * píxeles. Los efectos de apilamiento no funcionan. Se puede hacer que funcione pero es fugly. Combinar las imágenes usted mismo es mucho más fácil. –

0

Puede hacer algo de hackeo anulando OnPaint y esas cosas, ejemplo here.

Pero recomiendo fusionar las imágenes en pictureBox2 y 3 en una sola imagen antes de mostrarlas en un solo cuadro de imagen.

+0

Existe la posibilidad de que esté escribiendo una aplicación para niños que conoces ... Ajuste de formas y demás. –

+0

Quiero mover image3 en image2 como en la Pregunta actualizada ... –

+0

@Alex, capturar MouseDown y MouseMove con algunos repintados debe encargarse de eso. –

2

Este código hará el truco:

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

Se basará la imagen de pictureBox2 en la imagen existente de pictureBox1.

8

Asegúrate de que la imagen en pictureBox3 sea transparente. Establezca el BackColor en transparente. En el código, configure la propiedad Parent del pictureBox3 como pictureBox2. Ajuste las coordenadas Location de pictureBox3 ya que serán relativas a las coordenadas pictureBox2 una vez que haya cambiado Parent.

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

    } 

En el diseñador no verá la transparencia, pero en tiempo de ejecución lo hará.

actualización

En la imagen, el lado izquierdo muestra la vista del diseñador, el lado derecho es la versión en tiempo de ejecución. Left: Designer view, Right: How it looks at runtime

Otra actualización

Realmente no entiendo cómo sería posible que esto no funciona para usted. Supongo que debe haber algo que estamos haciendo diferente. Describiré los pasos exactos a seguir para crear una muestra de trabajo. Si sigue exactamente los mismos pasos, me pregunto si obtendremos los mismos resultados o no. Los próximos pasos describen qué hacer y usan dos imágenes que encontré en la red.

  • Usando Visual Studio 2008, cree un nuevo proyecto usando la aplicación Windows Forms Application. Asegúrese de que el proyecto esté dirigido a .NET Framework 3.5.
  • Establezca el tamaño del formulario en 457; 483.
  • Arrastre un control PictureBox al formulario. Establezca su ubicación en 0; 0 y su tamaño en 449; 449.
  • Haga clic en los puntos suspensivos además de su propiedad Imagen, haga clic en el botón Importar ... e importe la imagen al http://a.dryicons.com/files/graphics_previews/retro_blue_background.jpg (simplemente escriba la URL en el cuadro de texto Nombre de archivo y haga clic en Abrir). Luego haz clic en Aceptar para usar la imagen.
  • Arrastre otra PictureBox en el formulario, establezca su ubicación en 0; 0 y su tamaño en 256; 256. Establezca también su propiedad BackColor en Transparente.
  • Usando el mismo método que el descrito anteriormente, importe la imagen http://www.axdn.com/redist/axiw_i.png que es una imagen transparente.
  • Ahora coloque el siguiente código en controlador de eventos OnLoad del formulario:

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

eso es todo! Si ejecuto este programa, obtengo una imagen transparente sobre otra imagen.

+0

Puede pensar que también puede cambiar la ubicación utilizando 'pictureBox3.Location.Offset' pero eso no funciona porque la propiedad' Location' devuelve un valor, no una referencia. Si desea usar 'Offset', debe crear una variable para contener el' Punto', usar 'Offset' en esa variable y asignarla a' pictureBox3.Location'. – comecme

+0

Ya lo he intentado (estableciendo la propiedad principal) pero no va a ser transparente ... –

+0

Eso es extraño. En mi caso, funcionó. He agregado una imagen que muestra el resultado. ¿Notaste que dije que no sería transparente en el Diseñador sino solo en tiempo de ejecución? – comecme

Cuestiones relacionadas