使用剪贴板保存自定义对象

技术要点:

放置到剪贴板上的对象必须是可序列化的。

剪贴板接收一个实现了IDataObject接口的对象,可以用此对象“包装”具体的数据对象。

可以多次调用IDataObject. SetData方法将多种类型的对象复制到剪贴板中。在获取剪贴板中的数据时通过DataFormat进行识别

在进行粘贴之前,需要确保剪贴板上的数据是所需要的格式。


using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Runtime.Serialization;

namespace UseClipboard
{
    [Serializable]
    class MyPic
    {
        public Image pic;       //图片
        public string picInfo;  //图片信息说明
    }
}


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace UseClipboard
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }
        //图片
        private Image bmp
        {
            get
            {
                return pictureBox1.Image;
            }
            set
            {
                pictureBox1.Image = value;
            }
        }
        //图片说明
        private string info
        {
            get
            {
                return txtImageInfo.Text;
            }
            set
            {
                txtImageInfo.Text = value;
            }
        }

        private void btnLoadPic_Click(object sender, EventArgs e)
        {
            ChooseImageFile();
        }

        //选择图片
        private void ChooseImageFile()
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string name = openFileDialog1.FileName;
                txtImageInfo.Text = name;
                bmp = new Bitmap(name);
            }
        }
        //根据用户设定的信息创建对象
        private MyPic CreateMyPicObj()
        {
            MyPic obj = new MyPic();
            obj.pic = bmp;
            obj.picInfo = info;
            return obj;
        }

        //将对象复制到剪贴板上
        private void CopyToClipboard()
        {
            //创建MyPic对象
            MyPic obj = CreateMyPicObj();

            //创建一个数据对象,将MyPic类型的对象装入
            IDataObject dataobj = new DataObject(obj);

            //其它类型的数据也可以装入到数据对象中
            dataobj.SetData(DataFormats.UnicodeText, info);
            dataobj.SetData(DataFormats.Bitmap, bmp);

            //复制到剪贴板上,第二个参数表明程序退出时不清空剪贴板
            Clipboard.SetDataObject(dataobj,true );
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void btnCopyToClipboard_Click(object sender, EventArgs e)
        {
            CopyToClipboard();
        }

        //从剪贴板获取数据
        private void PasteFromClipboard()
        {
            //剪贴板上有我需要的数据吗?格式为“项目名称.数据格式名”
            if (Clipboard.ContainsData("UseClipboard.MyPic") == false)//根据指定的DataFormat获取数据对象
                return;
            //读取数据
            IDataObject clipobj = Clipboard.GetDataObject();
            //将数据转换为需要的类型
            MyPic mypicobj = clipobj.GetData("UseClipboard.MyPic") as MyPic;
            //从数据对象中分解出需要的数据
            info = mypicobj.picInfo;
            pictureBox1.Image = mypicobj.pic;

            if (Clipboard.ContainsData(DataFormats.UnicodeText) == false)//根据指定的DataFormat获取数据对象
                return;
            string str = clipobj.GetData(DataFormats.UnicodeText) as string;
            MessageBox.Show(str);
        }

        private void btnPasteFromClipboard_Click(object sender, EventArgs e)
        {
            PasteFromClipboard();
        }
    }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值