拖放文件名 Visual(托管)C++

Goo*_*ies 3 c++ drag-and-drop visual-studio visual-c++

我有一个 RichTextBox,我希望允许用户将文件从磁盘拖放到其中。文本框中应显示的只是文件名。此代码当前添加"System.String[]"到文本框而不是文件名。当我按照 MSDN 的建议更改为DataFormats::FileDrop,出现 NULL 取消引用错误。DataFormats::Text

RichTextBox 的名称是rtbFile。在我的构造函数中,我有:

this->rtbFile->AllowDrop = true;
Run Code Online (Sandbox Code Playgroud)

我设置了这样的事件(在InitializeComponents内):

this->rtbFile->DragEnter += gcnew System::Windows::Forms::DragEventHandler(this, &VanicheMain::rtbFile_DragEnter);
this->rtbFile->DragDrop += gcnew System::Windows::Forms::DragEventHandler(this, &VanicheMain::rtbFile_DragDrop);
Run Code Online (Sandbox Code Playgroud)

函数定义如下:

void rtbFile_DragEnter(System::Object ^sender, System::Windows::Forms::DragEventArgs ^ e) {
    if (e->Data->GetDataPresent(DataFormats::FileDrop))
        e->Effect = DragDropEffects::Copy;
    else
        e->Effect = DragDropEffects::None;
}

System::Void rtbFile_DragDrop(System::Object ^sender, System::Windows::Forms::DragEventArgs ^e){
    int i = rtbFile->SelectionStart;;
    String ^s = rtbFile->Text->Substring(i);
    rtbFile->Text = rtbFile->Text->Substring(0, i);
    String ^str = String::Concat(rtbFile->Text, e->Data->GetData(DataFormats::FileDrop)->ToString());
    rtbFile->Text = String::Concat(str, s);
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 5

拖动文件总是会产生一个字符串数组。每个数组元素都是所拖动的文件之一的路径。您需要编写额外的代码将 GetData() 的返回值转换为数组并迭代它,读取每个文件的内容。与此类似:

array<String^>^ paths = safe_cast<array<String^>^>(e->Data->GetData(DataFormats::FileDrop));
for each (String^ path in paths) {
    String^ ext = System::IO::Path::GetExtension(path)->ToLower();
    if (ext == ".txt") rtbFile->AppendText(System::IO::File::ReadAllText(path));
}
Run Code Online (Sandbox Code Playgroud)