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;
                
            }
        }
    }
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 阮小二买彩票
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 企业奖金发放
    Java实现 蓝桥杯VIP 算法提高 企业奖金发放
    让程序后台隐藏运行
    只要你喜欢,并且可以养家糊口,就是好的
  • 原文地址:https://www.cnblogs.com/webcyz/p/1963953.html
Copyright © 2011-2022 走看看