Проблема С PictureBox
У меня проблема:
У меня есть 3 коробки с изображениями с 3 различными изображениями как на картинке
что я могу установить к pictureBox3 так что оба изображения выглядят одинаково.....
редактировать: Я хочу переместить 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);
}
в конструкторе вы не увидите прозрачности, но во время выполнения вы увидите.
обновление
на изображении, левая сторона показывает представление конструктора, правая сторона-версия среды выполнения.
еще одно обновление
Я действительно не понимаю, как это возможно, что это не работает для вас. Я полагаю, должно быть что-то, что мы делаем по-другому. Я опишу точные шаги, которые необходимо предпринять для создания рабочего образца. Если вы выполните те же шаги, интересно, получим ли мы те же результаты или нет. Следующие шаги описывают, что делать и использовать два изображения, которые я нашел на сеть.
- С помощью 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.