Проблема С PictureBox

У меня проблема:

У меня есть 3 коробки с изображениями с 3 различными изображениями как на картинке

что я могу установить к pictureBox3 так что оба изображения выглядят одинаково.....

alt text

редактировать: Я хочу переместить pictureBox3 на pictureBox2,

таким образом, нет возможности объединить их в одно изображение

5 ответов


Я добавлю еще один пример, который в соответствии с обновленным требованием позволяет перемещать image3.
Чтобы заставить его работать, поместите изображение с прозрачностью в 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;
    }
}

убедитесь, что изображение в pictureBox3 прозрачно. Установите BackColor прозрачным. В коде установите Parent свойства pictureBox3 на pictureBox2. Отрегулируйте Location координаты pictureBox3, так как они будут относительно координат pictureBox2 как только вы изменили 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);

    }

в конструкторе вы не увидите прозрачности, но во время выполнения вы увидите.

обновление

на изображении, левая сторона показывает представление конструктора, правая сторона-версия среды выполнения. Left: Designer view, Right: How it looks at runtime

еще одно обновление

Я действительно не понимаю, как это возможно, что это не работает для вас. Я полагаю, должно быть что-то, что мы делаем по-другому. Я опишу точные шаги, которые необходимо предпринять для создания рабочего образца. Если вы выполните те же шаги, интересно, получим ли мы те же результаты или нет. Следующие шаги описывают, что делать и использовать два изображения, которые я нашел на сеть.

  • С помощью Visual Studio 2008 создайте новый проект с помощью шаблона приложения Windows Forms. Убедитесь, что проект нацелен на .NET Framework 3.5.
  • установите размер формы в 457;483.
  • перетащите элемент управления PictureBox на форму. Установите его местоположение 0; 0 и его размер 449; 449.
  • щелкните многоточие помимо свойства Image, щелкните импорт... кнопка и импорт изображения на http://a.dryicons.com/files/graphics_previews/retro_blue_background.jpg (просто введите URL-адрес в текстовом поле Имя файла и нажмите кнопку Открыть). Затем нажмите OK, чтобы использовать изображение.
  • перетащите другой PictureBox на форму, установите его местоположение в 0; 0 и его размер в 256; 256. Также установите свойству BackColor значение прозрачный.
  • используя тот же метод, что и описанный выше, импортируйте изображение http://www.axdn.com/redist/axiw_i.png который является прозрачным изображение.
  • Теперь поместите следующий код в обработчик событий OnLoad формы:

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

вот именно! Если я запускаю программу, я получаю прозрачное изображение поверх другого изображения.


Для начала, выберите BackColor свойство PictureBox3 к прозрачному. Это должно работать почти во всех случаях.

вы также должны использовать изображение с прозрачным фоном вместо белого, чтобы у вас не было белых границ вокруг вашего фиолетового круга. (Рекомендуемый формат изображения: PNG)


обновление
После ответов, которые я получил, появляется установка BackColor прозрачный не работает. В таком случае, лучше всего вам справиться с Paint событие PictureBox и сделать картину нового образа себя как .


этот код сделает трюк:

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.


вы можете сделать некоторые взломать, переопределив OnPaint и прочее, например здесь.

но я бы рекомендовал объединить изображения в pictureBox2 и 3 в одно изображение, прежде чем отображать их в одном pictureBox.