Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 4712|回复: 10

[分享] 【探索的快乐 】- 有限条件下解决控件拖曳问题的思路历程

[复制链接]
发表于 2020-12-22 19:50 | 显示全部楼层 |阅读模式
本帖最后由 大灰狼1976 于 2021-4-27 20:19 编辑

【探索的快乐】 - 有限条件下解决控件拖曳问题的思路历程
追加说明:11楼重大更新,基本完结。
由于某些原因,很久没上线了,有点写一些东西的想法,以对我的不敬业行为进行反省。
注:此贴并非仅在本论坛发表,如有违反论坛公约请及时提醒,我会做妥善处理。

前言
这个虽然不重要,但是仍有必要事先说明一下,我喜欢尽可能使用常规方法解决我遇到的所有问题,理由如下:
1、对API、钩子、PostMessage、SendMessage之类的应用完全不懂;
2、尽量减少对系统环境的依赖性。

主题
    我出于兴趣编写了一个自己喜欢的小游戏,基本功能还算成功(见本楼附件),但实际运用中发现一些不便之处,当然所参考的游戏本身也有同样问题,但它是SFC平台的游戏,所以貌似也无法使其变得更便利。
    为了使各位直观理解我所说的便利性,必须对游戏的基本规则作简单说明如下:
有一个格子方阵(类似扫雷),需要遵循某种规则将其中部分格子反色涂黑(通过鼠标点击),直到满足特定条件后判定成功。现状需要反色的格子很多情况下都是成行、成列甚至成片排列的,鼠标逐个点击不仅效率低下,甚至容易产生厌烦(如果你测试了此楼的附件,想必能感同身受),所以我考虑加入鼠标拖动实现连续点击功能(我简称为拖曳),可以成行、成列甚至成片的批量处理格子,毫无疑问首先想到的就是利用控件的MOUSEMOVE事件,在经过几次想当然和碰壁后,我才意识到问题没那么简单,并开始了我的钻牛角尖之旅。

注:本楼附件为改善前的完整游戏文件,需要将压缩包里两个文件解压到同一路径下,然后打开EXCEL运行;
       2楼开始会陆续将各个阶段的尝试和成果以及相应的示例文件进行发布。


      11楼重大更新,基本完结。

main.PNG

PICROSS SAMPLE.zip

269.67 KB, 下载次数: 11

 楼主| 发表于 2020-12-22 20:07 | 显示全部楼层
1、使用Label控件却未能实现功能
    由于我最初的游戏示例里面是用Label来表示格子的,所以理所当然地考虑如何使用Label控件的MOUSEMOVE事件来实现我想要的拖曳功能,但是发现按下鼠标键后MOUSEMOVE事件仅响应你鼠标按下的那个控件,即使鼠标移动到其他控件上面,它们也毫无反应,第一次尝试失败,自此消停了一段时间(大概两天)。
    这个阶段的示例见本楼附件,完全是个失败的作品。
    注:从此楼开始,示例文件均为以实现功能为主要目的的简单示例,而非完整游戏。

使用Label控件的测试.zip

12.15 KB, 下载次数: 2

回复

使用道具 举报

 楼主| 发表于 2020-12-22 20:18 | 显示全部楼层
2、使用CommandButton能部分实现功能
    虽然Label没有实现我想要的功能,但是总放不下这件事,有意无意就开个表格做尝试,偶然有次发现CommandButton控件在将Locked属性设置为True时,是可以实现拖曳功能的!
    这个发现让我重拾信心,但是又出现一个问题,Locked属性设置为True后,拖曳功能是实现了,但是点击功能没有了,这个我完全无法接受,好了,继续摸索了一段时间(大概两个月),这段时间内时不时的尝试了很多常用控件,毫无进展。尝试其他控件的原因是,按钮外观无法做到扁平化,个人不太喜欢。
    这个阶段的示例见本楼附件,是个不尽如人意的半成品。

使用CommandButton控件的测试.zip

12.73 KB, 下载次数: 5

回复

使用道具 举报

发表于 2020-12-23 09:36 | 显示全部楼层
本帖最后由 砂海 于 2020-12-23 14:07 编辑

用 标签 做了个 拖动 , 功能不完整 , 并且 只能从左上标签开始
应该用 类模块 , 就可以了 , 否则代码太冗余
Re .rar (11.32 KB, 下载次数: 4)

评分

参与人数 1学分 +10 收起 理由
大灰狼1976 + 10 学习

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2020-12-23 10:08 | 显示全部楼层
论坛提醒文字含有不良信息,那我就贴图吧。
test.bmp

继续深挖CommandButton控件.zip

14.04 KB, 下载次数: 1

回复

使用道具 举报

 楼主| 发表于 2020-12-23 10:15 | 显示全部楼层
【小插曲】
    在测试上楼示例的时候,我曾发现一个有趣的事情,使用MOUSEDOWN事件转移焦点后,会自动触发MOUSEMOVE事件,也就意味着,我在MOUSEDOWN事件里面,可以不用写处理代码了,只要写转移焦点的语句就能达到同样的效果。
示例见本楼附件。

继续深挖CommandButton控件2.zip

14.21 KB, 下载次数: 5

回复

使用道具 举报

 楼主| 发表于 2020-12-23 10:36 | 显示全部楼层
4、再次深挖CommandButton
    有了上面的阶段性成功,信心也重拾了一点,然后想了一些方法,比如通过Caption来作为判断条件啊,以控件当前颜色做判断条件等等,以减少MOUSEMOVE事件中的处理频次,但这些属性都是看得到的,按我的经验,看得到的东西读取或赋值都是效率较低的,特别是赋值,因为会实时刷新窗体的显示,况且实际运用中格子里是空白的,不能有Caption内容,虽然内容可以用字体颜色掩盖,但格子本身是要随着鼠标的操作实时切换颜色的,又要写多余的颜色赋值代码又改变不了会刷新窗体显示导致效率降低的缺点。
    然后我发现有个属性的修改是看不到的,而且不影响其他功能,那就是Tag,这一次,终于,前进的方向明确了!
    本楼的示例已基本实现我所有想要的功能以及效率,探索告一段落,接下来会制作一个简单而略完善的模拟作品,时间待定。

再次深挖CommandButton控件.zip

14.43 KB, 下载次数: 8

回复

使用道具 举报

 楼主| 发表于 2020-12-23 20:31 | 显示全部楼层
砂海 发表于 2020-12-23 09:36
用 标签 做了个 拖动 , 功能不完整 , 并且 只能从左上标签开始
应该用 类模块 , 就可以了 , 否则代码太冗 ...

非常感谢砂海大侠提供的示例,实际上如果看过我一楼的改善前成品后,可以明白最终我都会使用类模块来精简代码,甚至所有窗体及控件甚至代码都是动态生成的。在另外的论坛也得到其他高手提供的示例,受益匪浅,但我至少想把目前的工作先做个了结,然后再学习其他更好的方法。
再次感谢!
回复

使用道具 举报

 楼主| 发表于 2020-12-28 20:55 | 显示全部楼层
5、测试版成果报告
    有了前面多次试验的理论基础,我就计划制作一个精巧且具有完整功能的测试样本,正好今天下午有点时间,我就在最初版(1楼附件)里面随机抽选了一个关卡,动态生成窗体后复制出来并进行整合加工,做成了单一关卡完整功能测试版。通过几次测试完,我自己的感受是基本满意的,有如下几点说明:
1、CommandButton组成的方阵并没有我想象中的难看,反而觉得挺有质感;
2、没有用到API函数,全部基本功能;
3、用到了类模块,但只是为了精简代码,并不是必要条件;
4、几乎没有多余的计算和处理,且不需要根据位置来判断需要做处理的控件。
    本楼附件为测试版完整游戏,全部代码公开供参考。
ForTest.PNG

ForTest.zip

35.47 KB, 下载次数: 11

评分

参与人数 1学分 +3 收起 理由
砂海 + 3 恭喜恭喜

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2021-1-16 17:44 | 显示全部楼层
忘记一帖
【接近尾声】
    终于计划对初版动大手术了,但越接近尾声我的拖延症就越严重,玩游戏也是这样,知道马上到最终BOSS时,我会选择保存,然后不知道什么时候再打开,好像有专门术语来描述这种虎头蛇尾的状态。
    仍在纠结于最终版是否使用动态窗体和动态控件,动态的好处是文件中不需要提前创建窗体(因为窗体有5种方阵大小),可以缩小文件尺寸且显得灵活,但它也有缺点:1、打开窗体慢;2、有时会看到VBE窗口一闪而过;3、需要设置信任中心
    或者直接做好5种窗体,根据选择的关卡来判断启动哪个窗体,虽然文件稍大一点,但是上述缺点都能克服掉,好好想想要鱼还是熊掌。要不全部都做个吧,等我想做的时候。

回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 06:33 , Processed in 0.346722 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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