现在的位置: 首页 > 综合 > 正文

简单qq表情浏览器开发记事 <上> c# PictureBox 中 拖拽 gif 图片,可拖入qq聊天框的实现

2012年11月15日 ⁄ 综合 ⁄ 共 2702字 ⁄ 字号 评论关闭
  • 前言

上次兴起,写了篇文章,许久再无所出...

整理电脑时发现过往的学习时编写的工程,兴起决定拿出来分享,曾经的学生作品,见怪不怪~~、

文章部分是以前写的...懒了就拷贝一下

简单qq表情浏览器

功能:简单浏览一个文件夹下面的图片,图片可以拖拽

实现透明窗体,分页,图片位置变换等功能

软件截图:

  • 起因:

Winform老师有令:做一个图片浏览器。小的得令勒~~

发现做jpg的图片浏览简单容易,所以马上想到了平时用到的拖拽功能。

可是,刚刚开始就遇见了一个问题,gif格式操作问题。

然后张罗旗鼓的baidu,google。

上网剽窃一通,收获无多!

关于gif的内容比较少,那就自己研究呗!

自己动手,丰衣食足!

这里贴出小教程,希望能弥补一些空白!

  1. 预览:

 

下面是该工程的一个PictureBox

笑的挺猥琐的家伙~~

开发环境:vs2008,win7

使用继承控件:PictureBoxAllowDrop(继承自PictureBox)

继承原因:PictureBox中不显示AllowDrop属性,控件要使用“拖拽”必须设为ture
代码:拷贝自网上前辈,最好添加新建项写入一个单独的类成为一个继承控件类
然后拉入一个pictureBox1,在Windows 窗体设计器生成的代码InitializeComponent()改为pictureBoxAllowDrop1。
如:this.pictureBoxAllowDrop1 = new PictureBoxAllowDrop();

public class PictureBoxAllowDrop : PictureBox
{
    private bool pic_yes = true;//默认已经为打开

    public override bool AllowDrop
    {
        get { return pic_yes; }
        set { pic_yes = value; }
    }
}

小贴士:关于AllowDrop这个属性,有一个郁闷的地方,在Form1_Load事件中进行设置,开始我没设置默认为ture,所以不能拖入。郁闷忒久!原因不清。希望有好心人能告诉我。我猜测是重写后的问题!

  • 添加事件(应该是叫事件吧,呵呵,学艺不精):
this.pictureBoxAllowDrop1.DragDrop += new System.Windows.Forms.DragEventHandler(this.pictureBoxAllowDrop1_DragDrop); 
this.pictureBoxAllowDrop1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBoxAllowDrop1_MouseDown); 
this.pictureBoxAllowDrop1.DragEnter += new System.Windows.Forms.DragEventHandler(this.pictureBoxAllowDrop1_DragEnter); 

这里是用双击设计视图中事件窗体设计器自动生成。也可自己写代码添加。

事件代码:

  1. 首先,当鼠标经过图片框,且有拖动数据在鼠标上,那么发生这个事件。在这里我们可以添加判断。如果不是图片文件,就无法发生下一个“写入”事件。
private void pictureBoxAllowDrop1_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent("Bitmap"))
        e.Effect = DragDropEffects.Copy;
}

验证好数据,我们就要“写入”了。

以下代码上网学习而来。“安全性”不高,不一定是标准代码哦。不过我会继续学习研究的。

private void pictureBoxAllowDrop1_DragDrop(object sender, DragEventArgs e)
{
    string[] fileName;
    fileName = e.Data.GetData("FileNameW") as string[];
    MessageBox.Show(fileName[0]);
    if (fileName != null && fileName.Length > 0)
    {
        using (System.IO.StreamReader sr = System.IO.File.OpenText(fileName[0]))
        {
            pictureBoxAllowDrop1.Image = Image.FromFile(fileName[0]);
        }
        pictureBoxAllowDrop1.Tag = fileName;//把拖入的文件集合地址写入Tag 
    }
}


好,但你写上这两个事件,那么你可以试试从qq对话框中拖入gif格式的图片了。当然,jpg也不在话下了。

但这个不是我们的最终目的!

拖出代码:

private void pictureBoxAllowDrop1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left && pictureBoxAllowDrop1.Image != null)
    {
        string[] path = (string[])pictureBoxAllowDrop1.Tag;
        DataObject data = new DataObject(DataFormats.FileDrop, path);
        data.SetData(DataFormats.Bitmap, path[0]);
        pictureBoxAllowDrop1.DoDragDrop(data, DragDropEffects.Copy);
    }
} 

写上这个,我们的图片框就能将拖入的gif格式的表情拖会qq聊天框了!


其实关键的就简单的两句:

            DataObject data = new DataObject(DataFormats.FileDrop, path);

            data.SetData(DataFormats.Bitmap, path[0]);

反反复复的错了几十次!

但错误编程了一种习惯,习惯到我不该怎么办~~~耶~耶~耶

所以又反反复复百度,学习,查资料!

其实,我最想说是:把基础学好,把对象搞好(是面向对象学好,不是那个啥~~)

把类型,类型转化学好,就可以避免一下低级的错误!

这是这次学习最珍贵的感悟!

还有,就是坚持走在错误路线上,测试失败是一种收获!

错误路线的尽头就是正确,沿途的风景让你成长更多!

学习ing...

以上大部分完成于2010年05月06日,这里算完成了核心代码

抱歉!评论已关闭.