///主要是响应控件的两个事件:一个是触发鼠标拖动并进入控件区域时,一个是触发鼠标拖动到该控件区域时的释放.
///拖动的对象需要从这两个事件的参数中获取,及从e中获得.
///先要把你想接受拖放功能的控件的AllowDrop功能打开.
this.textBox2.AllowDrop = true;
this.textBox2.Multiline = true;
this.textBox2.Multiline = true;
private void textBox2_DragDrop(object sender, DragEventArgs e)
{
///创建一个数组类,用于保存拖动进来的数据组,这里是文件名路径的数组(多个文件拖进来的情况)
///e.Data.GetData方法就是获取文件名数组的功能,参数是决定关联哪种数据格式.
///这里运用了把 Object 强制转换为 Array 的特点.
Array aryFiles = ((System.Array)e.Data.GetData(DataFormats.FileDrop));
for (int i = 0; i < aryFiles.Length; i++)
{
///通过For循环把所有文件路径加到字符串label4.text里面.
label4.Text = aryFiles.GetValue(i).ToString();// +Environment.NewLine;
}
path = label4.Text;
}
private void textBox2_DragEnter(object sender, DragEventArgs e)
{
///拖进来时,判断拖动的数据是否是指定数据格式,并设置e.Effect的图标样式.
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Move;
else e.Effect = DragDropEffects.None;
{
///创建一个数组类,用于保存拖动进来的数据组,这里是文件名路径的数组(多个文件拖进来的情况)
///e.Data.GetData方法就是获取文件名数组的功能,参数是决定关联哪种数据格式.
///这里运用了把 Object 强制转换为 Array 的特点.
Array aryFiles = ((System.Array)e.Data.GetData(DataFormats.FileDrop));
for (int i = 0; i < aryFiles.Length; i++)
{
///通过For循环把所有文件路径加到字符串label4.text里面.
label4.Text = aryFiles.GetValue(i).ToString();// +Environment.NewLine;
}
path = label4.Text;
}
private void textBox2_DragEnter(object sender, DragEventArgs e)
{
///拖进来时,判断拖动的数据是否是指定数据格式,并设置e.Effect的图标样式.
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Move;
else e.Effect = DragDropEffects.None;
//这里说明一下,e传进来的数据,我个人觉得应用这样判断,因为其原理是:应该用e.AllowedEffect.ToString()来判断总共源(发起方)支持哪些拖放操作.
//如果发起方支持多种拖放操作时,用上面的判断就要注意选择结果的唯一性.否则前面的拖放样式就很可能由于本发起方有多种拖放操作及满足MOVE又满足
//LINK而又去选择后面代码中的拖放效果,从而使其前面代码应该拥有的脱发效果失效,最终不能实现拖放操作.
/*
比较清晰的判断方式可以用下面这种判断方法:
if (e.AllowedEffect.ToString().Contains("Copy") && !e.AllowedEffect.ToString().Contains("Link"))
e.Effect = DragDropEffects.Copy;
if (e.AllowedEffect.ToString() == "Link")
e.Effect = DragDropEffects.Link;
*/
}
}
拖放操作,内存流操作,编码转换,二义性的问题.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//Clipboard.Clear();//清空剪切板
//Clipboard.SetText("中国", TextDataFormat.Text);//向剪切板中填充ANSI编码的UNICODE字符串
//Clipboard.SetText("中国", TextDataFormat.UnicodeText);//向剪切板中填充UNICODE编码的UNICODE字符串
//Clipboard.SetText("http://www.baidu.com", TextDataFormat.Html);//向剪切板填充html格式内容的字符串
//向剪切板填充自定义对象,并指定关联的格式,便于监听或获取自定义数据
//string myobj = "中华人民共和国";//要填充的对象
//DataFormats.Format myFormat = DataFormats.GetFormat("myFormat");//先自定义一种格式
//DataObject myDataObject = new DataObject(DataFormats.Text, myobj);//在创建对象时连同格式一起关联起来
//Clipboard.SetDataObject(myDataObject);//向剪切板中填充自定义数据对象
IDataObject idata=Clipboard.GetDataObject();//通过通用的数据接口来操作剪切板中的数据
for (int i = 0; i < idata.GetFormats().Length; i++)//逐一显示系统当前剪切板内各种格式信息,用于分析下一步如何获取剪贴板内容
{
MessageBox.Show(i.ToString());
MessageBox.Show(idata.GetFormats()[i]);
}
//处理html剪贴板的情况:
if (idata.GetDataPresent(DataFormats.Html))
{
//处理格式为html的剪贴板内容时,由于大部分内容都是UTF-8编码以字节方式存放.
//下面代码中的:idata.GetData("Html Format")返回的是object对象.如果强制转换为UNICODE的string 就会显示乱码.
//为了在ANSI模式下正确显示,
//因此采用内存流的方式先按字节方式获取所有数据,再通过指定编码转换为字符串
MemoryStream vmemorystream = idata.GetData("Html Format") as MemoryStream;
//这里获取剪贴板格式时,输入的格式字符串参数,必须是这样写,否则运行时就会报"内存错误"
//估计是编译器的一个BUG吧,不能选"DataFormats.Html"
//as 关键词就是安全的把object转换为MemoryStream 对象.
vmemorystream.Position = 0;
byte[] vbytes = new byte[vmemorystream.Length];
vmemorystream.Read(vbytes, 0, (int)vmemorystream.Length);
//以上是读取内存流中的字节信息来填充字节数组
textBox1.Text = Encoding.UTF8.GetString(vbytes);
//最后:字节数组以指定编码的方式生成UNICODE的string.
}
/*
IDataObject ido = Clipboard.GetDataObject();//获得数据接口
if (ido.GetDataPresent(DataFormats.Text,false))
{//判断剪切板上的数据类型
Text = (string)ido.GetData(DataFormats.Text); //获取内容
}
*/
}
private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e)
{
System.Diagnostics.Process.Start(e.LinkText);
}
private void button2_Click(object sender, EventArgs e)
{
Clipboard.SetText("陈佑忠", TextDataFormat.UnicodeText);
IDataObject idata = Clipboard.GetDataObject();
for (int i = 0; i < idata.GetFormats().Length; i++)//逐一显示系统当前剪切板内各种格式信息,用于分析下一步如何获取剪贴板内容
{
MessageBox.Show(i.ToString());
MessageBox.Show(idata.GetFormats()[i]);
}
MemoryStream ms = idata.GetData("unicodetext") as MemoryStream;
ms.Position = 0;
byte[] b = new byte[ms.Length];
ms.Read(b, 0, (int)ms.Length);
MessageBox.Show(((int)b[2]).ToString());
}
//================================================拖放操作(注意:支持多种拖放样式时,在代码编写时的二义性)
//通过判断不同的拖放样式,具体完成最终的拖放获取数据的工作
private void textBox1_DragDrop(object sender, DragEventArgs e)
{
//获取网页内容,包括编码转换
if (e.AllowedEffect.ToString().Contains("Copy")&&!e.AllowedEffect.ToString().Contains("Move"))
{
//处理格式为html的剪贴板内容时,由于大部分内容都是UTF-8编码以字节方式存放.
//下面代码中的:idata.GetData("Html Format")返回的是object对象.如果强制转换为UNICODE的string 就会显示乱码.
//为了在ANSI模式下正确显示,
//因此采用内存流的方式先按字节方式获取所有数据,再通过指定编码转换为字符串
MemoryStream vmemorystream = e.Data.GetData("Html Format") as MemoryStream;
//这里获取剪贴板格式时,输入的格式字符串参数,必须是这样写,否则运行时就会报"内存错误"
//估计是编译器的一个BUG吧,不能选"DataFormats.Html"
//as 关键词就是安全的把object转换为MemoryStream 对象.
vmemorystream.Position = 0;
byte[] vbytes = new byte[vmemorystream.Length];
vmemorystream.Read(vbytes, 0, (int)vmemorystream.Length);
//以上是读取内存流中的字节信息来填充字节数组
textBox1.Text = "";
textBox1.Text = Encoding.UTF8.GetString(vbytes);
//最后:字节数组以指定编码的方式生成UNICODE的string.
richTextBox1.Text = "";//输出网页内容的纯文本
richTextBox1.Text = e.Data.GetData(DataFormats.UnicodeText).ToString();//输出网页内容的纯文本
}
//获取Rich文本和360浏览器地址栏文本
if (e.AllowedEffect.ToString().Contains("Copy") && e.AllowedEffect.ToString().Contains("Move"))
{
//textBox1.Text = e.Data.GetData("Rich Text Format").ToString();//获取RICH源字符串
textBox1.Text = e.Data.GetData(DataFormats.UnicodeText).ToString();
}
//获取IE超级连接地址
if (e.AllowedEffect.ToString().Contains("Link"))
{
richTextBox1.Text = "";
richTextBox1.Text = e.Data.GetData(DataFormats.UnicodeText).ToString()+'\n';
}
}
//===================================================拖放判断与开关(没有打开相应的Effect是不能实现拖放的)
//设置拖放样式(如果不设置,不能拖放)
private void textBox1_DragOver(object sender, DragEventArgs e)
{
//MessageBox.Show(e.AllowedEffect.ToString());//判断拖放源支持哪些拖放效果
if (e.AllowedEffect.ToString().Contains("Copy"))//拖放网页内容
e.Effect = DragDropEffects.Copy;
if (e.AllowedEffect.ToString() == "Link")//拖放超级连接
e.Effect = DragDropEffects.Link;
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//Clipboard.Clear();//清空剪切板
//Clipboard.SetText("中国", TextDataFormat.Text);//向剪切板中填充ANSI编码的UNICODE字符串
//Clipboard.SetText("中国", TextDataFormat.UnicodeText);//向剪切板中填充UNICODE编码的UNICODE字符串
//Clipboard.SetText("http://www.baidu.com", TextDataFormat.Html);//向剪切板填充html格式内容的字符串
//向剪切板填充自定义对象,并指定关联的格式,便于监听或获取自定义数据
//string myobj = "中华人民共和国";//要填充的对象
//DataFormats.Format myFormat = DataFormats.GetFormat("myFormat");//先自定义一种格式
//DataObject myDataObject = new DataObject(DataFormats.Text, myobj);//在创建对象时连同格式一起关联起来
//Clipboard.SetDataObject(myDataObject);//向剪切板中填充自定义数据对象
IDataObject idata=Clipboard.GetDataObject();//通过通用的数据接口来操作剪切板中的数据
for (int i = 0; i < idata.GetFormats().Length; i++)//逐一显示系统当前剪切板内各种格式信息,用于分析下一步如何获取剪贴板内容
{
MessageBox.Show(i.ToString());
MessageBox.Show(idata.GetFormats()[i]);
}
//处理html剪贴板的情况:
if (idata.GetDataPresent(DataFormats.Html))
{
//处理格式为html的剪贴板内容时,由于大部分内容都是UTF-8编码以字节方式存放.
//下面代码中的:idata.GetData("Html Format")返回的是object对象.如果强制转换为UNICODE的string 就会显示乱码.
//为了在ANSI模式下正确显示,
//因此采用内存流的方式先按字节方式获取所有数据,再通过指定编码转换为字符串
MemoryStream vmemorystream = idata.GetData("Html Format") as MemoryStream;
//这里获取剪贴板格式时,输入的格式字符串参数,必须是这样写,否则运行时就会报"内存错误"
//估计是编译器的一个BUG吧,不能选"DataFormats.Html"
//as 关键词就是安全的把object转换为MemoryStream 对象.
vmemorystream.Position = 0;
byte[] vbytes = new byte[vmemorystream.Length];
vmemorystream.Read(vbytes, 0, (int)vmemorystream.Length);
//以上是读取内存流中的字节信息来填充字节数组
textBox1.Text = Encoding.UTF8.GetString(vbytes);
//最后:字节数组以指定编码的方式生成UNICODE的string.
}
/*
IDataObject ido = Clipboard.GetDataObject();//获得数据接口
if (ido.GetDataPresent(DataFormats.Text,false))
{//判断剪切板上的数据类型
Text = (string)ido.GetData(DataFormats.Text); //获取内容
}
*/
}
private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e)
{
System.Diagnostics.Process.Start(e.LinkText);
}
private void button2_Click(object sender, EventArgs e)
{
Clipboard.SetText("陈佑忠", TextDataFormat.UnicodeText);
IDataObject idata = Clipboard.GetDataObject();
for (int i = 0; i < idata.GetFormats().Length; i++)//逐一显示系统当前剪切板内各种格式信息,用于分析下一步如何获取剪贴板内容
{
MessageBox.Show(i.ToString());
MessageBox.Show(idata.GetFormats()[i]);
}
MemoryStream ms = idata.GetData("unicodetext") as MemoryStream;
ms.Position = 0;
byte[] b = new byte[ms.Length];
ms.Read(b, 0, (int)ms.Length);
MessageBox.Show(((int)b[2]).ToString());
}
//================================================拖放操作(注意:支持多种拖放样式时,在代码编写时的二义性)
//通过判断不同的拖放样式,具体完成最终的拖放获取数据的工作
private void textBox1_DragDrop(object sender, DragEventArgs e)
{
//获取网页内容,包括编码转换
if (e.AllowedEffect.ToString().Contains("Copy")&&!e.AllowedEffect.ToString().Contains("Move"))
{
//处理格式为html的剪贴板内容时,由于大部分内容都是UTF-8编码以字节方式存放.
//下面代码中的:idata.GetData("Html Format")返回的是object对象.如果强制转换为UNICODE的string 就会显示乱码.
//为了在ANSI模式下正确显示,
//因此采用内存流的方式先按字节方式获取所有数据,再通过指定编码转换为字符串
MemoryStream vmemorystream = e.Data.GetData("Html Format") as MemoryStream;
//这里获取剪贴板格式时,输入的格式字符串参数,必须是这样写,否则运行时就会报"内存错误"
//估计是编译器的一个BUG吧,不能选"DataFormats.Html"
//as 关键词就是安全的把object转换为MemoryStream 对象.
vmemorystream.Position = 0;
byte[] vbytes = new byte[vmemorystream.Length];
vmemorystream.Read(vbytes, 0, (int)vmemorystream.Length);
//以上是读取内存流中的字节信息来填充字节数组
textBox1.Text = "";
textBox1.Text = Encoding.UTF8.GetString(vbytes);
//最后:字节数组以指定编码的方式生成UNICODE的string.
richTextBox1.Text = "";//输出网页内容的纯文本
richTextBox1.Text = e.Data.GetData(DataFormats.UnicodeText).ToString();//输出网页内容的纯文本
}
//获取Rich文本和360浏览器地址栏文本
if (e.AllowedEffect.ToString().Contains("Copy") && e.AllowedEffect.ToString().Contains("Move"))
{
//textBox1.Text = e.Data.GetData("Rich Text Format").ToString();//获取RICH源字符串
textBox1.Text = e.Data.GetData(DataFormats.UnicodeText).ToString();
}
//获取IE超级连接地址
if (e.AllowedEffect.ToString().Contains("Link"))
{
richTextBox1.Text = "";
richTextBox1.Text = e.Data.GetData(DataFormats.UnicodeText).ToString()+'\n';
}
}
//===================================================拖放判断与开关(没有打开相应的Effect是不能实现拖放的)
//设置拖放样式(如果不设置,不能拖放)
private void textBox1_DragOver(object sender, DragEventArgs e)
{
//MessageBox.Show(e.AllowedEffect.ToString());//判断拖放源支持哪些拖放效果
if (e.AllowedEffect.ToString().Contains("Copy"))//拖放网页内容
e.Effect = DragDropEffects.Copy;
if (e.AllowedEffect.ToString() == "Link")//拖放超级连接
e.Effect = DragDropEffects.Link;
}
}
}