#c# #imagemagick
#c# #imagemagick
Вопрос:
У меня есть два поля с картинками в моем приложении Windows Forms. Каждое из этих полей с картинками содержит изображение. pictureBox1 маленький, всего 122 x 52, а pictureBox2 намного больше (459 x 566). Что я хочу сделать, это иметь возможность перетаскивать изображение picturebox1 на picturebox2, и новое изображение будет создано и сохранено. Где бы ни находились координаты x и y, я размещаю изображение pictureBox1, оно будет «штамповать» его прямо в этом месте в pictureBox2. И затем изображение pictureBox2 будет изменено и сохранено. Таким образом, простым перетаскиванием пользователь должен иметь возможность легко «штамповать» изображения на pictureBox2. Возможно ли это?
Комментарии:
1. Поля с картинками — это элементы управления. Изображения, которые они содержат, — это нечто другое. Вам нужно будет нарисовать второе изображение на первом.
2. И это нормально, но есть ли способ получить координаты места, куда я сбросил изображение? Я предполагаю, что я создаю новое изображение в codebehind в событиях DragDrop или DragEnter?
Ответ №1:
Mr Snrub,
Если вы используете перетаскивание, вы контролируете то, что хотите сделать. Как правило, в событии MouseDown элемента управления вы определяете, запускается ли dragevent или нет. Я сохраняю свойство формы.
private Point _mouseDownPoint;
Я установил это при перетаскивании из элемента управления во время наведения курсора мыши
protected override void OnMouseDown(MouseEventArgs e)
{
_mouseDownPoint = e.Location;
}
В событии OnMouseMove для того же элемента управления. Этот код гарантирует, что пользователь, скорее всего, пытается перетащить и начинает перетаскивание. Этот код поступает из usercontrol, поэтому в вашем случае может потребоваться изменить this в DoDragDrop.
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (e.Button != MouseButtons.Left) return;
var dx = e.X - _mouseDownPoint.X;
var dy = e.Y - _mouseDownPoint.Y;
if (Math.Abs(dx) > SystemInformation.DoubleClickSize.Width || Math.Abs(dy) > SystemInformation.DoubleClickSize.Height)
{
DoDragDrop(this, DragDropEffects.Move);
}
}
Ваши элементы управления, которые могут получить удаление, должны иметь свои события DragEnter. Здесь у нас есть событие DragEnter, которое различает ToolStripButton и пользовательский UserControl DSDPicBox. Элементы управления, в которых не закодировано событие DragEnter, будут отображать значок узла при перетаскивании.
private void Control_DragEnter(object sender, DragEventArgs e)
{
var button = e.Data.GetData(typeof(ToolStripButton)) as ToolStripButton;
if (button != null)
{
e.Effect = DragDropEffects.Copy;
return;
}
var element = e.Data.GetData(typeof(DSDPicBox)) as DSDPicBox;
if (element == null) return;
e.Effect = DragDropEffects.Move;
}
И, наконец, вы должны обработать удаление. panelDropPoint — это координаты того места, где был удален элемент. Вы могли бы использовать это, чтобы разместить свою новую графику в старой. Вам нужно будет отобразить изображение в новом разрешении, если вы меняете его размер.
private void panel_DragDrop(object sender, DragEventArgs e)
{
// Test to see where we are dropping. Sender will be control on which you dropped
var panelDropPoint = sender.PointToClient(new Point(e.X, e.Y));
var panelItem = sender.GetChildAtPoint(panelDropPoint);
_insertionPoint = panelItem == null ? destination.Controls.Count : destination.Controls.GetChildIndex(panelItem, false);
var whodat = e.Data.GetData(typeof(ToolStripButton)) as ToolStripButton;
if (whodat != null)
{
//Dropping from a primitive button
_dropped = true;
whodat.PerformClick();
return;
}
}
Я удалил несколько элементов из кода, которые просто замутят воду. Этот код может не работать из коробки, но должен приблизить вас.
С уважением, Марк