标题:OleDrag 和 OleDrop 的使用示例(从 Explorer 拖入文件到 VFP 程序,从 VFP ...
只看楼主
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
结帖率:66.67%
已结贴  问题点数:20 回复次数:4 
OleDrag 和 OleDrop 的使用示例(从 Explorer 拖入文件到 VFP 程序,从 VFP 程序拖出处理过的文件到 Explorer))
从梅子上看到阿明的FoxShell2014免费版,每次都要求点选加密文件,还要点选输出位置,觉着不太方便。故想在开放的DLL基础上写一款支持拖放的“懒人版”,实现直接将要加密的文件从Explorer拖入程序界面左边,将加密后的文件从程序界面右边拖出到Explorer保存。
OLEDRAG和OLEDROP,一直没有用过也没弄懂过,在网上亦未能查到相关文档,自已摸了一天,终有所获,现分享有兴趣的朋友。有误处望VFP大神指正,勿喷。

先说拖放源对象、释放目的对象适用的方法及属性(一个对象可以是来源也可以是目的,此处讨论单一拖动方向):

一、源对象方法属性:
OLECompleteDrag 事件 拖放时在目的对象上放开鼠标或中止拖放时触发
OLEDrag 方法 手工编程方式开始拖放操作
OLEDragPicture 属性 拖放过程中选用的光标形象(.bmp, .dib, .jpg, .gif, .ani, .cur, and .ico.)
OLEDragMode 属性 是否允许自动、手动、禁用拖放动作的处理
OLEGiveFeedBack 事件 每次OLEDragOver 事件后触发,允许源对象处理拖放操作的类型,并能可视化地回滚操作。
OLESetData 事件 目的对象调用GetData 方法时,被传递的DataObject对象中没有对应格式的数据时发生
OLEStartDrag 事件 OLEDrag 被调用时发生。

二、目的对象方法属性:
OLEDragDrop Event 目的对象的OLEDropMode 为 1 – Enabled时,拖放操作被释放在目的对象上时发生
OLEDragOver Event 目的对象的OLEDropMode 为 1 – Enabled时,拖放操作的鼠标划过目的对象时发生
OLEDropEffects Property    目的对象支持的操作类型,对DataObject对象进行复制?移动?连接?不接收?等
OLEDropHasData Property    DataObject对象是否包含可以被目的对象处理的格式数据,并影响拖放时鼠标的外形(说白了,只是一个用户处理的标志,检测数据格式后设置的)
OLEDropMode Property    目的对象是否接受拖放操作的释放

三、DataObject对象:在拖放操作过程中,被传递的对象,包含指定格式类型的数据,该对象不可以在VFP中由用户创建,用拖放操作产生。
ClearData 方法 清除对象中的数据,只能在 OLEStartDrag 事件中执行
SetData 方法 指定对象中的数据及数据类型
GetData 方法 从对象中接收指定类型的数据到一个数组
SetFormat 方法 设置对象中数据的格式,对象可以只包含格式而不包含数据,但在传递时会有SetData事件发生
GetFormat 方法 取得对象中的数据格式类型
  
以上为MSDN摘录信息,并归类。详细请查询http://msdn.(v=vs.71).aspx

实际操作并没有想象的复杂。
1.新建表单Form1,置拖入标签oFileDes,置拖出标签oFileSource

2.设置属性
oFileDes.OleDropMode=1        &&启用,允许在目的对象oFileDes上执行放操作
oFileSource.OleDragMode=1     &&自动,允许在源对象oFileSource上执行拖操作

3.设置两个标签的事件
oFileDes.DragOver事件:
程序代码:
Lparameters oDataObject, nEffect, nButton, nShift, nXCoord, nYCoord, nState
If nState=0 .And. oDataObject.GetFormat(15)
    This.OLEDropHasData=1
    Local cFileName[1]&&数组可重申明扩大,以用于多个文件的拖放,此处为单个拖放
    =oDataObject.GetData(15,@cFileName)
    This.Caption=cFileName
Endif


oFileSource.OleStartDrag事件:
程序代码:
LPARAMETERS oDataObject, nEffect
LOCAL cFileName
cFileName=thisform.ofileDes.caption
*在临时文件夹处理拖入的文件并改名,此处设为D:\
cFileName=SUBSTR(cFileName,AT("\",cFileName,OCCURS("\",cFileName))+1)
cTempFile="d:\"+SYS(2015)
COPY FILE (thisform.oFileDes.Caption)  TO &cTempFile
*
*!* 如果文件较大,请加入文件存在的检测语句。
*
oDataObject.setdata(cTempFile,15)


示例文件下载:
VFP到EXPLORER双向拖放操作.rar (2.13 KB)
收到的鲜花
  • tlliqi2014-06-05 14:47 送鲜花  30朵   附言:向你学习
搜索更多相关主题的帖子: Explorer 朋友 加密 网上 
2014-06-05 11:56
jsddx
Rank: 2
等 级:论坛游民
帖 子:42
专家分:21
注 册:2006-4-11
得分:5 
学习学习
2014-06-05 14:09
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
得分:5 
向你学习
2014-06-05 14:47
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:5 
不错,学习中。

活到老,学到老! http://www. E-mail:hu-jj@
2014-06-05 19:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:5 
拖放的本质实际上就是Ctrl+C/Ctrl+V,当然不复杂,它的本质是使用系统的剪贴板。键盘操作比鼠标方面得多,这也是现在的使用者极少用拖放的原因。

授人以渔,不授人以鱼。
2014-06-05 23:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-432508-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.373932 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved