分享

C# 拖放功能的使用

 wwssdd2000 2014-05-21
///主要是响应控件的两个事件:一个是触发鼠标拖动并进入控件区域时,一个是触发鼠标拖动到该控件区域时的释放.
///拖动的对象需要从这两个事件的参数中获取,及从e中获得.
 
 
        ///先要把你想接受拖放功能的控件的AllowDrop功能打开.
        this.textBox2.AllowDrop = 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传进来的数据,我个人觉得应用这样判断,因为其原理是:应该用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;
            
        }
    }
}
复制代码

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多