zoukankan      html  css  js  c++  java
  • C# 拖放功能的使用

    ///主要是响应控件的两个事件:一个是触发鼠标拖动并进入控件区域时,一个是触发鼠标拖动到该控件区域时的释放.
    ///拖动的对象需要从这两个事件的参数中获取,及从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;
                
            }
        }
    }
  • 相关阅读:
    Delphi XE5 图解为Android应用制作签名
    Delphi事件的广播 转
    Delphi XE6 Android拨号函数
    Firemonkey里触发home按键被按下的事件
    如何处理App的Application的事件
    SQL SERVER存储过程中使用事务与捕获异常
    关于蓝牙打印机的开发
    图标大全网站
    提高Android和iOS调试编译速度
    百万级数据查询优化(数据库)
  • 原文地址:https://www.cnblogs.com/webcyz/p/1963953.html
Copyright © 2011-2022 走看看