黑月控件类库模块API拖放功能例程

易语言 2020-08-31 21:42:20

黑月控件类库模块API拖放功能例程

.子程序 DragFileOpen, 整数型, 公开, 返回调用此功能前程序指定参数,用作恢复时使用.路径文本最大长度为256,超出部分将丢失.
.参数 hWnd, 整数型, , 设置将要开启拖放功能的控件(窗口),填写控件(窗口)句柄即可.
.参数 lpFileGain, 子程序指针, , 获得文件后执行一个子程序,包含4个参数,第二个为(文本型),也就是此次枚举的文件名,其他全部为(整数型).注意:当投放文件为多个时,子程序执行次数为文件个数,每次执行参数内容会自动调整,直至文件名全部枚举完成为止.

.如果真 (OriginalValue = 0) ' 只有系统内置默认函数地址记录变量为0时才能开启,因为如果已经开启了拖放在进行开启操作程序将崩溃。
hWndA = hWnd ' 将句柄信息发送至程序集变量以供其他子程序(&WindowProc)调用.
SubPtr = lpFileGain ' 获得文件后执行的子程序指指针.
DragAcceptFiles (hWnd, 真) ' 开启窗口接收文件功能.
OriginalValue = SetWindowLong (hWnd, -4, &WindowProc) ' 设置&WindowProc子程序为消息拦截后的处理过程,如不懂消息处理过程,请勿修改&WindowProc子程序,因为如果修改存在错误程序可能会崩溃。
.如果真结束
返回 (OriginalValue) ' 返回系统内置默认函数地址记录,以供在其他程序集或程序中调用此参数还原系统内置默认函数地址.

.子程序 WindowProc, 整数型, , 拖放功能主函数,与 CallWindowProc_API函数功能相反,功能为截取获得的拖放到窗口的文件个数以及路径之Windows消息,并使其分离为文件路径,由DragFileOpen()函数自动调用,不必公开!
.参数 hWnd, 整数型, , 拦截到的窗口句柄参数。其实也就是调用拖放功能的窗口句柄
.参数 Msg, 整数型, , 拦截到的
.参数 wParam, 整数型
.参数 lParam, 整数型
.局部变量 I, 整数型
.局部变量 nCount, 整数型
.局部变量 IReturn, 整数型
.局部变量 FileList, 文本型
.局部变量 sFileList, 文本型

' 相信有一点编程基础的童鞋都能看懂此代码流程及作用,即使是学习的易语言,因为本人就是易语言学习者,VB不算精通,但勉强算懂,会写点小程序,不懂也没关系,代码都有注释.
.如果真 (Msg = 563) ' 判断Explorer发送的Window消息ID是否为0x233&也就是563,是则执行拖放功能文件获取功能,否则直接执行消息给窗口.
sFileList = #Space256 ' 给临时文件名变量分配256字节空白内存空间,因此,文件名最大长度为256字节,如特殊需要,可以自己改变文本常量的空白字符数.但不宜超过1024字节.
nCount = DragQueryFile (wParam, -1, sFileList, 256) ' 获取文件数量API函数并传递给nCount变量,数量上限为65536.
.变量循环首 (0, nCount - 1, 1, I) ' 文件数量为X个,此处循环X次,并在每次循环中返回其中一个文件路径.
sFileList = #Space256 ' 给临时文件名变量分配256字节空白内存空间,因此,文件名最大长度为256字节,如特殊需要,可以自己改变文本常量的空白字符数.但不宜超过1024字节.
IReturn = DragQueryFile (wParam, I, sFileList, 256) ' 取得此次循环的文件路径的文本长度API,最大长度为256,并传递至整数变量IReturn
FileList = 取文本左边 (sFileList, IReturn) ' 取得此次循环的最终文件名,并传递至文本变量FileList.
CallWindowProcA (SubPtr, hWnd, FileList, wParam, lParam) ' 执行一个用户指定的子程序,并传递一个参数(此次循环文件名)给此子程序.每次循环子程序执行一次,直至循环完成.
.变量循环尾 () ' 达到变量要求条件循环结束。
DragFinish (wParam) ' 停止拖放操作, 注意:如果不停止拖放操作,程序将一直占用系统内存以及CPU资源。
返回 (563) ' 执行完成,返回程序,并无实际作用,主要是用于禁止运行最下面那句代码,其实也不用禁止,但为安全起见,因为可能某些错误信息会让程序崩溃。
.如果真结束
返回 (CallWindowProc (OriginalValue, hWnd, Msg, wParam, lParam)) ' 如果消息ID不为563,则直接执行此句代码,否则此代码将不被执行。

.子程序 DragFileShut, 整数型, 公开, 关闭已经开启拖放功能的窗口的拖放功能,原始值为开启时所返回的数值。
.参数 hWnd, 整数型, , 关闭拖放功能的窗口句柄。
.参数 lpOriginalValue, 整数型, , 提供开启时所返回的数值,如数值错误将导致。
.局部变量 CC, 整数型

.如果真 (OriginalValue ≠ 0) ' 如果系统内置默认函数地址记录变量不为0时将还原程序消息处理过程函数.
CC = DragAcceptFiles (hWnd, 假) ' 关闭拖放功能
SetWindowLongA (hWnd, -4, OriginalValue) ' 还原消息拦截函数为系统内置默认函数。
OriginalValue = 0 ' 使默认函数地址记录常量为0,供下次开启时使用。
返回 (CC) ' 返回值起始是一个纯粹的画蛇添足型数值。
.如果真结束
返回 (0)