以文本方式查看主题

-  搭建论坛  (http://bbs.diylsoft.com:8118/starforum/index.asp)
--  用户咨询  (http://bbs.diylsoft.com:8118/starforum/list.asp?boardid=4)
----  [求助]星能实现 拖放操作 吗?  (http://bbs.diylsoft.com:8118/starforum/dispbbs.asp?boardid=4&id=30242)

--  作者:zhenchangyi
--  发布时间:2010-6-1 12:57:40
--  [求助]星能实现 拖放操作 吗?

星能实现 拖放操作 吗?  


 

怎么得到 拖放到 星窗口中的 文件名?

--  作者:洪滨
--  发布时间:2010-6-1 13:13:53
--  
好象不可以,没有试过,有做过的星友,请支一下招,帮助zhenchangyi     洪滨在此表示感觉!
--  作者:玩脑者
--  发布时间:2010-6-1 14:31:20
--  

不可以,现在星还没有这个构件,我也需要这样的构件

 

不知道官方是否有做这个构件的打算。

-------------------------------------

相关资料如下:

 

方法:

RegisterDropTarget(参数:接收拖放控件句柄)
注册一个控件,使其可以接收拖放,成功返回真,失败返回假。

UnRegisterDropTarget(参数:接收拖放控件句柄)
撤消一个控件,使其不可以接收拖放。

 

成员属性:

接收文本<真/假>

接收超文本<真/假>

接收URL<真/假>

接收文件<真/假>

 

事件:

 

得到文本:有文本被拖放到放置本控件的窗体且“接收文本”属性为真时产生本事件。

      事件参数的名称为“接收到的文本”,类型为“文本型(text)”。参数值为接收到的文本。

 

得到超文本:有超文本被拖放到放置本控件的窗体且“接收超文本”属性为真时产生本事件。

      事件参数的名称为“接收到的超文本”,类型为“文本型(text)”。参数值为接收到的超文本。

 

得到URL:有URL被拖放到放置本控件的窗体且“接收URL”属性为真时产生本事件。

      事件参数的名称为“接收到的URL”,类型为“文本型(text)”。参数值为接收到的URL。

得到文件:有文件被拖放到放置本控件的窗体且“接收文件”属性为真时产生本事件。

      事件参数的名称为“接收到的文件路径”,类型为“文本型(text)”。参数值为接收到的文件名文本,如果拖放多个文件,那么每个文件路径通过“指定的格式符”分隔。


--  作者:x123992009
--  发布时间:2010-6-1 19:44:28
--  

玩脑。是不是用API做到了可以,接受啊?  这么弄的,传个例子吧。谢谢。。分享一下。。。好有用的。


--  作者:玩脑者
--  发布时间:2010-6-2 9:18:35
--  

楼上见谅,在星中我也没做出来。


--  作者:kass
--  发布时间:2010-6-3 21:29:24
--  
星可以做到。
--  作者:x123992009
--  发布时间:2010-6-3 23:52:48
--  

楼上。这么做到,,共享下职。谢谢。


--  作者:zhenchangyi
--  发布时间:2010-6-4 20:54:33
--  

VB可以用OLE拖放,也可以用用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!!!!-----------------------------------------------------------

\'回调函数,用来截取消息
Public Function WindowProc(ByVal hWnd As Long, ByVal iMsg As Long, _
            ByVal wParam As Long, ByVal lParam As Long) As Long

  \'确定接收到的是什么消息
  Select Case iMsg

  \'如果是 通知文件放下 的消息,就拦截消息
  Case WM_DROPFILES
  \'通知在FORM模块中定义的DropFiles函数来接收 指向 放下的文件 的句柄
  frmDragDropFiles.DropFiles wParam

  \'返回0并退出这个WindowProc
  WindowProc = False
  Exit Function

  End Select

  \'如果不是我们需要的消息,则传递给原来的窗体函数处理
  WindowProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam)
End Function


--  作者:zhenchangyi
--  发布时间:2010-6-4 21:02:22
--  

.者 不能定义、引用 类, 用上面的API行不通?

 

哪个高手用Delphi封装或者写个Dll通过 .者的 Dll函数功能得到 拖放到者窗口中的 文件名或信息


--  作者:zhenchangyi
--  发布时间:2010-6-4 21:13:48
--  
期待. 者 能支持指针、类、OCX.....