找回密码
 加入
搜索
查看: 10470|回复: 17

[图形处理] 请帮我看看这面这段代码有什么错误(已解决)

  [复制链接]
发表于 2012-12-27 18:34:51 | 显示全部楼层 |阅读模式
本帖最后由 天之骄子 于 2012-12-28 11:15 编辑

这是一段U盘美化代码, 请帮我看看这面这段代码有什么错误,为什么单独执行 If $tubiao <> "" Then ....这一段可以复制指定的图标到U盘,而和If $beijing <> "" Then....这一段一块运行就只复制第二段的图片不复制第一段的图标呢,第一段的图标无法完成复制能?谢谢
另外,怎么实现设置背景时所有文件夹都有背景呢。
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>
#Include <Misc.au3>
#include <file.au3>
#include <array.au3>
#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("U盘美化精灵", 353, 268)
Global $PageControl1 = GUICtrlCreateTab(10, 50, 335, 210)
;第一页
Global $TabSheet1 = GUICtrlCreateTabItem("设置")
GUICtrlSetState(-1,$GUI_SHOW)
Global $Group1 = GUICtrlCreateGroup("", 21, 74, 310, 146);分组框
Global $Label1 = GUICtrlCreateLabel("选择U盘", 39, 98, 50, 18)
Global $Input1 = GUICtrlCreateInput("", 92, 94, 155, 22)
Global $Button1 = GUICtrlCreateButton("选择", 258, 93, 55, 23)
Global $Label2 = GUICtrlCreateLabel("U盘图标", 39, 127, 50, 18)
Global $Input2 = GUICtrlCreateInput("", 92, 123, 155, 22)
Global $Button2 = GUICtrlCreateButton("选择", 258, 123, 55, 23)
Global $Label3 = GUICtrlCreateLabel("U盘背景", 39, 156, 50, 18)
Global $Input3 = GUICtrlCreateInput("", 92, 152, 155, 22)
Global $Button3 = GUICtrlCreateButton("选择", 258, 152, 55, 23)
Global $Label4 = GUICtrlCreateLabel("文件名颜色", 39, 186, 60, 18)
Global $Input4 = GUICtrlCreateInput("", 102, 182, 145, 22)
Global $Button4 = GUICtrlCreateButton("选择", 258, 182, 55, 23)
Global $Button5 = GUICtrlCreateButton("U盘美化", 136, 228, 70, 23)
;第二页
Global $TabSheet2 = GUICtrlCreateTabItem("帮助")
Global $Group2 = GUICtrlCreateGroup("", 21, 74, 310, 172);分组框
Global $Label2_1 = GUICtrlCreateLabel(" "& @LF & "美化步骤:"& @LF & "1. 美化前需先选择要美化的U盘盘符"& @LF & "2. 选择U盘美化项目"& @LF & "3. 点击“U盘美化”进行美化,完成后出现完成提示。"& @LF & ""& @LF & "注意事项:"& @LF & "1. 图标必须为ICO格式"& @LF & "2. 背景图片必须为JPG格式"& @LF & "3. 图标、背景可以自定义,但需要转换为规定的格式。", 39, 80, 290, 150)
GUICtrlSetFont(-1, 9, 400, 0, "Arial")
GUICtrlCreateGroup("", -99, -99, 1, 1)
;第三页
Global $TabSheet3 = GUICtrlCreateTabItem("关于")
Global $Group3 = GUICtrlCreateGroup("", 21, 74, 310, 172) ;分组框
Global $Group4 = GUICtrlCreateGroup("", 100, 90, 160, 60) ;分组框
Global $Label1 = GUICtrlCreateLabel("U盘美化精灵", 122, 98, 130, 30)
GUICtrlSetFont(-1, 15, 400, 0, "Arial")
GUICtrlSetColor(-1, 0x000080) 
Global $Label1 = GUICtrlCreateLabel("版本:V1.0 ", 150, 132, 100, 18)
GUICtrlSetFont(-1, 9, 400, 0, "Arial")
GUICtrlCreateTabItem("")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
Local $xuanze = FileSelectFolder("请选择U盘盘符","")
GUICtrlSetData($Input1, $xuanze)
Case $Button2
Dim $szDrive, $szDir, $szFName, $szExt
Local $xuanzetubiao = FileOpenDialog("请选择U盘图标", @ScriptDir & "\tubiao", "图像文件 (*.ico)", 1 ) ;读取图标 
Local $TestPath = _PathSplit($xuanzetubiao, $szDrive, $szDir, $szFName, $szExt);拆分文件路径和文件名
GUICtrlSetData($Input2, $szFName & $szExt )
Case $Button3
Dim $szDrive, $szDir, $szFName, $szExt
Local $xuanzebeijing = FileOpenDialog("请选择U盘背景图片", @ScriptDir & "\beijing", "图像文件 (*.jpg)", 1 )
Local $TestPath = _PathSplit($xuanzebeijing, $szDrive, $szDir, $szFName, $szExt);拆分文件路径和文件名
GUICtrlSetData($Input3, $szFName & $szExt )
Case $Button4
Dim $iReturnType,$iColorRef,$iRefType,$hWndOwnder
Local $xuanzeyanse = _ChooseColor($iReturnType = 0 , $iColorRef = 0 , $iRefType = 0 , $hWndOwnder = 0);打开颜色选择框
GUICtrlSetData($Input4, $xuanzeyanse);读取颜色,并写入到$Input5显示框
Case $Button5;执行美化
$lujing = GUICtrlRead($input1) 
$tubiao = GUICtrlRead($input2)
$beijing = GUICtrlRead($input3) 
$yanse = GUICtrlRead($input4) 
If $tubiao <> "" Then
IniWrite("" & $lujing & "\autorun.inf", "autorun", "ICON" , $tubiao) ;将参数写入到配置文件 
FileCopy ($tubiao, $lujing , 0 ) ;移动文件到U盘 
FileSetAttrib("" & $lujing & "\autorun.inf", "+RHA" , 0) 
FileSetAttrib($lujing & "" & $tubiao, "+RHA" , 0) 
EndIf 
If $beijing <> "" Then
IniWrite("" & $lujing & "\desktop.ini", "ExtShellFolderViews", "{BE098140-A513-11D0-A3A4-00C04FD706EC}", "{BE098140-A513-11D0-A3A4-00C04FD706EC}" ) ;将参数写入到配置文件
IniWrite("" & $lujing & "\desktop.ini", "{BE098140-A513-11D0-A3A4-00C04FD706EC}", "Attributes", 1) ;将参数写入到配置文件
IniWrite("" & $lujing & "\desktop.ini", "{BE098140-A513-11D0-A3A4-00C04FD706EC}", "IconArea_Image" , $beijing ) ;将参数写入到配置文件
FileCopy ( $beijing, $lujing , 0 ) ;移动文件到U盘
FileSetAttrib("" & $lujing & "\desktop.ini", "+HA" , 0) 
FileSetAttrib( $lujing & "" & $beijing, "+HA" , 0) 
EndIf
If $yanse <> "" Then 
IniWrite("" & $lujing & "\desktop.ini", "ExtShellFolderViews", "{BE098140-A513-11D0-A3A4-00C04FD706EC}", "{BE098140-A513-11D0-A3A4-00C04FD706EC}" ) ;将参数写入到配置文件
IniWrite("" & $lujing & "\desktop.ini", "{BE098140-A513-11D0-A3A4-00C04FD706EC}", "IconArea_Text" , $yanse ) ;将参数写入到配置文件 
FileSetAttrib("" & $lujing & "\desktop.ini", "+HA" , 0) 
EndIf

MsgBox(0, "提示", "已完成U盘美化!")
EndSwitch
WEnd
发表于 2012-12-27 18:59:07 | 显示全部楼层
回复 1# 天之骄子


    http://baike.baidu.com/view/676737.htm
 楼主| 发表于 2012-12-27 19:08:59 | 显示全部楼层
回复 2# annybaby

能帮我看看 为什么这段代码单独执行76行:If $tubiao <> "" Then ....这一段可以复制指定的图标到U盘,而和82行:If $beijing <> "" Then....这一段一起运行的话,就只复制第二段的图片不复制第一段的图标呢,第一段的图标无法完成复制呢?
发表于 2012-12-27 20:31:48 | 显示全部楼层
回复 3# 天之骄子

因为你前面做了一件非常多余的事~~
 楼主| 发表于 2012-12-27 21:33:58 | 显示全部楼层
回复 4# annybaby


    能指点一下哪不对,该怎么改吗?谢谢
发表于 2012-12-27 22:10:31 | 显示全部楼层
回复 5# 天之骄子

这个问题很隐蔽,所以我估计不是所有人都想得明白
给你说个方向,希望你可以自己摸索出:
一.代码先不用改,你试着把选择背景和选择图标两个动作反过来,然后测试一下,你发现什么了??
二.把图标和背景图片放在同一目录下,再测试,你又发现什么了?是不是两个都可以了??
三.从一/二中,你应该已经明白原因及解决的方法~~
 楼主| 发表于 2012-12-27 22:13:11 | 显示全部楼层
回复 6# annybaby

好的,我试试,真的太感谢您了!
 楼主| 发表于 2012-12-27 22:33:06 | 显示全部楼层
本帖最后由 天之骄子 于 2012-12-27 22:53 编辑

回复 7# 天之骄子

您好!我试了下,问题出现在,复制执行的都是后选择的那个图标或图片背景,把图标和图片放到一块后,就没问题了,可这是什么原因呢
发表于 2012-12-27 23:08:59 | 显示全部楼层
回复 8# 天之骄子

晕,你"领悟"出来的和我在6楼说的没啥区别哦,想一想两种情况有什么区别,会导致哪些变量改变??然后在哪些地方插入调试信息来观察变量的改变,从而找到导致问题产生的原因,只有找到了原因,才能找到彻底解决问题的方法~~
 楼主| 发表于 2012-12-28 11:05:45 | 显示全部楼层
回复 9# annybaby

谢谢您,我从论坛查了相关的调试方法,看的不是很懂,我用MsgBox测试图标和背景两个变量,显示的都是相应的文件名,没有路径不知道这样调试对吗?我试着把代码改成下面的这样就可以了。谢谢您!
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Button1
                        Local $xuanze = FileSelectFolder("请选择U盘盘符","")
                        GUICtrlSetData($Input1, $xuanze)
                Case $Button2
                        Dim $szDrive, $szDir, $szFName, $szExt
                        Local $xuanzetubiao = FileOpenDialog("请选择U盘图标", @ScriptDir & "\tubiao", "图像文件 (*.ico)", 1 )  ;读取图标         
            GUICtrlSetData($Input2, $xuanzetubiao )                        
                Case $Button3
                        Dim $szDrive, $szDir, $szFName, $szExt
                        Local $xuanzebeijing = FileOpenDialog("请选择U盘背景图片", @ScriptDir & "\beijing", "图像文件 (*.jpg)", 1 )
                        GUICtrlSetData($Input3, $xuanzebeijing )
                Case $Button4
                        Dim $iReturnType,$iColorRef,$iRefType,$hWndOwnder
                        Local $xuanzeyanse = _ChooseColor($iReturnType = 0 , $iColorRef = 0 , $iRefType = 0 , $hWndOwnder = 0);打开颜色选择框
            GUICtrlSetData($Input4, $xuanzeyanse);读取颜色,并写入到$Input5显示框
                Case $Button5;执行美化
                        $lujing = GUICtrlRead($input1) 
                        $tubiao = GUICtrlRead($input2)
                        $beijing = GUICtrlRead($input3)        
                        $yanse = GUICtrlRead($input4)        
                                        If $tubiao <> "" Then
                                            Local $TestPathtubiao = _PathSplit($tubiao, $szDrive, $szDir, $szFName, $szExt);拆分文件路径和文件名
                                    IniWrite("" & $lujing & "\autorun.inf", "autorun", "ICON" , $szFName & $szExt)   ;将参数写入到配置文件                                                
                                                FileCopy ($tubiao, $lujing , 0 ) ;移动文件到U盘                
                                                FileSetAttrib("" & $lujing & "\autorun.inf", "+RHA" , 0) 
                                                FileSetAttrib($lujing & "" & $szFName & $szExt, "+RHA" , 0)                                                 
                        EndIf                                
                                        If $beijing <> "" Then
                                                Local $TestPathbeijing = _PathSplit($beijing, $szDrive, $szDir, $szFName, $szExt);拆分文件路径和文件名
                                                IniWrite("" & $lujing & "\desktop.ini", "ExtShellFolderViews", "{BE098140-A513-11D0-A3A4-00C04FD706EC}", "{BE098140-A513-11D0-A3A4-00C04FD706EC}" )   ;将参数写入到配置文件
                                    IniWrite("" & $lujing & "\desktop.ini", "{BE098140-A513-11D0-A3A4-00C04FD706EC}", "Attributes", 1)   ;将参数写入到配置文件
                                            IniWrite("" & $lujing & "\desktop.ini", "{BE098140-A513-11D0-A3A4-00C04FD706EC}", "IconArea_Image" , $szFName & $szExt)   ;将参数写入到配置文件
                                                FileCopy ($beijing, $lujing , 0 ) ;移动文件到U盘        
                                                FileSetAttrib("" & $lujing & "\desktop.ini", "+HA" , 0) 
                                                FileSetAttrib( $lujing & "" & $szFName & $szExt, "+HA" , 0) 
                        EndIf
                                    If $yanse <> "" Then                                                
                                            IniWrite("" & $lujing & "\desktop.ini", "ExtShellFolderViews", "{BE098140-A513-11D0-A3A4-00C04FD706EC}", "{BE098140-A513-11D0-A3A4-00C04FD706EC}" )   ;将参数写入到配置文件
                                                IniWrite("" & $lujing & "\desktop.ini", "{BE098140-A513-11D0-A3A4-00C04FD706EC}", "IconArea_Text" , $yanse )   ;将参数写入到配置文件                                                
                                                FileSetAttrib("" & $lujing & "\desktop.ini", "+HA" , 0) 
                    EndIf
                                        
                        MsgBox(0, "提示", "已完成U盘美化!")
        EndSwitch
WEnd
发表于 2012-12-28 11:33:42 | 显示全部楼层
回复 10# 天之骄子

非常不错,虽然没有弄明白原因,但至少你找到了解决方法~~
应该很喜欢这个探索的过程吧??掌握解决未知问题的方法才是最重要的~
 楼主| 发表于 2012-12-28 12:44:34 | 显示全部楼层
回复 11# annybaby

嗯,谢谢您,能解释一下原因吗?及如果程序不能正常运行该怎么查找原因和调试吗?我初学AU3,在很多方面存在欠缺,谢谢您
发表于 2012-12-28 13:05:06 | 显示全部楼层
回复 12# 天之骄子

根本的原因是函数
FileOpenDialog()
会改变当前工作目录(什么东东来的??查看这个宏就知道了
@WorkingDir
)

你可以把这个宏插到你代码当中的FileOpenDialog前后部分,通过msgbox(0,'当前工作目录',@WorkingDir)来查看就应该可以明白了~~
所以图标和背景哪一个后选择,工作目录就被改成后者的了,而你下面FileCopy函数里直接使用了文件名(没有带路径),所以只有后面的文件可以复制到,当然两个文件放在同一个目录下时,@WorkingDir是同一个,所以两个都可以复制

修改后的代码你改成了全路径的,所以工作目录改变了,但程序还是可以找到,故可以成功复制~~
希望你可以理解
发表于 2012-12-28 13:16:06 | 显示全部楼层
回复 12# 天之骄子

所以我最前面也说了你做了一件很多余的事:就是把几个输入框的值设置成了你拆分后的文件名,直接把FileOpenDialog返回值设置上去就可以了,后面的工作目录再怎么变都不会有问题,在文件复制时使用全路径也可以
直接使用(非针对本帖)
FileCopy('文件名','xxx')等函数时,除非程序非常简单,不然我是建议使用
FileCopy(@scriptdir&'\文件名','xxx')来代替上面的,因为上面的会随着工作目录改变而改变,但很多时候,我们可能会没有注意到程序跑到什么位置会改变工作目录及改变成哪里了!~~

当然,这只是一个建议

评分

参与人数 1金钱 +30 贡献 +2 收起 理由
afan + 30 + 2

查看全部评分

 楼主| 发表于 2012-12-28 13:28:12 | 显示全部楼层
回复 14# annybaby

谢谢您的指点,不但使我的问题得到了解决,更重要的是让我学会了解决问题的方法。所以在此真诚的谢谢您!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-22 23:44 , Processed in 0.105550 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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