火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 3256|回复: 16
打印 上一主题 下一主题

[视窗] 文件拖放

[复制链接]

30

主题

178

帖子

1017

积分

金牌会员

Rank: 6Rank: 6

积分
1017
跳转到指定楼层
楼主
发表于 2022-3-29 17:25:53 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ixiadao 于 2022-3-30 01:19 编辑

综合了网上几个文件拖放,整理了一下,有需要的可以下载研究
回复有人说官方有,认真找了一下,原来是MFC窗口组件有这个功能。官方的和网络几个文件拖放的模块大致是将所收到的文件打包成一个文本数组类,然后再传递出去,如果要对拖放的文件进行分析过滤,要等全部收到拖放的文件再对数组进行循环分析,这样的效率应该打打折扣的!这样的事件并非实时收到的事件,应该算是一个伪事件吧?我正是看到这些弊端,才对网络上几个文件拖放模块进行优化处理,真正实现了拖放事件,可以实时接收到收到的文件并进行处理,而且不依赖MFC组件。是否使用,还请各位自行决定!


增加 本批文件数、当前索引  两个参数,主要用于区分用户分批次拖放的内容



下面的文件为修改后的源文件,有需要请重新下载
测试.zip (33.19 KB, 下载次数: 9)

20220330-1264.png (37.96 KB, 下载次数: 29)

20220330-1264.png

测试.zip

24.27 KB, 下载次数: 17

回复

使用道具 举报

30

主题

178

帖子

1017

积分

金牌会员

Rank: 6Rank: 6

积分
1017
沙发
 楼主| 发表于 2022-3-29 18:25:19 | 显示全部楼层
创世魂 发表于 2022-3-29 18:14
我记着新版的火山已经支持文件拖放了吧。

没看到阿
回复

使用道具 举报

30

主题

178

帖子

1017

积分

金牌会员

Rank: 6Rank: 6

积分
1017
板凳
 楼主| 发表于 2022-3-29 20:26:38 | 显示全部楼层

请问哪个类目?我这里找了半天没找到,是不是因为我是免费版的?
回复

使用道具 举报

30

主题

178

帖子

1017

积分

金牌会员

Rank: 6Rank: 6

积分
1017
地板
 楼主| 发表于 2022-3-29 20:30:05 | 显示全部楼层

看到了,不过是MFC界面库的功能

151. 视窗: "MFC界面基本类"类库中的"窗口组件"类新增"文件被拖放"事件和"允许文件拖放"属性,用作支持当从资源管理器上将文件拖放到窗口组件上时得到事件通知;
回复

使用道具 举报

30

主题

178

帖子

1017

积分

金牌会员

Rank: 6Rank: 6

积分
1017
5#
 楼主| 发表于 2022-3-29 20:43:24 | 显示全部楼层
创世魂 发表于 2022-3-29 18:14
我记着新版的火山已经支持文件拖放了吧。

官方的代码我建议优化,将所有文件打包成数组,然后再通过事件传递一个数组过去?为什么不实时传递接收到的文件呢?
回复

使用道具 举报

30

主题

178

帖子

1017

积分

金牌会员

Rank: 6Rank: 6

积分
1017
6#
 楼主| 发表于 2022-3-30 00:14:16 | 显示全部楼层
Xelloss0618 发表于 2022-3-29 23:06
哈哈,你看楼主上一条的回复就知道了,他喜欢单独接收每个文件,其实楼主这个代码主要就是把仰望火山模块 ...

比如,我拖放文件之后,我需要过滤掉目录或者指定的文件,用我改的这样可以更加高效。我是综合了几个模块来着。官方和其它的模块  就是一个一个加到数组,然后再回传数组,这样拖放事件的意义就不大了,还不如直接来一个   取拖放文件数组()  之类的方法了。事件  我理解的意思是收到一个文件,就触发一次。当然,这个是我理解的
回复

使用道具 举报

30

主题

178

帖子

1017

积分

金牌会员

Rank: 6Rank: 6

积分
1017
7#
 楼主| 发表于 2022-3-30 00:24:49 | 显示全部楼层
Xelloss0618 发表于 2022-3-29 23:06
哈哈,你看楼主上一条的回复就知道了,他喜欢单独接收每个文件,其实楼主这个代码主要就是把仰望火山模块 ...

要区分哪一批次拖入的,也一样可以传递到事件接收里面阿,定义一个变量,或者直接传递  本批次数量  和   当前接收的索引  ,判断当前接收的索引 = 本批次数量 - 1 ,就说明一个批次完了
回复

使用道具 举报

30

主题

178

帖子

1017

积分

金牌会员

Rank: 6Rank: 6

积分
1017
8#
 楼主| 发表于 2022-3-30 00:38:35 | 显示全部楼层
b0y 发表于 2022-3-29 23:42
是的,之前有这个需求,找了几个拖放都是单独的,不好判断是不是一次拖放的,火山模块数组输出的可以 ...

要判断是哪一个批次传入的话,定义一个变量区别就是,或者直接传递 每个批次的数量 和 当前接收到的文件的索引,就可以很轻松判断是哪个批次的,只要判断   每批次的数量 - 1 = 当前接收到的文件的索引 就可以判断一批文件接收完毕了,或者直接判断 当前接收的文件索引  是不是以 0 开头就表示是不是新的一个批次了。

文件拖放,狠多时候是需要过滤掉  目录  的,有时候也需要过滤掉部分文件类型,按他们传递数组的话,等于是阻塞了,比如一次传递  几百个文件,你要等接收完几百个文件后 他们才给你返回目前的接收到的文件内容,然后再枚举数组的成员一个一个分析,而我的方法早就分析完了,效率的差别就体现在这里。

夸张一点,你可能就会更加明白那些传递数组回来的效率有多差,如果,用户一次拖入100W个文件,你可能要等十几分钟才能到手事件,然后才能处理接收到的文件。


自己把模块的  拖放事件  增加2个参数:当前批次文件数、当前接收索引,然后上面   C++代码把  nFilesCount 、 i  传递过去就可以了
回复

使用道具 举报

30

主题

178

帖子

1017

积分

金牌会员

Rank: 6Rank: 6

积分
1017
9#
 楼主| 发表于 2022-3-30 13:40:00 | 显示全部楼层
Xelloss0618 发表于 2022-3-30 09:15
文本数组类是越大越慢没错,但一次拖入的文件一般不会上万,那点效率差距(几毫秒)基本可以忽略不计
主要 ...

比如,开发一个图片批量水印的,几千个是正常的。因为支持文件拖放的软件,一般都会去过滤一些不必要的文件类型的,所以通过事件及时分析类型并过滤,而一个个加入数组则等于是阻塞了线程。我已经更改了,判断当前接收的序号判断不同批次的文件,也没有额外增加变量,仅仅是通过现有的变量传递到事件参数
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-5-20 14:37 , Processed in 0.092932 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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