借助API函数CallWindowProc,DragAcceptFiles,DragQueryFile,DragFinish同样可以实现文件从资源管理器EXPLORE到应用程序的拖放,另一种方法是采用OLE拖放,可以参照趣味编程栏目的相关内容。下面我们一起来看看程序编写的过程。
为了学习方便,提供的源码已经作了详细的中文注释,看看源码框中的代码:
对于每个需要引用的API函数,我们需要先在程序中说明,如果只在某一窗体内声明并使用它,则把它声明为Private,而如果在模块中声明,且需要在整个工程内使用它,则需要把它声明为Public。
Public Declare Function CallWindowProc& Lib
"user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc&, ByVal hWnd&,
ByVal Msg&, ByVal wParam&, ByVal lParam&)
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&)
Private Declare Function SetWindowLong& Lib "user32" Alias "SetWindowLongA"
(ByVal hWnd&,ByVal nIndex&, ByVal dwNewLong&)
SetWindowLong函数的作用是在窗口结构中为指定的窗口设置属性,利用它我们来改变窗口的属性参数,其中各个参数的意义如下表所示:
参数
|
意义
|
hwnd |
Long,欲为其取得信息的窗口的句柄 |
nIndex |
Long,这里取GWL_WNDPROC,表示设置该窗口的窗口函数的地址 |
dwNewLong |
Long,由nIndex指定的窗口信息的新值 |
返回值 |
Long,指定数据的前一个值 |
在默认状态下WINDOWS操作系统会指定一个窗口函数来接受和处理WINDOWS消息,而通过使用SetWindowLong函数改变窗口函数的地址使它指向我们自己写的一个函数WindowProc,这样WINDOWS消息就会转由WindowProc函数接收和处理。于是我们就能判断文件拖放的消息并进行处理。改变窗口属性的语句如下:
procOld = SetWindowLong(Me.hwnd, GWL_WNDPROC,
AddressOf WindowProc)
DragAcceptFiles、DragQueryFile、DragFinish三个函数的作用分别是:把某个窗口设置为接收拖放的容器、返回拖放的文件的数量和信息、终止拖放。
|