




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
4.16.1 示例演示执行该示例的步骤如下。 打开“任务窗格管理器”窗口,依次单击“控件”“列表框”“Treeview/列表框拖放”,打开图4-42所示的Listdd.scx表单。表单中左边的两个列表演示了在ActiveX控件Treeview之间的拖放实现方法,右边两个列表演示的是在Visual FoxPro列表框控件之间通过OLE模式实现拖放的方法。 在OLE拖放操作中,可以选择复制或移动数据。要移动数据,可以直接按住鼠标左键,拖动数据到放落目标上即可;要复制数据,需要按住鼠标左键的同时按住Ctrl键,拖动数据到放落目标上即可,此时鼠标指针下方将出现一个“+”形状。图4-43所示是移动拖放和复制拖放时鼠标指针的形状。 如果按住鼠标右键拖放数据到放落目标,则显示一个快捷菜单,询问是复制数据还是移动数据,如图4-44所示。图4-42 Listdd.scx表单图4-43 拖放操作图4-44 按住鼠标右键拖放数据4.16.2 OLE拖放模式Visual FoxPro支持控件的两种OLE拖放模式:固有模式和人工模式。在固有模式中,由Visual FoxPro处理OLE拖放操作;而在人工模式中,可通过编程来处理OLE拖放操作。1固有OLE拖放模式固有OLE拖放模式可以提供标准的OLE拖放支持,而无须另外编程。要使用固有OLE拖放支持,需要将拖动源控件的OLEDragMode属性设置为1(自动),并将放落目标控件的OLEDropMode属性设置为1(启用)。 对于固有OLE拖放操作,Visual FoxPro确定放落目标是否支持将要放落在上面的数据格式。如果放落目标支持该格式,则可以放落,否则不允许放落。表4-17列出了在固有模式下可以作为拖动源的Visual FoxPro控件及所支持的数据格式。其中的CF_TEXT是文本,就像在文本框中输入的文本,而CFSTR_VFPSOURCEOBJECT是对Visual FoxPro控件或对象的引用。对于支持CF_TEXT数据格式的控件,可以从控件的文本部分拖动文本。表4-17 拖动源的数据格式控件数据格式(在FoxPro.h文件中定义)容器、图像、线条、页框和形状CFSTR_VFPSOURCEOBJECT命令按钮和标签CFSTR_VFPSOURCEOBJECT和CF_TEXT复选框、组合框、编辑框、列表框、微调控件和文本框CFSTR_VFPSOURCEOBJECT、CF_TEXT和CFSTR_OLEVARIANT表4-18列出了在固有模式中可以作为放落目标的Visual FoxPro控件及所支持的数据格式。对于下表中列出的控件,可以向控件的文本部分放落文本,文本将在插入点插入。表4-18 放落目标的数据格式控件数据格式编辑框和组合框(当组合框的Style属性设置为0-下拉组合框)CF_TEXT微调控件和文本框CFSTR_OLEVARIANT2人工OLE拖放模式有时,可能需要控制放落目标上能够放落的数据类型,或者需要为拖放操作提供附加功能。如将数据转换成放落目标所支持的格式,或者显示一个对话框,询问用户是否确认将数据放落到目标上等。在这些情况下,就需要使用人工方式处理拖放操作,来提供更好的功能控制。为了实现对控件的人工OLE拖放支持,需要编写事件或方法程序的代码,来覆盖需要进行控制的拖放事件或方法程序。在事件或方法程序代码中包含NODEFAULT关键字,可以覆盖固有的Visual FoxPro拖放行为。4.16.3 DataObject对象DataObject对象为控件提供了编程方式的OLE拖放支持。DataObject对象是一个数据容器,该容器内的数据从OLE拖动源转移到OLE放落目标,并且该对象只在OLE拖放操作过程中存在,而不能通过编程来创建DataObject对象,当OLE拖放操作结束后,对它的引用将无效。在OLEStartDrag、OLEDragOver、OLEDragDrop和OLESetData事件中,DataObject通过oDataObject参数进行传递。DataObject可以保存多组数据,每组数据可以有不同的格式。可使用GetFormat方法确定DataObject中数据存在的格式。使用DataObject对象的方法程序可以通过编程来管理拖放的数据,下面将简单介绍这些方法。1ClearData方法该方法用于从OLE拖放DataObject对象中清除所有的数据和数据格式,该方法只能在OLEStartDrag事件中执行。2GetData方法该方法用于从OLE拖放DataObject对象获取数据,语法格式如下:oDataObject.GetData(nFormat | cFormat , ArrayName)nFormat | cFormat,指定要获取数据的格式。表4-19列出了每种数据格式的值和说明。表4-19 DataObject对象支持的数据格式数据格式(在FoxPro.h中定义)nFormat|cFormat说明CF_TEXT1文本格式CF_OEMTEXT7包含OEM字符集中字符的文本格式CF_UNICODETEXT13Unicode文本格式,只在Windows NT 4.0和以后版本中可用 CF_FILES或CF_HDROP15一个标识一组文件的句柄,例如从Windows资源管理器拖来的一组文件CF_LOCALE16与剪贴板上文本相关的本地标识符的句柄CFSTR_OLEVARIANTARRAYOLE Variant Array一个Visual FoxPro数组。使用这个格式在一次拖放中可以传送多个值。例如,这个格式可以用于将列表框中的一些项拖动到另一个列表框中CFSTR_OLEVARIANTOLE Variant一个Visual FoxPro变量。Visual FoxPro中的所有数据类型都可以用变量代表。这个格式可以用于拖放Visual FoxPro数据,并且不丢失数据类型CFSTR_VFPSOURCEOBJECTVFP SourceObject对一个Visual FoxPro对象的引用ArrayName,指定一个数组的名称,用于传递多个值。由表4-19可以看出,能够包含多个值的数据格式只有CF_FILES、CF_HDROP和CFSTR_OLEVARIANTARRAY。例如,可以从Windows资源管理器中将一组文件拖动到Visual FoxPro的一个列表框中。在列表框的OLEDragDrop事件中,通过GetData方法可以得到一个存放这些文件名称的数组,然后在FOR.ENDFOR循环中使用AddItem方法将数组中的内容添加到列表框中。在GetData方法中指定数组名称时,该数组必须存在。如果该数组存在,但是不足以包含所需的数据,Visual FoxPro自动增加该数组的大小。如果数组超过了需要的长度,Visual FoxPro会截断该数组。GetData方法返回的值取决于nFormat或cFormat指定的数据格式。如果DataObject不包含nFormat或cFormat指定格式的数据,则返回.F.。如果数据符合多值格式,如CF_FILES、CF_HDROP或CFSTR_OLEVARIANTARRAY,则返回.T.。如果数据符合单值格式时,如CF_TEXT、CFSTR_OLEVARIANT或CFSTR_VFPSOURCEOBJECT,则返回DataObject中的值。如果使用nFormat或cFormat指定的数据格式存在,但是在DataObject中没有这种格式的数据,则触发一个拖动源的OLESetData事件(在使用SetData方法将相应数据放在DataObject中之前,可以使用SetFormat方法指定一种数据格式)。3GetFormat方法该方法确定在OLE拖放DataObject中指定格式的数据是否可用,语法格式如下:oDataObject.GetFormat(nFormat|cFormat)nFormat|cFormat,指定要获取数据的格式,可获取的格式是表4-19中除CF_LOCALE之外的所有格式。如果DataObject包含nFormat或cFormat指定格式的数据,则该方法返回.T.,否则返回.F.。4SetData方法该方法将数据放在OLE拖放DataObject中,语法格式如下:oDataObject.SetData(eData , nFormat | cFormat)eData,指定放在DataObject中的数据。如果省略可选的nFormat和cFormat参数,Visual FoxPro按CF_TEXT和CFSTR_OLEVARIANT格式将数据放在DataObject中。如果eData是一个数组,需要在eData前面加一个“”记号。数组是按CFSTR_OLEVARIANTARRAY格式放在DataObject中的。如果eData是一个对象引用或通用字段,或者是包含对象引用的数组,则会产生一条错误信息。nFormat | cFormat,指定放在DataObject中的数据的格式,可用格式见表4-19。使用cFormat也可以指定自定义格式,这时eData必须是使用CREATEBINARY( )创建的字符型或二进制型。注意,SetData方法只能在OLEStartDrag事件中执行。5SetFormat方法该方法指定OLE拖放DataObject的数据格式,语法格式如下:oDataObject.SetFormat(nFormat | cFormat)nFormat | cFormat,指定DataObject的数据格式,可用格式是表4-19中除CF_LOCALE之外的所有格式。可以在向DataObject中放置数据之前,首先放置数据格式。如果在DataObject中放置了数据格式,而不包含相应的数据,并且在OLEDragDrop事件中激活了SetData方法,则拖动源发生OLESetData事件。然后,拖动源在OLESetData事件中使用SetData方法将数据放在DataObject中。SetFormat方法只能在OLEStartDrag和OLESetData事件中执行。4.16.4 拖放数据在拖放数据时,需要处理拖动源和放落目标两方面的事件过程。1拖动源处理(1)OLEDragMode属性该属性指定拖动源管理OLE拖动操作的方式,在设计和运行时可用。如果属性值为0(默认值),表示使用人工方式。当试图拖动数据时,Visual FoxPro不开始OLE拖动操作。要开始OLE拖动操作,必须调用OLEDrag方法。如果属性值为1,表示使用自动方式。当试图拖动数据时,Visual FoxPro自动开始OLE拖动操作。(2)OLEDragPicture属性该属性指定在OLE拖放操作过程中,在鼠标指针下显示的图片。可以是.bmp、.dib、.jpg、.gif、.ani、.cur和.ico等为后缀的图像文件类型。(3)OLEDrag方法该方法用于开始一次OLE拖放操作。语法格式如下:PROCEDURE Object.OLEDragLPARAMETERS lDetectDraglDetectDrag指定何时发生OLEStartDrag事件。如果lDetectDrag为.T.(默认值),则立即发生OLEStartDrag事件。如果lDetectDrag为.F.,则当用户按住鼠标一段时间之后,或者按住鼠标并移动了一段距离之后,才发生OLEStartDrag事件。(4)OLEStartDrag事件该事件在调用OLEDrag方法后立即发生。语法格式如下:PROCEDURE Object.OLEStartDragLPARAMETERS oDataObject, nEffectoDataObject提供对OLE拖放DataObject对象的引用。nEffect指定拖动源支持的OLE拖动操作。表4-20列出了nEffect的值和每种动作的说明。nEffect是一个输出参数,并且在事件的入口设置为3,所以应该在本事件中提供nEffect的值。例如,如果只允许复制操作,可将nEffect设置为1(DROPEFFECT_COPY)。表4-20 nEffect参数的可用值nEffectFoxpro.h常数说明0DROPEFFECT_NONE拖动源不支持任何拖动操作1DROPEFFECT_COPY拖动源支持复制操作2DROPEFFECT_MOVE拖动源支持移动操作(默认的)4DROPEFFECT_LINK拖动源支持链接操作一个拖动源可以支持多个拖动操作,只需将nEffect的多个值加在一起。例如,如果nEffect为3,则拖动源支持复制和移动拖动操作(3=1+ 2)。(5)OLESetData事件当放落目标调用GetData方法,并且没有指定格式的数据时,拖动源发生该事件。语法格式如下:PROCEDURE Object.OLESetDataLPARAMETERS oDataObject, eFormatoDataObject提供对OLE拖放DataObject对象的引用。eFormat用于指定所需数据的格式,见表4-19。(6)OLEGiveFeedback事件在每次OLEDragOver事件之后发生,允许拖动源指定OLE拖放操作的种类以及可视反馈。该事件的语法格式如下:PROCEDURE Object.OLEGiveFeedbackLPARAMETERS nEffect, eMouseCursornEffect指定当数据放落到目标上时所进行的操作,见表4-20。eMouseCursor指定在OLE拖放操作过程中所显示的鼠标指针,可以是一个字符或数值。如果eMouseCursor是一个字符值,则该字符值应当是.ani、.cur或.ico等为后缀的图像文件名称。如果eMouseCursor是一个数值,则该值指定了所显示的鼠标指针。(7)OLECompleteDrag事件该事件在数据放落到目标上,或取消了OLE拖放操作时发生,语法格式如下:PROCEDURE Object.OLECompleteDragLPARAMETERS nEffectnEffect是从OLEDragDrop事件传递的值,对应于当数据放落到目标上时采取的动作。见表4-20中的说明。2放落目标处理(1)OLEDropMode属性该属性指定放落目标如何管理OLE放落操作,可用的放落模式如表4-21所示。表4-21 放落模式属性值Foxpro.h常数说明0DROP_DISABLED禁止(默认值)。数据不能放落到控件或对象上,并且不发生放落目标事件。当鼠标指针位于控件或对象上时,显示不准放落鼠标指针 1DROP_ENABLED启用。Visual FoxPro允许将数据放落到控件或对象上,并且发生放落目标事件2DROP_PASSTOCONTAINER传递到容器。控件或对象就像禁止了OLE放落操作一样,并且数据被放落到控件或对象的容器中。为了接受数据,容器的OLEDropMode属性必须设置为1或2。如果容器的OLEDropMode属性设置为0,则显示不准放落鼠标指针 如果一个控件或对象的Enabled属性设置为.F.,则不能将数据放落到该控件或对象上。(2)OLEDropEffects属性指定一个OLE放落目标所支持的放落操作类型,表4-22列出了可用的操作类型。表4-22 放落操作类型属性值Foxpro.h常数说明0DROPEFFECT_NONE放落目标不接受数据1DROPEFFECT_COPY数据可以复制到放落目标中2DROPEFFECT_MOVE数据可以移动到放落目标中4DROPEFFECT_LINK数据可以链接到放落目标一次放落可以支持多种放落操作,例如,如果属性值为3,则放落目标支持复制和移动放落操作。 OLEDropEffects是一个放落目标属性,应该在OLEDragOver事件中设置。(3)OLEDropHasData属性指定如何管理放落操作,该属性在设计时只读。OLEDropHasData是一个放落目标属性,且应该在OLEDragOver事件中设置。在OLEDragOver事件中使用DataObject的GetFormat方法,可以判断DataObject是否包含适合于放落目标的数据格式的数据。如果数据符合放落目标的数据格式,则将OLEDropHasData置为1。表4-23列出了该属性的可用值。表4-23 OLEDropHasData属性的可用值属性值Foxpro.h常数说明1DROPHASDATA_VFPDETERMINE默认值。Visual FoxPro自动确定DataObject是否包含可以放落到目标上的数据格式的数据。如果DataObject包含的数据格式适于放落目标,则该数据就放落到目标上。Visual FoxPro管理鼠标指针,并且通知拖动源。如果DataObject包含的数据的格式不适于放落目标,则VisualFoxPro显示不准放落的鼠标指针,取消这次放落操作,并且通知拖动源这次放落操作被取消了 0DROPHASDATA_NOTUSEFULDataObject不包含可以放落到目标上的数据格式的数据,并且显示不准放落的鼠标指针1DROPHASDATA_USEFULDataObject包含可以放落到目标上的数据格式的数据。(4)OLEDragOver事件当数据被拖动到一个放落目标上,并且放落目标的OLEDropMode属性设置为1时发生该事件。语法格式如下:PROCEDURE Object.OLEDragOverLPARAMETERS oDataObject, nEffect, nButton, nShift, nXCoord, nYCoord, nStateoDataObject,对OLE拖放DataObject的对象引用。nEffect,传递给OLEGiveFeedback事件的一个值,表明当数据放落到目标上时采取的动作。该参数的可用值见表4-22。nButton,包含一个数字,该数字指定了为将数据放落到目标上,放开了哪个鼠标键:1(左键)、2(右键)或4(中间键)。nShift,包含一个数字,该数字指定了将数据放落到目标上时辅助键的状态:1(SHIFT)、2(CTRL)、4(ALT)。如果按住了多个辅助键,则nShift参数包含这些辅助键的值的和。nXCoord, nYCoord,鼠标指针在表单中的水平和垂直位置,表单的ScaleMode属性指定了度量单位。nState,包含一个数值,该数值指定了数据被拖动的方向。如果该值为0,表示数据被拖动到控件或对象中,这时可以设置OLEDropEffects和OLEDropHasData属性;如果该值为1,表示数据被拖动到控件或对象的外部;如果该值为2,表示数据被拖动到控件或对象的内部。(5)OLEDragDrop事件当数据放落到目标上,并且放落目标的OLEDropMode属性设置为1时发生。语法格式如下:PROCEDURE Object.OLEDragDropLPARAMETERS oDataObject, nEffect, nButton, nShift, nXCoord, nYCoord参数说明与OLEDragOver事件相同。4.16.5 拖动源设计在介绍拖动源设计之前,首先来看一下本节示例表单的设计界面,如图4-45所示。图4-45 Listdd.scx的设计界面表单中的Treeview控件Olecontrol1是拖动源,其OLEDragMode属性被设置为1,表示在拖动时自动启用OLE拖放。表单中的List1列表框控件的拖动设计稍微复杂一些,OLEDragMode属性同样被设置为1。同时,为了能够拖动多行被选定的数据项,所以在拖动时首先建立一个CFSTR_OLEVARIANTARRAY格式的数据,以取代默认的CF_TEXT、CFSTR_OLEVARIANT或CFSTR_VFPSOURCEOBJECT格式,然后将数据放在OLE拖放DataObject中。从前面的介绍知道,这项工作只能在OLEStartDrag事件中完成。List1的OLEStartDrag事件代码如下:LPARAMETERS oDataObject, nEffectLOCAL aValues, i, nSelected*!* 建立一个包含当前选定数据项的数组nSelected = 0FOR i = 1 to This.ListCount *!* 如果项目被选定,则添加到数组中 IF This.Selected( i ) nSelected = nSelected + 1 DIMENSION aValues nSelected aValues nSelected = This.List( i ) ENDIFNEXT*!* 列表框的自动格式是CF_TEXT、CFSTR_OLEVARIANT和CFSTR_VFPSOURCEOBJECT,*!* 由于要拖放多行,所以需要存储数据为CFSTR_OLEVARIANTARRAY格式IF nSelected 0 oDataObject.SetData(aValues)ENDIF在List1的OLECompleteDrag事件中包含有下列代码,用于根据从放落目标的OLEDragDrop事件传递来的nEffect参数值,采取相应的动作。LPARAMETERS nEffectLOCAL i,oldExact*!* 如果执行了移动操作,从列表中移除项目IF nEffect = 2 &DROPEFFECT_MOVE IF EMPTY(THISFORM.aItems) RETURN ENDIF oldExact = SET(EXACT) SET EXACT ON FOR i = This.ListCount to 1 step -1 IF ASCAN(THISFORM.aItems,THIS.Listm.i)#0 This.RemoveItem(m.i) ENDIF NEXT SET EXACT &oldExactENDIF4.16.6 放落目标设计首先来看Treeview控件Olecontrol2的放落设计。该对象的OLEDropMode属性被设置为1,表示启用拖放操作。在该对象的OLEDragOver事件中包含有下列代码,用于判断在拖放时鼠标指针下的节点对象。* OLE Control Event *LPARAMETERS data, effect, button, shift, x, y, stateLOCAL oNodeoNode=this.Hittest(x/96*1440,y/96*1440) &通过鼠标指针坐标获得对象引用IF TYPE(oNode)=O AND !ISNULL(oNode) this.DropHighlight = oNode IF TYPE(this.DropHighlight.text)=C THISFORM.lblTview.Forecolor = RGB(0,0,0) THISFORM.lblTview.Caption = JUSTEXT(PROGRAM()+: +this.DropHighlight.text ENDIFENDIF在Olecontrol2的OLEDragDrop事件中包含有下列代码,用于将放落目标下节点的名称显示在lblTview.Caption属性中,并将lblTview.Forecolor设置为红色。* OLE Control Event *LPARAMETERS data, effect, button, shift, x, yLOCAL oNodeoNode=this.Hittest(x/96*1440,y/96*1440) &通过鼠标指针坐标获得对象引用IF TYPE(oNode)=O AND !ISNULL(oNode) this.DropHighlight = oNode THISFORM.lblTview.Forecolor = RGB(255,0,0) &设置lblTview标签的前景色为红色 THISFORM.lblTview.Caption = JUSTEXT(PROGRAM()+: +this.DropHighlight.textENDIF下面来看一下List2的放落设计。List2的OLEDropMode属性被设置为1,并且在List2的OLEDragOver事件中包含有下列代码,用于在拖放进入时,判断传递的数据是否为CFSTR_OLEVARIANTARRAY格式。如果是,则通过设置OLEDropHasData属性来接受数据。LPARAMETERS oDataObject, nEffect, nButton, nShift, nXCoord, nYCoord, nStateDO CASECASE nState = 0 &DRAG_ENTER *!* 如果Dataobject包含CFSTR_OLEVARIANTARRA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 八大浪费考试试题及答案
- 组织行为与变革管理案例分析试题及答案
- 2025年绿色建材研发中心项目绿色建材市场前景与投资建议报告
- 2025年环保行业环保设备与材料创新应用报告
- 2025年社区心理健康服务社区心理健康服务社区发展模式报告
- 2025至2030年中国3D网上购物行业市场全景调研及投资规划建议报告
- 解析卷-北师大版8年级数学上册期末试卷及答案详解(各地真题)
- 基础强化人教版8年级数学下册《平行四边形》定向攻克试题(含解析)
- 2025财税管理咨询合同范本大全专业服务保障
- 2025版幼儿园外籍教师聘用及教育服务合同
- 电池火灾安全知识培训课件
- 2025年CAD机械制图考试题库及答案
- 云南省澜沧拉祜族自治县2025年上半年事业单位公开招聘教师岗试题含答案分析
- 2024广西公需课高质量共建“一带一路”谱写人类命运共同体新篇章答案
- 完整的离婚协议书打印电子版(2025年版)
- 静脉输注药物临床合理应用与注意事项课件
- 屈光不正处方案例分析课件
- 2021年秋期新人教版部编本六年级语文上册教材解读
- 标准化考核办法
- 高处吊篮使用审批表
- (本科)生产与运作管理第三章教学课件
评论
0/150
提交评论