Перетаскивание изображений при отображении предварительного просмотра в C#
Пример объясняет, как для перетаскивания изображений. См. Этот пример для основных идей. (Обратите особое внимание на второй абзац, в котором обсуждается свойство AllowDrop для элемента управления PictureBox.)
В этом примере добавляется предварительный просмотр. Когда вы перетаскиваете изображение по целевой точке, оно отображает невысокую версию изображения.
При щелчке правой кнопкой мыши по источнику перетаскивания PictureBox следующий код запускает перетаскивание.
// Запустите перетаскивание.
private void picDragSource_MouseDown(object sender,
MouseEventArgs e)
{
// Запустите перетаскивание, если это правая кнопка мыши.
if (e.Button == MouseButtons.Right)
{
PictureBox source = sender as PictureBox;
picDragSource.DoDragDrop(source.Image,
DragDropEffects.Copy);
}
}
Этот код вызывает DoDragDrop, чтобы запустить перетаскивание, передав ему изображение для перетаскивания.
Когда перетаскивание перемещается по целевой точке, выполняется следующий код.
// Текущее изображение во время перетаскивания.
private Image OldImage = null;
// Разрешить копию изображения.
private void picDropTarget_DragEnter(object sender,
DragEventArgs e)
{
// Смотрите, является ли это копией, а данные содержат изображение.
if (e.Data.GetDataPresent(DataFormats.Bitmap) &&
(e.AllowedEffect & DragDropEffects.Copy) != 0)
{
// Разрешить это.
e.Effect = DragDropEffects.Copy;
// Сохранение текущего изображения.
OldImage = picDropTarget.Image;
// Отображение изображения предварительного просмотра.
Bitmap bm =
(Bitmap)e.Data.GetData(DataFormats.Bitmap, true);
Bitmap copy_bm = (Bitmap)bm.Clone();
using (Graphics gr = Graphics.FromImage(copy_bm))
{
// Обложка с полупрозрачным белым.
using (SolidBrush br =
new SolidBrush(Color.FromArgb(128, 255, 255, 255)))
{
gr.FillRectangle(br, 0, 0, bm.Width, bm.Height);
}
}
picDropTarget.Image = copy_bm;
}
else
{
// Не разрешайте другие капли.
e.Effect = DragDropEffects.None;
}
}
Если имеются растровые данные, и это операция копирования, код позволяет копировать. Он сохраняет текущее изображение целевой цели в переменной OldImage. Он создает копию перетаскиваемого изображения и рисует прозрачный белый прямоугольник над ним, чтобы сделать его легче. Затем он отображает изображение предварительного просмотра в целевой камере PictureBox. PictureBox имеет SizeMode, установленный в AutoSize, поэтому элемент управления автоматически изменяет размеры, чтобы соответствовать изображению предварительного просмотра.
Если перетаскивание покидает цель перетаскивания, выполняется следующий код.
// Удалите изображение перетаскивания.
private void picDropTarget_DragLeave(object sender,
EventArgs e)
{
// Восстановить сохраненное изображение.
picDropTarget.Image = OldImage;
}
Этот код восстанавливает исходное изображение целевой цели, поэтому изображение предварительного просмотра больше не отображается.
Наконец, если пользователь падает на цель, выполняется следующий код.
// Принять падение.
private void picDropTarget_DragDrop(object sender,
DragEventArgs e)
{
Bitmap bm = (Bitmap)e.Data.GetData(DataFormats.Bitmap, true);
picDropTarget.Image = bm;
}
Этот код отображает отброшенное изображение.
В какой-то момент, в более ранней версии Windows, программа мерцала, когда вы перетаскивали изображения разных размеров над элементом управления. Если это произойдет в вашей системе, попробуйте установить свойство AutoSize целевой цели кавычки на Normal, а затем подгоните элемент управления, чтобы он соответствовал его изображению самостоятельно в коде.
