设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1066|回复: 7
打印 上一主题 下一主题

请问!?如何实现文件从资源管理器EXPLORE到应用程序的拖放

[复制链接]
跳转到指定楼层
1#
发表于 2002-9-24 18:16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何实现文件从资源管理器EXPLORE到应用程序的拖放!?
除了采用OLE拖放,难道就没有好办法没有!!???
谢谢!!!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2002-9-24 18:18:00 | 只看该作者
借助API函数CallWindowProc,DragAcceptFiles,DragQueryFile,DragFinish同样可以实现文件从资源管理器EXPLORE到应用程序的拖放!!

'-------------------------------------------
'          采用API实现的文件拖放
'-------------------------------------------
'           洪恩在线  求知无限
'-------------------------------------------
'程序说明:
'本例是采用子类派生技术实现的文件从EXPLORE到VB程序的拖放
'    通过三个API函数DragAcceptFiles、DragQueryFiles和
'DragFinish,并通过回调函数WindowProc,窗口属性函数
'SetWindowLong、CallWindowProc的使用实现,而另一种同样
'效果的实现方法:OLE拖放,你可以参照文件拖放的另外一个实
'例。
'-------------------------------------------
Option Explicit
  
Private Const GWL_WNDPROC As Long = (-4&)
   
  ' API call to alter the class data for this window
Private Declare Function SetWindowLong& Lib "user32" Alias "SetWindowLongA" (ByVal hWnd&, _
                                                              ByVal nIndex&, ByVal dwNewLong&)

Private Sub Form_Load()
  
  '定义 Picture1作为接收文件拖放的容器
  DragAcceptFiles Me.hWnd, 1&
  
  '整个procOld变量用来存储窗口的原始参数,以便恢复
  ' 调用了 SetWindowLong 函数,它使用了 GWL_WNDPROC 索引来创建窗口类的子类,通过这样设置
  '操作系统发给窗体的消息将由回调函数 (WindowProc) 来截取, AddressOf是关键字取得函数地址
  procOld = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf WindowProc)
           'AddressOf是一元运算符,它在过程地址传送到 API 过程之前,先得到该过程的地址
End Sub

Private Sub Form_Unload(Cancel As Integer)

  '此句关键,把窗口(不是窗体,而是具有句柄的任一控件,这里指Picture1)的属性复原
  Call SetWindowLong(Me.hWnd, GWL_WNDPROC, procOld)
  
End Sub

Public Sub DropFiles(ByVal hDrop&)

  Dim sFileName$, IReturn&
  Dim nCount&, I As Integer
  
  '为sFileName分配存储空间
  sFileName = String$(MAX_PATH, vbNullChar)
  
  '通过文件指针hDrop, DragQueryFile返回是否有文件拖放,nCount返回拖放文件的个数
  nCount = DragQueryFile(hDrop, -1, sFileName, MAX_PATH)
  
  '循环读取每一个拖放的文件,把它在列表框中显示出来
  For I = 0 To nCount - 1
  sFileName = String$(MAX_PATH, vbNullChar)
    '如果有文件拖放,接收文件名,并试图把它在图片框中打开
    'IReturn&
    IReturn& = DragQueryFile(hDrop, I, sFileName, MAX_PATH)
    List1.AddItem Left$(sFileName, IReturn)
  Next I
  '完成拖放操作
  DragFinish hDrop

End Sub
'以下代码放在moudle中
Option Explicit
  
  Public Const MAX_PATH As Long = 260&
  
  '标示我们要截获的消息
  Public Const WM_DROPFILES As Long = &H233&


  '保存原 窗体属性的变量,其实是默认的 窗体函数 的地址
  Public procOld As Long
  
  '
  Public Declare Function CallWindowProc& Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc&, _
                                                    ByVal hWnd&, ByVal Msg&, ByVal wParam&, ByVal lParam&)
                                                   
  '拖放操作相关的API函数
  Public Declare Sub DragAcceptFiles Lib "shell32.dll" (ByVal hWnd&, ByVal fAccept&)
                              
  Public Declare Function DragQueryFile& Lib "shell32.dll" Alias "DragQueryFileA" (ByVal hDrop&, ByVal iFile&, _
                                                                                  ByVal lpszFile$, ByVal cch&)
  Public Declare Sub DragFinish Lib "shell32.dll" (ByVal hDrop&)

'WARNING!!!!-----------------------------------------------------------
'注意这段代码是不能用DEBUG一步步调试的,否则会造成错误(崩溃)
'对消息截获的机制可以按下述理解:
'    这里要仔细理解一下,我们为窗体新指定了窗体函数地址,也就是说操作系统发送给窗体的
'消息将被 WindowProc函数 所截获(而改变前消息是被默认的 窗体函数 所获得并作相应处理的)
'    这样我们在 WindowProc函数 中对所截获的消息进行判断,会有三种情况:
'<1>如果是需要通过程序来处理的消息就通过 WindowProc函数 中的相应语句处理;
'<2>如果是要原来的 窗体函数 来处理则把这个消息传递给原窗体函数(其实是指针指向的改变);
'<3>如果不是我们需要的消息,也传递给原 窗体函数 来处理。

    '可以参见 改变系统菜单 中的源码注释
'WARNING!!!!-----------------------------------------------------------

3#
发表于 2002-9-24 22:41:00 | 只看该作者
啊,斑竹wtm我发现你关于API得好东东不少哦!!
可否给我Mail一份?
biz@sanyangplastics.com
4#
发表于 2002-9-24 23:21:00 | 只看该作者

不可以!

對不起!!不可以!!
這是公開的,我要把它們公開在這裡!!
如果,你確實很想要!
經常來看看,會找到你想要的!!
你想吃獨食不好辦!!
5#
发表于 2002-9-25 02:03:00 | 只看该作者
那么,我提供一点空间,汇总整理成资料,放上去行不行?
6#
发表于 2002-9-25 18:40:00 | 只看该作者
可以……考虑!!
你提供空间,并汇总数据,再放在上面吧!
好!
感谢你的支持!!
7#
 楼主| 发表于 2002-9-25 23:49:00 | 只看该作者
谢谢你!吴天明版主!!
8#
发表于 2002-9-26 01:33:00 | 只看该作者
不用谢!
常来玩!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2025-1-12 06:59 , Processed in 0.097644 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表