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)
拖动文件总是会产生一个字符串数组。每个数组元素都是所拖动的文件之一的路径。您需要编写额外的代码将 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)
| 归档时间: |
|
| 查看次数: |
1202 次 |
| 最近记录: |