可在 Visual Basic 应用程序中添加的最强大、最有用的功能之一就是在控件和控件之间、在控件和其它 Windows 应用程序之间拖动文本和图形。有了 OLE,就可将这种功能引入到应用程序中。
使用 OLE 拖放时,并不是把一个控件拖动到另一个控件并调用代码(象本章前面讨论的拖放一样);而是将数据从一个控件或应用程序移动到另一个控件或应用程序。例如,您可以选择并拖动
Excel 中的一个单元范围,然后将它们放到应用程序的 DataGrid 控件上。
Visual Basic 的几乎所有控件都在某种程度上支持 OLE 拖放。此外,一些标准的和 ActiveX 控件(由 Visual Basic 专业版和企业版提供的)还提供对 OLE 拖放的自动支持,这意味着控件支持在 OLEDragMode 和 OLEDropMode 属性中的自动设置,并且无论是从控件拖出还是在控件内放入都不需要编写代码。这一点与手动拖放相反,在手动拖放中,您必须为拖放编程:
有些支持自动 OLEDragMode 和 OLEDropMode 的控件包括 PictureBox、Label、以及 TextBox 控件。为对这些控件启动自动 OLE 拖放,应将 OLEDragMode 和 OLEDropMode 都设置为“自动化”。
有些控件支持自动 OLE 拖动,但只支持手动放下,有些支持自动放下,但只支持手动拖动。例如,ComboBox 控件支持手动和自动拖动,但不支持自动放下。这是由于如果您将一个项目拖动到 ComboBox 中,Visual Basic 无法知道将新项目放下的确切位置。然而,可以使用手动放下
,这样您就可以将项目程序化的放在您希望在 ComboBox 中的位置了。要启动这些控件的自动拖动,应将 OLEDragMode 属性设置为“自动化”。
有些控件只支持手动 OLE 拖放事件,这意味着可用代码对它们进行编程,使之成为 OLE 拖放操作的源,也可使之成为 OLE 拖放操作的目标。
注意 为判断其它 ActiveX 控件是否支持 OLE 拖放,应在 Visual Basic 中加载控件并检查 OLEDragMode 和 OLEDropMode 属性是否存在,或检查 OLEDrag 方法是否存在。(不自动支持 OLE 拖动的控件也将不具有 OLEDragMode 属性,但是,如果控件通过代码支持 OLE 拖动,则其具有 OLEDrag 方法。)
注意 窗体、MDI 窗体、文档对象、用户控件和属性页都包含 OLEDropMode 属性,而且仅支持手工拖放。
可用下列 OLE 拖放属性、事件和方法指定已知控件响应拖放的方式。
类别 | 项目 | 描述 |
属性 | OLEDragMode | 启动控件的自动拖动或手工拖动(若控件支持手工拖动但不支持自动 OLE 拖动,则它不具有此属性,但支持 OLEDrag 方法和 OLE 拖放事件)。 |
OLEDropMode | 指定控件如何响应放操作。 | |
事件 | OLEDragDrop | 识别源对象何时被放到控件上。 |
OLEDragOver | 识别源对象何时被拖动经过控件。 | |
OLEGiveFeedback | 以源对象为基础向用户提供自定义拖动图标反馈。 | |
OLEStartDrag | 在启动拖动时,源支持哪种数据格式和放效果(复制、移动或拒绝数据)。 | |
OLESetData | 在放源对象时提供数据。 | |
OLECompleteDrag | 当把对象放到目标时通知被执行的操作的源。 | |
方法 | OLEDrag | 启动手工拖动。 |
将 OLE 拖放设想成自动实现或手工实现,这是非常有用的想法。
举例来说自动拖放意味着,只需直接把文本框控件的 OLEDragMode 和 OLEDropMode 属性设置为“自动化”,就可将文本从一个文本框控件拖动到另一个文本框控件:无须编写任何代码来响应 OLE 拖放事件。当把一列单元从 Excle 拖动到 Word 文档时,就已执行自动拖放操作了。自动拖动数据的工作可能会成为最好的、最简单的方法,这取决于已知的控件或应用程序如何支持 OLE 拖放以及拖动了什么类型的数据。
手工拖放意味已选择(或被迫使用)手工处理一个或若干 OLE 拖放事件。为进一步控制拖放过程的每步操作,为向用户提供自定义的视觉反馈,为创建自己的数据格式,在这些时候,手工实现 OLE 拖放可能是较好的方法。当控件不支持自动拖放时,手工实现是唯一选择。
定义 OLE 拖放操作的整体模型也是非常有用的。在拖放操作中,从对象中拖动数据,就算该对象为源。称放入数据的对象为目标。Visual Basic 提供属性、事件和方法,控制并响应那些影响源和目标的操作。能够辨别出源和目标是在不同的应用程序中还是在同一个应用程序甚至在同一个控件中,这是很有用的。根据具体情况的不同,可能需要为源或目标或同时为两者编写代码。