`
izuoyan
  • 浏览: 9219097 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C# 拖放操作源码详解一

阅读更多
出处:http://hi.baidu.com/skynomadism/blog/item/fbffbe1c4a53728f87d6b6e7.html

就操作习惯而言,我们可以将Windows应用程序的用户分为两大类,第一类是偏好使用键盘的用户,第二类是偏好使用鼠标的用户。众多的实践经验让程序设计师充分了解到,务必提供热键(会显示出下划线的快速字符键)与快捷键(例如:Ctrl+某字符的组合按键)给大量运用键盘的用户,但是却反而常常忽略鼠标用户的需求。由于程序设计师本身就比较倾向于键盘用户,因此特别强调键盘导向的功能是可以理解的,但是每一位程序设计师也应该好好顾及鼠标的完整支持才是。

其实鼠标用户所最期盼的就是对拖放操作的充分支持。仔细端详大多数的Windows应用软件或Windows操作系统本身,我们会发现拖放能力是无处不在的。举例来说,用户早已非常习惯在Windows资源管理器中拖曳和置放文件,并且在Microsoft Word中拖曳和置放文字。

令人遗憾的是,只有极少数的Visual C#程序设计师会在他们所开发的应用程序中提供完善的拖放功能,当然,造成此现象的原因之一,就是要实现拖放功能确实有其困难度与复杂度。本节将让您知道要利用Visual C# 2003~2005以后的版本来实拖现放功能是多么简单的一件事情。我们将实际展现如何在窗体内、在窗体之间,以及在应用程序之间移动和复制文字、图片以及文件。

拖放操作是如何运作的

拖放操作其实与剪切与粘贴(或复制与粘贴)没有什么不同,只不过它是使用鼠标而不是使用键盘。在这两类操作中,您都会拥有一个来源(也就是您剪切或复制的对象)以及一个目标(也就是您所粘贴之处)。不论是哪一种操作,在操作期间,都会在内存中存在数据的一份副本。剪切与粘贴会使用到剪贴板,而拖放则会使用到一个DataObject对象,其实DataObject对象就好比是一个私有剪贴板。

在一个典型的拖放操作中,将会依序引发下列事件:

1.您可以通过调用源控件的DoDragDrop方法来初始化拖曳操作。DoDragDrop方法的语法如下所示:

DragDropEffects DoDragDrop(

Object data,

DragDropEffects allowedEffects)DoDragDrop方法会接受下列两个参数:

  • data参数用来指定所要拖曳(传递)的数据。
  • allowedEffects参数用来指定哪些操作(“复制”和/或“移动”)是被允许的。

一个新的DataObject对象会自动被创建。

2.接下来会引发源控件的GiveFeedback事件。在大多数的情况下,您并不需要去处理GiveFeedback事件,但是如果您想在拖曳期间显示一个自定义的鼠标指针,则可以在GiveFeedback事件处理函数中编写程序代码来完成此项设定。

3.AllowDrop属性被设定成True的任何控件都可以是置放目标。您可以在设计阶段在“属性”窗口中将要作为目标控件的AllowDrop属性设定成True,或者是于运行阶段在窗体的Load事件处理函数中将要作为目标控件的AllowDrop属性设定成True。

4.当您将鼠标指针移至任何一个控件的上方时,便会引发该控件的DragEnter事件。我们通常会在目标控件的DragEnter事件处理函数中,使用GetDataPresent方法去检测所拖曳的数据格式是否适用于目标控件,并使用DragEventArgs类型参数的Effect属性来设定所允许的置放操作。

5.如果用户在一个有效的置放目标上放开鼠标按键,将会引发目标控件的DragDrop事件。我们通常会在目标控件的DragDrop事件处理函数中编写程序代码,从DataObject对象撷取数据并将其显示于目标控件中。

关于拖放操作,您还必须注意下列事项:

  • 某些控件具有自定义的特定拖曳事件。例如,ListView与TreeView控件就拥有ItemDrag事件。
  • 当一项拖曳操作正在执行的时候,您可以处理QueryContinueDrag事件,该事件会向系统“要求使用权限”来继续执行拖曳操作。当以该方法处理的时候,也是一种对调用那些对拖曳操作有影响的方法非常恰当的时机。比方说,当鼠标指针停留在TreeView控件上方的时候展开一个TreeNode。
  • 您也可以定义您自己的DataFormats。做法非常简单,您只需将您的对象指定为SetData方法中的Object参数,同时请确定所指定的对象是可序列化的。
  • 除此之外,您还可以使用KeyState属性,以便根据拖放操作期间所按下的按键来产生特定效果。举例来说,当Ctrl键被按下时所拖曳的数据通常要进行复制。

拖曳文字

拖曳操作最简单的实现就是将某一个TextBox控件中的文字移动或复制到另一个TextBox控件中。当然,您也可以使用复制或剪切以及粘贴操作在两个TextBox控件间复制或移动数据,然而使用拖放操作来完成此类操作绝对会更有效率。

程序范例CH8_DemoForm011.cs示范如何在两个TextBox控件间拖曳文字,其功能特性如下所示:图8.10示范如何拖曳文字

  • 如图8.10所示,由于右侧上方TextBox控件的AllowDrop属性被设定成False,因此您无法从左侧的TextBox控件中将文字拖放其中。
  • 如图8.11所示,由于右侧下方之TextBox控件的AllowDrop属性被设定成True,因此您可以使用拖放方式将左侧TextBox控件中的文字移动至右侧下方的TextBox控件中。
  • 值得一提的是,如果您持续按Ctrl键,则可以使用拖放方式将左侧TextBox控件的文字复制到右侧下方的TextBox控件中(如图8.12所示)。

图8.11通过拖放操作来移动文字

图8.12通过拖放操作来复制文字

程序范例CH8_DemoForm011.cs在拖放操作方面的程序代码如下所示:

// 声明一个常量以便调试在拖曳期间Ctrl键是否被按下。

const byte CtrlMask = 8;



// 替左侧的 TextBox 控件处理 MouseDown 事件。

// 当用户在此控件的范围内按下鼠标按键时便会引发此事件。

private void txtLeft_MouseDown(object sender, MouseEventArgs e)

...{

// 如果用户按下鼠标左键。

if (e.Button == System.Windows.Forms.MouseButtons.Left)

...{

// 选取文本框中所有的文字。

txtLeft.SelectAll();



// 初始化拖放操作。

txtLeft.DoDragDrop(

txtLeft.SelectedText,

DragDropEffects.Move
| DragDropEffects.Copy);

}


}




// 处理右侧下方 TextBox 控件的 DragEnter 事件。

// 当一个对象被拖曳至目标控件的范围内时,就会引发

// 目标控件的 DragEnter 事件。

private void txtLowerRight_DragEnter(object sender, DragEventArgs e)

...{

// 检查被拖曳的数据的类型是否适用于目标控件。如果不适用,则拒绝置放。

if (e.Data.GetDataPresent(DataFormats.Text))

...{

// 如果在拖曳期间按着 Ctrl 键,则执行复制操作;反之,则执行移动操作。

if ((e.KeyState & CtrlMask) == CtrlMask)

...{

e.Effect
= DragDropEffects.Copy;

}


else

...{

e.Effect
= DragDropEffects.Move;

}


}


else

...{

e.Effect
= DragDropEffects.None;

}


}




// 处理右侧下方 TextBox 控件的 DragDrop 事件。

// 当用户放开鼠标按键时就会引发此事件,并终止拖放操作。

private void txtLowerRight_DragDrop(object sender, DragEventArgs e)

...{

txtLowerRight.Text
= e.Data.GetData(

DataFormats.Text).ToString();



// 如果 Ctrl 键没有被按下,移除源文字以便营造出移动文字的效果。

if ((e.KeyState & CtrlMask) != CtrlMask)

...{

txtLeft.Text
= "";

}


}


从以上的程序代码可以看出,我们会在拖放源(也就是左侧的TextBox控件)的MouseDown事件处理函数中判断鼠标按键已经被按下,而且如果用户是按下鼠标左键的话,便会调用DoDragDrop 方法并传递下列两个参数给它以便初始化拖曳操作:

  • 我们使用TextBox控件中被选取的文字作为第一个参数(即data参数)的值,也就是TextBox控件中的文字将成为被拖曳的数据。
  • 我们将第二个参数(也就是allowedEffects参数)设定成DragDropEffects.Move Or DragDropEffects.Copy,以便允许用户移动或复制。

我们会于置放目标(也就是右侧下方的TextBox控件)的DragEnter事件处理函数中执行下列处理:

1.先使用GetDataPresent方法来检查被拖曳的数据是否为纯文字(DataFormats.Text)。如果不是纯文字的话,便将Effect属性设定成DragDropEffects.None表示置放目标不接受数据;如果是纯文字的话,则继续进行后续处理。

2.检查Ctrl键是否被按下。如果Ctrl键被按下的话,便将Effect属性设定成DragDropEffects.Copy,表示复制数据到置放目标中,此时鼠标指针将会显示成复制指针图标;如果Ctrl键没有被按下的话,便将Effect属性设定成DragDropEffects.Move,表示移动数据到置放目标中。

我们会于置放目标(也就是右侧下方的TextBox控件)的DragDrop事件处理函数中执行下列处理:

1.使用GetData方法从DataObject对象中提取被拖曳的文字并将它赋给置放目标。

2.判断Ctrl键是否被按下。如果Ctrl键没有被按下,表示要执行移动操作,此时会移除来源文字以便营造出移动文字的效果。

分享到:
评论

相关推荐

    C# 拖放操作源码详解

    在Windows资源管理器中使用拖放操作来移动或复制文件是大家所惯用的方式。Windows资源管理器充分支持拖放操作,...例如,从Windows资源管理器将一个.doc 文档拖放至Microsoft Word即会将该文档在Microsoft Word中打开。

    198个经典C#WinForm实例源码(超赞)

    《C# WinForm实例源码详解:198个经典案例》 在编程领域,C#语言以其强大的功能和易用性,成为了Windows桌面应用程序开发的首选。本资源集合了198个经典C# WinForm实例源码,涵盖了丰富的功能模块,为初学者和有...

    源码08 C# 记事本 C# 记事本

    【C# 记事本详解】 C# 记事本是一个使用C#编程语言实现的简单文本编辑器,类似于Windows操作系统中的“记事本”程序。这个项目旨在帮助初学者理解C#编程语言的基本概念,以及如何利用Windows Forms来创建桌面应用...

    图书馆管理系统 c# 源码

    1. **C#编程基础**:C#是一种面向对象的编程语言,由微软公司开发,广泛应用于Windows平台的应用程序开发。它的语法简洁清晰,支持类、接口、继承、多态等面向对象特性,使得代码结构清晰,易于维护。 2. **Windows...

    198个经典C#WinForm实例源码(超赞).zip

    《C# WinForm实例源码详解——198个经典案例》 在.NET框架中,C#语言与Windows Forms(WinForm)结合,为开发者提供了强大的桌面应用开发能力。本资料包“198个经典C# WinForm实例源码(超赞).zip”包含了丰富的实践...

    C#写的Cool时钟+闹钟源码

    《C#实现的Cool时钟与闹钟程序详解》 在编程世界中,C#是一种广泛应用的编程语言,尤其在Windows应用开发领域占据重要地位。本篇将详细探讨一个使用C#编写的桌面时钟程序,它以电子表的形式显示时间,并具备闹钟...

    Visual C# 2008控件使用范例详解

    《Visual C# 2008控件使用范例详解》这本书主要涵盖了在Visual Studio 2008环境下,使用C#语言开发Windows应用程序时,对各种控件的深入理解和应用。书中通过丰富的实例,详细讲解了控件的用法、属性、事件以及方法...

    c#学习源码

    1. **C#语言基础**:C#是微软开发的一种面向对象的编程语言,具有类型安全、垃圾回收、异常处理等特性。在本项目中,理解C#的基本语法、类、对象、接口、继承、多态等概念是至关重要的。 2. **.NET Framework**:这...

    使用C#写的飞鸽(便于理解将关键代码做了详细注释)

    1. **C#编程语言**:C#是一种面向对象的编程语言,由微软公司开发,广泛应用于Windows桌面应用、游戏开发、Web应用以及移动应用等领域。在这个项目中,C#用于构建用户界面和处理程序逻辑。 2. **WinForm**:WinForm...

    C#图书管理系统源码

    《C#图书管理系统源码详解》 在编程领域,C#是一种广泛应用的编程语言,尤其在Windows应用开发中,它的强大功能和易用性深受开发者喜爱。本篇将深入探讨一款基于C#编写的图书管理系统源码,通过分析源码,我们可以...

    C#计算器(含源码)

    《C#计算器开发详解》 在编程学习的过程中,模拟实现日常工具是常见的实践方式,而构建一个计算器程序无疑是其中的经典项目。本篇文章将基于提供的"C#计算器(含源码)"资源,深入探讨如何使用C#语言在Visual ...

    .net c# winform 围棋 Reversi 源码

    《.NET C# WinForm 围棋Reversi源码详解》 在.NET框架下,C#语言以其简洁明了的语法和强大的功能,成为Windows桌面应用开发的首选。本篇将深入探讨如何使用C#和WinForm技术来实现一个经典的棋类游戏——Reversi...

    c#抽奖系统源代码 简单易用

    【C# 抽奖系统源代码详解】 C#是一种面向对象的编程语言,由微软公司开发,广泛应用于Windows平台上的应用程序开发,包括桌面应用、Web应用以及移动应用等。在这个"简单易用的抽奖系统"中,C#的特性得到了充分的...

    c# 图书管理系统(源码+数据库).zip

    《C# 图书管理系统开发详解》 在信息技术领域,C#是一种广泛使用的编程语言,尤其在开发企业级应用方面有着显著的优势。本项目——“C# 图书管理系统”是基于VS(Visual Studio)开发环境,结合SQL Server数据库...

    C# 写的一款万年历,有源码,可以run

    【C# 万年历开发详解】 C#是一种面向对象的、类型安全的、现代的编程语言,由微软公司开发并广泛应用于Windows平台的应用程序开发,尤其是.NET框架下的应用程序。在本项目中,我们探讨的是一款用C#编写的万年历程序...

    C#看图软件,有源码,未完善

    【C#看图软件开发详解】 C#是一种高级编程语言,由微软公司开发,主要用于构建Windows平台的应用程序。在本项目中,我们讨论的是一个基于C#编写的看图软件,它提供了基本的图片查看功能,并且源码是开放的,意味着...

    C#随机点名系统(附源码)

    《C#随机点名系统详解》 在信息技术教学与管理中,点名是必不可少的一环。为了提高效率,减轻教师的工作负担,C#编程语言被用于开发了一款随机点名系统。这款系统不仅具备基本的点名功能,还融入了人性化的特性,如...

    C#拼图游戏+(附源码)

    《C#拼图游戏开发详解》 在编程领域,C#是一种广泛应用的编程语言,尤其在游戏开发中占据着重要地位。本篇文章将基于提供的"C#拼图游戏"项目源码,深入探讨C#在拼图游戏开发中的应用,帮助读者理解如何利用C#构建一...

    C#.WinForm学生管理系统.zip

    《C#.WinForm学生管理系统详解》 C#是一种面向对象的编程语言,由微软公司开发,主要用于构建Windows应用程序。在本系统中,我们利用C#的强大力量,结合WinForms(Windows Forms)库,创建了一个高效的学生管理系统...

    C#基于Smobiler的仓库管理系统.zip

    《C#基于Smobiler构建仓库管理系统详解》 在当今数字化时代,企业对高效、便捷的仓库管理系统的需求日益增长。本文将深入探讨如何利用C#编程语言与Smobiler框架来构建一个完整的仓库管理系统,旨在帮助企业提升仓储...

Global site tag (gtag.js) - Google Analytics