0

Я обновляю код, сделанный в VB 4, где у меня есть RichTextBox. Мне нужно иметь возможность перетаскивать изображение из проводника Windows в RTB. К сожалению, я не могу заставить drag-and-drop работать.Перетащите изображение в RichTextBox

Я создал гораздо более простую программу Windows Form, чтобы попытаться разрешить это, но не достиг прогресса. Я начинаю с установки AllowDrop на True.

Public Sub New() 
    InitializeComponent() 
    Me.DragAndDropTextBox.AllowDrop = True 
End Sub 

Затем я создаю обработчики для RTB. Они берутся непосредственно из MSDN.

Private Sub DragAndDropTextBox_DragEnter(ByVal sender As Object, ByVal e As _ 
    System.Windows.Forms.DragEventArgs) Handles DragAndDropTextBox.DragEnter 
    ' Check the format of the data being dropped. 
    If (e.Data.GetDataPresent(DataFormats.FileDrop)) Then 
     ' Display the copy cursor. 
     e.Effect = DragDropEffects.Copy 
    Else 
     ' Display the no-drop cursor. 
     e.Effect = DragDropEffects.None 
    End If 
End Sub 

Private Sub DragAndDropTextBox_DragDrop(ByVal sender As Object, ByVal e As _ 
    System.Windows.Forms.DragEventArgs) Handles DragAndDropTextBox.DragDrop 
    System.Windows.Forms.DragEventArgs) Handles DragAndDropTextBox.DragDrop 
    Dim img As Image 
    img = Image.FromFile(e.Data.GetData(DataFormats.FileDrop, False)) 
    Clipboard.SetImage(img) 

    Me.DragAndDropTextBox.SelectionStart = 0 
    Me.DragAndDropTextBox.Paste() 
End Sub 

Когда я беру изображение в Проводнике и перетаскиваю его по моему окну, я получаю круг с косой чертой. Я поставил точки останова в первой строке каждого из обработчиков, и они никогда не достигаются. Я просмотрел несколько страниц, и все они, похоже, выполняют один и тот же процесс, поэтому я должен пропустить что-то простое.

Я сейчас не беспокоюсь о вставке изображения в текстовое поле; Я знаю, что мне нужно работать над этим. Я только пытаюсь захватить изображение, но методы обработчика, похоже, не вызываются.

UPDATE

После довольно много экспериментов, я обнаружил, что реальная проблема с моим Visual Studio 2010, который я всегда запускать от имени администратора. Когда я запускаю программу из exe, работает drag-and-drop. Когда я пытаюсь запустить VS в отладке, это не так. Кто-нибудь испытал это раньше?

Если бы кто-нибудь мог пролить свет на это, я был бы очень благодарен.

+1

Ваш код в DragEnter только устанавливает его для принятия для 'DataFormats.Text'. Изображения не являются текстом – Plutonix

+1

Когда вы перетаскиваете «изображение» из проводника Windows, на самом деле вы перетаскиваете только файл, содержащий изображение. Таким образом, ваш источник капель должен поддерживать падение файлов. И вы должны обработать файлы с потерями и загрузить изображения самостоятельно. –

+0

Это хороший момент, и я должен был это понять. Я внес изменения в свой код, но мне все еще не повезло. Как я уже сказал, точка останова не достигнута, поэтому я предполагаю, что методы DragEnter и DragDrop никогда не вызываются. – Tim

ответ

0

Оказалось, что Drag-And-Drop работал при запуске кода из exe, но не из Visual Studio. Больше поиска оказалось this Ответ, в котором говорится, что Drag-And-Drop не работает в Visual Studio, когда он запускается как администратор. Я запускал его с обычными разрешениями, и код работал.

0

Попробуйте избавиться от вызова InitializeComponent() в вашей функции Sub New. Когда я это сделал, мне удалось обнаружить событие DragEnter. Вот код, я тестировал (я создал простой WinForm и поставить RichTextBox на это называется DragAndDropTextBox):

Public Class Form1 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    DragAndDropTextBox.AllowDrop = True 
End Sub 

Private Sub DragAndDropTextBox_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles DragAndDropTextBox.DragEnter 

    Debug.Print("Entering text box region") 

    ' Check the format of the data being dropped. 
    If (e.Data.GetDataPresent(DataFormats.FileDrop)) Then 
     ' Display the copy cursor. 
     e.Effect = DragDropEffects.Copy 
    Else 
     ' Display the no-drop cursor. 
     e.Effect = DragDropEffects.None 
    End If 

End Sub 

Private Sub DragAndDropTextBox_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles DragAndDropTextBox.DragDrop 

    Dim img As Image 
    img = Image.FromFile(e.Data.GetData(DataFormats.FileDrop, False)) 
    Clipboard.SetImage(img) 

    Me.DragAndDropTextBox.SelectionStart = 0 
    Me.DragAndDropTextBox.Paste() 
End Sub 

End Class 

Вызов InitializeComponent() должен появиться в коде (я верю), когда вы добавляете свои собственные пользовательские элементы управления к форме. В противном случае, я не думаю, что вам нужно это назвать.

+0

Я считаю, что вызов InitializeComponent настраивает пользовательский интерфейс и должен вызываться, если вы не создадите вручную все элементы управления. Я попытался удалить его, чтобы убедиться, и мой RichTextBox не найден. Спасибо за предложение. – Tim