Перетаскивание изображений при отображении предварительного просмотра в C#

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

Источник: http://csharphelper.com/blog/2015/02/drag-and-drop-images-while-displaying-a-preview-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector