Перетаскивание изображений при отображении предварительного просмотра в C#
Пример
В этом примере добавляется предварительный просмотр. Когда вы перетаскиваете изображение по целевой точке, оно отображает невысокую версию изображения.
При щелчке правой кнопкой мыши по источнику перетаскивания 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, а затем подгоните элемент управления, чтобы он соответствовал его изображению самостоятельно в коде.