Проблема PictureBox - PullRequest
       25

Проблема PictureBox

11 голосов
/ 10 ноября 2010

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

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

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

alt text

РЕДАКТИРОВАНИЕ: Я хочу переместить pictureBox3 на pictureBox2,

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

Ответы [ 5 ]

9 голосов
/ 11 декабря 2010

Убедитесь, что изображение в 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, нажмите кнопку Import ... и импортируйте изображение в http://a.dryicons.com/files/graphics_previews/retro_blue_background.jpg (просто введите URL-адрес в текстовое поле «Имя файла» и нажмите «Открыть»). Затем нажмите OK, чтобы использовать изображение.
  • Перетащите еще один PictureBox на форму, установите его Location в 0; 0 и его Size в 256; 256. Также установите для свойства BackColor значение «Прозрачный».
  • Используя тот же метод, который описан выше, импортируйте изображение http://www.axdn.com/redist/axiw_i.png, которое является прозрачным изображением.
  • Теперь поместите следующий код в обработчик события OnLoad формы:

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

Вот и все! При запуске этой программы я получаю прозрачное изображение поверх другого изображения.

7 голосов
/ 15 ноября 2010

Я добавлю еще один пример, который в соответствии с обновленным требованием позволяет перемещать изображение 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 голосов
/ 14 ноября 2010

Этот код поможет вам:

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.

2 голосов
/ 10 ноября 2010

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

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


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

0 голосов
/ 10 ноября 2010

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

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

...