C#拖放
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
拖放操作当然并非只限于文字,有许多应用程序都会提供拖放图片的功能,以便提升操作的便利性。事实上不管是拖放哪一种类型的数据,其间的方法都没有太大的差异。
程序范例CH8_DemoForm012.cs示范如何在两个PictureBox控件间拖曳图片,其功能特性如下所示:
∙如图8.13所示,您可以使用拖放方式将左侧PictureBox控件中的图片移动至右侧的PictureBox控件中,反之亦然;即左右两个PictureBox控件都可以作为拖放来源与置放目标。
∙值得一提的是,如果您持续按Ctrl键,则可以使用拖放方式将左侧PictureBox控件中的图片复制到右侧的PictureBox控件中(如图8.14所示),反之亦然;即左右两个PictureBox控件都可以作为拖放来源与置放目标。
图8.13通过拖放操作来移动图片
图8.14通过拖放操作来复制图片
程序范例CH8_DemoForm012.cs在拖放操作方面的程序代码如下所示:// 声明一个常量以便侦测在拖曳期间 Ctrl 键是否被按下。
const byte CtrlMask = 8;
private void CH4_DemoForm065_Load(object sender, EventArgs e)
{
// 由于目前无法在设计工具中去设定 PictureBox 控件
// 的 AllowDrop 属性,所以必须通过程序代码来加以设定。
picLeft.AllowDrop = true;
picRight.AllowDrop = true;
}
// 处理左右两个 PictureBox 控件的 MouseDown 事件。
// 当鼠标指针位于控件的范围内而且鼠标按键被按下时便会引发此事件。private void PictureBox_MouseDown(System.Object sender,
System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
PictureBox pic = (PictureBox)(sender);
//初始化拖放操作。
if (pic.Image != null)
{
pic.DoDragDrop(pic.Image,
DragDropEffects.Move | DragDropEffects.Copy);
}
}
}
// 处理左右两个 PictureBox 控件的 DragEnter 事件。
// 当某一个对象被拖曳至控件的范围内时就会引发该控件的 DragEnter 事件。private void PictureBox_DragEnter(System.Object sender,
System.Windows.Forms.DragEventArgs e)
{
// 检查被拖曳资料的类型是否适用于目标控件。如果不适用,则拒绝置放。
if (e.Data.GetDataPresent(DataFormats.Bitmap))
{
// 如果在拖曳期间按 Ctrl 键,则执行复制操作;反之,则执行移动操作。
if ((e.KeyState & CtrlMask) == CtrlMask)
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.Move;
}
}
else
{
e.Effect = DragDropEffects.None;
}
}
// 处理左右两个 PictureBox 控件的 DragDrop 事件。其实只要转换发送者(s ender)然后检查 Name 属性以便确认哪一个 PictureBox 控件要移除影像,就可以使用同一个事件处理函数来处理两个 PictureBox控件的 DragDrop 事件。
private void PictureBox_DragDrop(System.Object sender,
System.Windows.Forms.DragEventArgs e)
{
PictureBox pic = (PictureBox)(sender);
pic.Image = (Bitmap)(e.Data.GetData(DataFormats.Bitmap));
// 如果 Ctrl 键没有被按下的话,就使另外一个 PictureBox 控件(也就是在DragDrop 事件中并不是 sender 的那一个 PictureBox 控件)中的图像被移除。
if ((e.KeyState & CtrlMask) != CtrlMask)
{
if ( == "picLeft")
{
picRight.Image = null;
}
else
{
picLeft.Image = null;
}
}
}
前面这两个关于文字与图片的拖放操作范例都是在同一个窗体上的两个控件间进行,其实它们也可在同一个应用程序的不同窗体上的控件间拖放。下一个程序
范例将示范如何接受从另一个应用程序拖放而来的项目,在此程序范例中,将接受从Windows资源管理器拖放而来的文件。
拖放文件
在Windows资源管理器中使用拖放操作来移动或复制文件是大家所惯用的方式。Windows资源管理器充分支持拖放操作,而且这也是非常多用户所偏爱的文件使用方式。此外,许多用户非常习惯直接从Windows资源管理器将文件拖放至对应的应用程序中来打开它们。例如,从Windows资源管理器将一个.doc 文档拖放至Microsoft Word即会将该文档在Microsoft Word中打开。
图8.15示范如何从Windows资源管理器中拖放文件
图8.15所示是程序范例CH8_DemoForm013.cs的运行画面。显而易见地,您可以从Windows资源管理器将一个或多个文件拖放至窗体上的ListBox控件中,而被