找回密码
 加入
搜索
查看: 8030|回复: 18

[GUI管理] [已解决]请教:《文件拖曳问题》的延伸

 火.. [复制链接]
发表于 2010-6-12 19:12:49 | 显示全部楼层 |阅读模式
本帖最后由 ferelove 于 2010-6-14 01:46 编辑

http://www.autoitx.com/thread-15160-1-3.html
单个Input的文件拖曳时参考该帖子4楼解决,确实挺好用。
当有多个Input都需要类似的判断时,我始终处理不了,请教各位。谢谢!

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2010-6-12 22:34:03 | 显示全部楼层
新手,跟着学习学习
 楼主| 发表于 2010-6-13 18:15:31 | 显示全部楼层
研究无果,继续请教高手。谢谢!
发表于 2010-6-13 19:17:37 | 显示全部楼层
楼主什么意思,给段代码看看,这问题应该不麻烦,只是到底是哪个控件的问题
发表于 2010-6-13 20:43:02 | 显示全部楼层
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ACN_HASH.au3>
Global $Hash, $FileHandle, $Filename, $Filename2, $Buffersize = 0x20000
$Form1 = GUICreate("多个Input文件拖曳判断", 364, 211, -1, -1, -1, $WS_EX_ACCEPTFILES)
$Button1 = GUICtrlCreateButton("浏览", 312, 4, 43, 25)
$Input2 = GUICtrlCreateInput("", 8, 40, 297, 21)
$Button2 = GUICtrlCreateButton("复制", 312, 36, 43, 25)
$Input1 = GUICtrlCreateInput("浏览或拖曳一个文件到这里", 8, 8, 297, 21)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
$Button3 = GUICtrlCreateButton("浏览2", 312, 67, 43, 25)
$Input3 = GUICtrlCreateInput("浏览或拖曳一个文件到这里", 8, 70, 297, 21)
GUICtrlSetState(-1, 8)
$Button4 = GUICtrlCreateButton("复制2", 312, 97, 43, 25)
$Input4 = GUICtrlCreateInput("", 8, 100, 297, 21)
$Filename = GUICtrlRead($Input1)
$Filename2 = GUICtrlRead($Input3)
GUISetState(@SW_SHOW)
While 1
 $nMsg = GUIGetMsg()
 Switch $nMsg
  Case $GUI_EVENT_CLOSE
   Exit
  Case $Button2
   ClipPut(GUICtrlRead($Input2))
   MsgBox(0, "结果", "已将MD5值复制到剪贴板!", 2)
  Case $Button1
   $Filename = FileOpenDialog("选择文件", "", "所有文件(*.*)")
   If @error <> 1 Then
    GUICtrlSetData($Input1, $Filename)
    MD5A()
   EndIf
  Case $GUI_EVENT_DROPPED
   $_Filename = ControlCommand($Form1, '', $Input1, 'GetSelected', '')
   $_Filename2 = ControlCommand($Form1, '', $Input3, 'GetSelected', '')
   If $_Filename<>$Filename Then
    If StringInStr($_Filename, "|") <> 0 Then
     GUICtrlSetData($Input1, "浏览或拖曳一个文件到这里")
     MsgBox(16, "错误", "一次只能拖曳一个文件!", 5)
     GUICtrlSetData($Input1, $Filename)
    Else
     GUICtrlSetData($Input1, $_Filename)
     MD5A()
     $Filename = $_Filename
    EndIf
   ElseIf $_Filename2<>$Filename2 Then 
    If StringInStr($_Filename2, "|") <> 0 Then
     GUICtrlSetData($Input3, "浏览或拖曳一个文件到这里")
     MsgBox(16, "错误", "一次只能拖曳一个文件!", 5)
     GUICtrlSetData($Input3, $Filename2)
    Else
     GUICtrlSetData($Input3, $_Filename2)
     MD5B()
     $Filename = $_Filename2
    EndIf
   EndIf
 EndSwitch
WEnd
Func MD5A()
 MsgBox(0, 0, 'MD5A')
 GUICtrlSetData($Input2, "计算中,请稍等...")
 $FileHandle = FileOpen($_Filename, 16)
 $MD5CTX = _MD5Init()
 For $i = 1 To Ceiling(FileGetSize($_Filename) / $Buffersize)
  _MD5Input($MD5CTX, FileRead($FileHandle, $Buffersize))
 Next
 $Hash = _MD5Result($MD5CTX)
 FileClose($FileHandle)
 $Hash = StringTrimLeft($Hash, 2)
 $Hash = StringUpper($Hash)
 GUICtrlSetData($Input2, $Hash)
EndFunc   ;==>MD5A
Func MD5B()
 MsgBox(0, 0, 'MD5B')
 GUICtrlSetData($Input4, "计算中,请稍等...")
 $FileHandle = FileOpen($_Filename2, 16)
 $MD5CTX = _MD5Init()
 For $i = 1 To Ceiling(FileGetSize($_Filename2) / $Buffersize)
  _MD5Input($MD5CTX, FileRead($FileHandle, $Buffersize))
 Next
 $Hash = _MD5Result($MD5CTX)
 FileClose($FileHandle)
 $Hash = StringTrimLeft($Hash, 2)
 $Hash = StringUpper($Hash)
 GUICtrlSetData($Input4, $Hash)
EndFunc   ;==>MD5B

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 2金钱 +40 收起 理由
水木子 + 20 学习了!
afan + 20

查看全部评分

 楼主| 发表于 2010-6-13 23:22:22 | 显示全部楼层
本帖最后由 ferelove 于 2010-6-13 23:35 编辑

谢谢lynfr8元老 ,及各位朋友!
问题仍未解决。
当已经往Input里拖放了第1次,而且在未全选内容时,再往该Input拖放第2次(先拖曳一次,然后将光标定位到上次结果的某个位置中,再拖曳一次试试。),那么就会如图所示结果。
当整个界面中只有1个Input时,倒是处理很理想的,但,当有2个以上的Input时,处理效果没能达到预期效果。
能对Input1进行处理时,Input2却受影响,能对Input2进行处理时,Input1却受影响,彼此有干扰。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2010-6-13 23:44:53 | 显示全部楼层
拿到代码首先要分析代码的思路
从中学习到解决关键问题的方法
而不是这个代码是否解决了自己目前的问题
如果你真的读懂了代码
那么你肯定会明白为何会出现这种情况
发表于 2010-6-14 00:30:18 | 显示全部楼层
写了个简单例子
$Form1 = GUICreate('多输入框接受拖放例子', 400, 120, -1, -1, -1, 0x00000010) 
GUICtrlCreateInput('', 5, 5, 390, 20)
GUICtrlSetState(-1, 8)
GUICtrlCreateInput('', 5, 30, 390, 20)
GUICtrlSetState(-1, 8)
GUICtrlCreateInput('', 5, 55, 390, 20)
GUICtrlSetState(-1, 8)
GUISetState()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case -3
                        Exit
                Case -13 
                        $mouse = GUIGetCursorInfo($Form1)
                        $_str = ControlCommand($Form1, '', $mouse[4], 'GetSelected', '')
                        GUICtrlSetData($mouse[4], $_str)
        EndSwitch
WEnd
 楼主| 发表于 2010-6-14 01:45:00 | 显示全部楼层
一时心急,未领悟代码急于求成。非常感谢lynfr8元老的教导!问题得于解决。
感谢afan超版!一段代码让我见识和学习了更多的知识。
发表于 2010-6-15 15:23:40 | 显示全部楼层
回复 8# afan
您的-13 是怎么得来的啊?很好奇哦!
发表于 2010-6-15 15:41:18 | 显示全部楼层
回复 10# xuanfeng1234567

几个常用消息常量之一,就是 $GUI_EVENT_DROPPED
发表于 2010-6-15 15:51:53 | 显示全部楼层
回复 11# afan

-3是从前辈这里学到的,今天又学到了-13
发表于 2010-6-15 16:09:27 | 显示全部楼层
回复 11# afan
嘿嘿...又学到了点东西,但是不知道为什么他被定义为-13?
发表于 2010-6-15 16:24:12 | 显示全部楼层
本帖最后由 水木子 于 2010-6-15 16:32 编辑

回复 13# xuanfeng1234567

$GUI_EVENT_CLOSE  -3  对话框(窗口)正被关闭(相关按钮被点击或系统菜单项被选中).
$GUI_EVENT_MINIMIZE  -4  对话框(窗口)被最小化(窗口标题栏上的最小化按钮被点击)
$GUI_EVENT_RESTORE  -5  对话框(窗口)被还原(任务栏图标被点击)
$GUI_EVENT_MAXIMIZE  -6  对话框(窗口)被最大化(窗口标题栏上的最大化按钮被点击)
$GUI_EVENT_MOUSEMOVE  -7  鼠标光标被移动.  
$GUI_EVENT_PRIMARYDOWN  -8  鼠标的主要按钮被按下.(多指左键)
$GUI_EVENT_PRIMARYUP -9  鼠标的主要按钮被松开.(多指左键)  
$GUI_EVENT_SECONDARYDOWN  -10  鼠标的第二个按钮被按下.(多指右键)  
$GUI_EVENT_SECONDARYUP -11  鼠标的第二个按钮被松开.(多指右键)
$GUI_EVENT_RESIZED  -12  对话框大小改变.
$GUI_EVENT_DROPPED  -13  拖放(Drag&Drop)操作结束,@GUI_DRAGID, @GUI_DRAGFILE 和 @GUI_DROPID 将用于返回 ID/文件 相应的控件.

没测试,只是瞎猜的,不知道是不是这样。

评分

参与人数 1金钱 +20 收起 理由
afan + 20 就是这样 ^ ^

查看全部评分

发表于 2010-6-15 16:31:42 | 显示全部楼层
应该是吧,嘿嘿!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-16 19:38 , Processed in 0.092723 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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